Section courante

A propos

Section administrative du site

Voici un petit jeu que j'ai inventé lorsque j'étais enfant. Le but du jeu est de remplir 25 cases (5 x 5) en se déplaçant comme un cheval au échec sans jamais touchés deux fois la même case.

Le code source QuickPascal du jeu:

  1. Program L25;
  2.  
  3. Uses Crt,MSGraph;
  4.  
  5. Label
  6.  Gagne,10,20,13,560;
  7. Const
  8.  StartX=115;
  9. Var
  10.  XPosition:Byte;
  11.  YPosition:Byte;
  12.  A,B:Byte;
  13.  Erreur:Integer;
  14.  TypeCase:Byte;
  15.  Quitte:Boolean;
  16.  Nombre:Byte;
  17.  TableauL25:Packed Array[1..5,1..5] of Byte;
  18.  TableauCase:Packed Array[0..2000] of Byte;
  19.  Touche:Word;
  20.  
  21.  Procedure AfficheCase(XPosition,YPosition,Couleur:Byte);Begin
  22.   If((Couleur=0)and(((XPosition + YPosition * 5) Mod 2)=0))Then Couleur := 3;
  23.   _SetColor(Couleur);
  24.   _Ellipse(_GFillInterior,StartX+3+16*XPosition,53+16*YPosition,StartX+12+16*XPosition,62+16*YPosition);
  25.  End;
  26.  
  27. BEGIN { Main L 2 5 }
  28.  Erreur:=_SetVideoMode(_MRes16Color);
  29.  For A := 1 to 5 do For B := 1 to 5 do TableauL25[A,B] := 0;
  30.  _SetTextPosition(1,16);
  31.  _SetColor(5);
  32.  _OutText('L 2 5');
  33.  TypeCase := 0;
  34.  For XPosition := 0 to 4 do Begin
  35.   For YPosition := 0 to 4 do Begin
  36.    If(TypeCase=0)Then Begin
  37.     _SetColor(3);
  38.     _Rectangle(3,StartX+XPosition*16,50+YPosition*16,StartX+15+XPosition*16,65+YPosition*16);
  39.     _SetColor(1);
  40.     _Rectangle(2,StartX+XPosition*16,50+YPosition*16,StartX+15+XPosition*16,65+YPosition*16);
  41.    End
  42.     else
  43.    Begin
  44.     _SetColor(0);
  45.     _Rectangle(3,StartX+XPosition*16,50+YPosition*16,StartX+15+XPosition*16,65+YPosition*16);
  46.    End;
  47.    TypeCase := (TypeCase + 1) and 1;
  48.   End;
  49.  End;
  50.  Quitte:=False;
  51.  XPosition:=0;
  52.  YPosition:=0;
  53.  Nombre:=1;
  54.  A:=0;
  55.  B:=0;
  56.  TableauL25[1,1]:=1;
  57.  TypeCase:=0;
  58.  AfficheCase(0,0,1);
  59.  Repeat
  60.   Repeat
  61.    _GetImage(StartX+XPosition*16,50+YPosition*16,StartX+15+XPosition*16,65+YPosition*16,TableauCase);
  62.    Erreur:=0;
  63.    Repeat
  64.     Erreur := (Erreur + 1) and $FFF;
  65.     If(Erreur=1)Then Begin
  66.      _PutImage(StartX+XPosition*16,50+YPosition*16,TableauCase,_GPreset);
  67.     End;
  68.     If(Erreur=$8FF)Then Begin
  69.      _PutImage(StartX+XPosition*16,50+YPosition*16,TableauCase,_GPset);
  70.     End;
  71.     If((TypeCase > 0)and(Erreur=$FFF))Then Begin
  72.      Inc(TypeCase);
  73.      If(TypeCase=6)Then Begin
  74.       TypeCase := 0;
  75.      End;
  76.     End;
  77.    Until KeyPressed;
  78.    Touche:=Byte(ReadKey);
  79.    If Touche=0 Then Touche:=Byte(ReadKey) shl 8;
  80.    _PutImage(StartX+XPosition*16,50+YPosition*16,TableauCase,_GPset);
  81.    TypeCase:=1;
  82.    Case Hi(Touche) of
  83.     72: If(YPosition>0)Then Dec(YPosition) else YPosition := 4;
  84.     75: If(XPosition>0)Then Dec(XPosition) else XPosition := 4;
  85.     77: If(XPosition<4)Then Inc(XPosition) else XPosition := 0;
  86.     80: If(YPosition<4)Then Inc(YPosition) else YPosition := 0;
  87.    End;
  88.    If(Lo(Touche)=27)Then Begin
  89.     _SetTextPosition(24,1);
  90.     _SetColor(5);
  91.     _OutText('Vous avez abandonne!');
  92.     Halt(0);
  93.    End;
  94. 13:If(Lo(Touche)=13)Then Begin
  95.     If(TableauL25[XPosition+1,YPosition+1]=1)Then Touche := 0;
  96.     If Not((((A+1=XPosition+1-1)or(A+1=XPosition+1+1))and((B+1=YPosition+1-2)or(B+1=YPosition+1+2)))or
  97.    (((A+1=XPosition+1-2)or(A+1=XPosition+1+2))and((B+1=YPosition+1-1)or(B+1=YPosition+1+1))))Then Touche := 0;
  98.    End;
  99.   Until Lo(Touche) = 13;
  100.   If((XPosition+1=1)and(YPosition+1=1)AND(TableauL25[2,3]=1)AND(TableauL25[3,2]=1))Then Goto 560;
  101.   If((XPosition+1=1)and(YPosition+1=2)AND(TableauL25[3,1]=1)AND(TableauL25[3,3]=1)AND(TableauL25[2,4]=1))THEN Goto 560;
  102.   If((XPosition+1=1)and(YPosition+1=3)AND(TableauL25[2,1]=1)AND(TableauL25[2,5]=1)AND
  103.     (TableauL25[3,2]=1)AND(TableauL25[3,4]=1))THEN Goto 560;
  104.   If((XPosition+1=1)and(YPosition+1=4)AND(TableauL25[2,2]=1)AND(TableauL25[3,3]=1)AND
  105.     (TableauL25[3,5]=1))THEN Goto 560;
  106.   If((XPosition+1=1)and(YPosition+1=5)AND(TableauL25[2,3]=1)AND(TableauL25[3,4]=1))THEN Goto 560;
  107.   If((XPosition+1=2)and(YPosition+1=1)AND(TableauL25[1,3]=1)AND(TableauL25[3,3]=1)AND
  108.   (TableauL25[4,2]=1))Then Goto 560;
  109.   If((XPosition+1=2)and(YPosition+1=2)AND(TableauL25[1,4]=1)AND(TableauL25[3,4]=1)AND
  110.   (TableauL25[4,1]=1)AND(TableauL25[4,3]=1))Then Goto 560;
  111.   If((XPosition+1=2)and(YPosition+1=3)AND(TableauL25[1,1]=1)AND(TableauL25[1,5]=1)AND
  112.   (TableauL25[3,1]=1)AND(TableauL25[3,5]=1)AND(TableauL25[4,2]=1)AND(TableauL25[4,4]=1))THEN Goto 560;
  113.   If((XPosition+1=2)and(YPosition+1=4)AND(TableauL25[1,2]=1)AND(TableauL25[3,2]=1)AND
  114.   (TableauL25[4,3]=1)AND(TableauL25[4,5]=1))Then Goto 560;
  115.   If((XPosition+1=2)and(YPosition+1=5)AND(TableauL25[1,3]=1)AND(TableauL25[3,3]=1)AND
  116.   (TableauL25[4,4]=1))Then Goto 560;
  117.   If((XPosition+1=3)and(YPosition+1=1)AND(TableauL25[1,2]=1)AND(TableauL25[2,3]=1)AND
  118.   (TableauL25[4,3]=1)AND(TableauL25[5,2]=1))Then Goto 560;
  119.   If((XPosition+1=3)and(YPosition+1=2)AND(TableauL25[1,1]=1)AND(TableauL25[1,3]=1)AND
  120.   (TableauL25[2,4]=1)AND(TableauL25[4,4]=1)AND(TableauL25[5,1]=1)AND(TableauL25[5,3]=1))THEN Goto 560;
  121.   If((XPosition+1=3)and(YPosition+1=3)AND(TableauL25[1,2]=1)AND(TableauL25[1,4]=1)AND
  122.     (TableauL25[2,1]=1)AND(TableauL25[2,5]=1)AND(TableauL25[4,1]=1)AND
  123.     (TableauL25[4,5]=1)AND(TableauL25[5,2]=1)AND(TableauL25[5,4]=1))THEN Goto 560;
  124.   If((XPosition+1=3)and(YPosition+1=4)AND(TableauL25[1,3]=1)AND(TableauL25[1,5]=1)AND
  125.   (TableauL25[2,2]=1)AND(TableauL25[4,2]=1)AND(TableauL25[5,3]=1)AND(TableauL25[5,5]=1))THEN Goto 560;
  126.   If((XPosition+1=3)and(YPosition+1=5)AND(TableauL25[1,4]=1)AND(TableauL25[2,3]=1)AND
  127.   (TableauL25[4,3]=1)AND(TableauL25[5,4]=1))THEN Goto 560;
  128.   If((XPosition+1=4)and(YPosition+1=1)AND(TableauL25[2,2]=1)AND(TableauL25[3,3]=1)AND
  129.   (TableauL25[5,3]=1))Then Goto 560;
  130.   If((XPosition+1=4)and(YPosition+1=2)AND(TableauL25[2,1]=1)AND(TableauL25[2,3]=1)AND
  131.   (TableauL25[3,4]=1)AND(TableauL25[5,4]=1))THEN Goto 560;
  132.   If((XPosition+1=4)and(YPosition+1=3)AND(TableauL25[2,2]=1)AND(TableauL25[2,4]=1)AND
  133.   (TableauL25[3,1]=1)AND(TableauL25[3,5]=1)AND(TableauL25[5,1]=1)AND(TableauL25[5,5]=1))THEN Goto 560;
  134.   If((XPosition+1=4)and(YPosition+1=4)AND(TableauL25[2,3]=1)AND(TableauL25[2,5]=1)AND
  135.   (TableauL25[3,2]=1)AND(TableauL25[5,2]=1))THEN Goto 560;
  136.   If((XPosition+1=4)and(YPosition+1=5)AND(TableauL25[2,4]=1)AND(TableauL25[3,3]=1)AND
  137.   (TableauL25[5,3]=1))Then Goto 560;
  138.   If((XPosition+1=5)and(YPosition+1=1)AND(TableauL25[3,2]=1)AND(TableauL25[4,3]=1))THEN Goto 560;
  139.   If((XPosition+1=5)and(YPosition+1=2)AND(TableauL25[3,1]=1)AND(TableauL25[3,3]=1)AND
  140.   (TableauL25[4,4]=1))Then Goto 560;
  141.   If((XPosition+1=5)and(YPosition+1=3)AND(TableauL25[3,2]=1)AND(TableauL25[3,4]=1)AND
  142.   (TableauL25[4,1]=1)AND(TableauL25[4,5]=1))THEN Goto 560;
  143.   If((XPosition+1=5)and(YPosition+1=4)AND(TableauL25[3,3]=1)AND(TableauL25[3,5]=1)AND
  144.   (TableauL25[4,2]=1))Then Goto 560;
  145.   If((XPosition+1=5)and(YPosition+1=5)AND(TableauL25[3,4]=1)AND(TableauL25[4,3]=1))Then Goto 560;
  146.   Inc(Nombre);
  147.   AfficheCase(A,B,1);
  148.   AfficheCase(XPosition,YPosition,2);
  149.   TableauL25[XPosition+1,YPosition+1] := 1;
  150.   A := XPosition;
  151.   B := YPosition;
  152.   IF(Nombre>24)Then Begin
  153. Gagne:
  154.    _SetTextPosition(24,1);
  155.    _SetColor(5);
  156.    _OutText('Tu as gagner!');
  157.    Halt(1);
  158.   End;
  159.  Until (Quitte);
  160. 560:
  161.  AfficheCase(A,B,1);
  162.  AfficheCase(XPosition,YPosition,2);
  163.  If(Nombre = 24)Then Goto Gagne;
  164.  _SetTextPosition(24,1);
  165.  _SetColor(5);
  166.  _OutText('Vous avez perdue.');
  167. END.

Solution

Voici une des solutions gagnant, la technique en losange:

1 14 9 20 3
24 19 2 15 10
13 8 25 4 21
18 23 6 11 16
7 12 17 22 5

Code source

Voici le code source du jeu sur GitHub :

Lien Langage de programmation Projet
https://github.com/gladir/quickpascal_l25/blob/main/L25.PAS Quick Pascal quickpascal_l25


Dernière mise à jour : Dimanche, le 4 mai 2014