Section courante

A propos

Section administrative du site

Le jeu Tours d'Hanois consiste a déplacer les pneus sur trois bâtons sans jamais les déplacé sur un pneu plus petit. Ce principe fort simple risque pourtant de pousser le joueur à creuser sa logique, en effet, on aurait bien besoin d'un quatrième poteau parfois pour solution le problème plus rapidement.

Le code du jeu se résume en quelques étapes, on dessine les 3 tours avec les pneus et on demande au jour de choisir de poteau on doit prendre le pneu et vers quel poteau on doit le déplacer. On utilise le tableau A pour connaître l'état des 7 pneus sur le poteau. On vérifie si l'utilisateur fournit une réponse valide correspondant à l'un des trois poteau à l'aide de la fonction ChkOk. On test à la fin si le poteau 1 (A[1,0]) ou le poteau 3 (A[3,0]) contient la valeur 7, soit qu'il contient tout les pneus et qu'il a ainsi gagné.


L'exemple de jeu Tours d'Hanois suivant est développé en Turbo Pascal 7 et fonctionne également sous Free Pascal. Voici le code source en Turbo Pascal du jeu :

  1. Program Hanois;
  2.  
  3. Uses Crt;
  4.  
  5. Procedure Main;
  6. Const
  7.  C:Array[1..7]of Char=
  8.  {$IFDEF FPC}
  9.   '======='
  10.  {$ELSE}
  11.   Char(177)+Char(177)+Char(177)+Char(177)+Char(177)+Char(177)+Char(177)
  12.  {$ENDIF};
  13.  C2:Array[1..7]of Char=
  14.  {$IFDEF FPC}
  15.   '======='
  16.  {$ELSE}
  17.   Char(178)+Char(178)+Char(178)+Char(178)+Char(178)+Char(178)+Char(178)
  18.  {$ENDIF};
  19.  XD:Array[1..3]of Byte=(9,25,41);
  20. Var
  21.  A:Array[1..3,0..8]of Byte;
  22.  I:Byte;
  23.  T,F,N:Integer;
  24.  K:Word;
  25.  
  26. Procedure Update;
  27. Var
  28.  J,X,Y,Z:Byte;
  29. Begin
  30.  I:=0;
  31.  For Y:=15downto 8do Begin
  32.   Inc(I);
  33.   For X:=1to 3do Begin
  34.    Z:=A[X,I];
  35.    If Z=0Then Begin
  36.     GotoXY(XD[X]-7,Y); Write(' ':7,{$IFDEF FPC}'I'{$ELSE}Chr(219){$ENDIF},' ':7);
  37.    End
  38.     Else
  39.    For J:=XD[X]-Z to XD[X]+Z do Begin
  40.     GotoXY(J,Y);
  41.     If Odd(Z)Then Write(C[Z])
  42.              Else Write(C2[Z]);
  43.    End;
  44.   End;
  45.  End;
  46. End;
  47.  
  48. Function ChkOk(R:Byte):Boolean;Begin
  49.  ChkOk:=True; I:=Byte(K)-Byte('0');
  50.  If I in [1..3]Then Begin
  51.   If R=1Then F:=I Else T:=I;
  52.   Write(Char(K));
  53.   GotoXY(10,20);
  54.   Write(' ':30);
  55.  End
  56.   Else
  57.  Begin
  58.   GotoXY(10,20);
  59.   Write('Répondre 1, 2 ou 3 S.V.P.');
  60.   ChkOk:=False;
  61.  End;
  62. End;
  63.  
  64. Begin
  65.  FillChar(A,SizeOf(A),0);
  66.  N:=1; A[2,0]:=7; For I:=1to 7do A[2,I]:=8-I;
  67.  TextMode(CO80);
  68.  TextColor(7);
  69.  TextBackground(0);
  70.  ClrScr;
  71.  GotoXY(13,1);
  72.  Write('Tours d''Hanois');
  73.  TextColor(0);
  74.  TextBackground(2);
  75.  GotoXY(1,16);
  76.  WriteLn(' ':8,'1',' ':15,'2',' ':15,'3',' ':8);
  77.  TextBackground(0);
  78.  TextColor(7);
  79.  Repeat
  80.   Update;
  81.   GotoXY(1,18);
  82.   Write('Coup:',N);
  83.   ClrEol;
  84.   GotoXY(12,18);
  85.   Write('Votre Jeu - De:');
  86.   Repeat
  87.    K:=Byte(ReadKey);
  88.    If K=0Then K:=(K shl 8) or Byte(ReadKey);
  89.    If K=27Then Exit;
  90.   Until ChkOk(1);
  91.   GotoXY(30,18);
  92.   Write(' .:');
  93.   Repeat
  94.    K:=Byte(ReadKey);
  95.    If K=0Then K:=(K shl 8) or Byte(ReadKey);
  96.    If K=27Then Exit;
  97.   Until ChkOk(2);
  98.   GotoXY(10,20);
  99.   If A[T,0]<>0Then Begin
  100.    If Not((A[F,0]>0)and(A[F,A[F,0]]<A[T,A[T,0]]))Then Begin
  101.     Write('Coup illégal! Recommencez');
  102.     Continue;
  103.    End;
  104.   End
  105.    Else
  106.   Write(' ':30);
  107.   Inc(A[T,0]); A[T,A[T,0]]:=A[F,A[F,0]];
  108.   A[F,A[F,0]]:=0; Dec(A[F,0]); Inc(N);
  109.   If(A[1,0]=7)or(A[3,0]=7)Then Begin
  110.    Update;
  111.    GotoXY(1,19);
  112.    Write('Félicitations - Il t''a fallu ',N-1,' coups');
  113.    Exit;
  114.   End;
  115.  Until False;
  116. End;
  117.  
  118. BEGIN
  119.  Main;
  120. END.
  121.  

Code source

Voici le code source du jeu sur GitHub :

Lien Langage de programmation Projet
https://github.com/gladir/7iles/blob/main/HANOIS.PAS Turbo Pascal, Free Pascal 7iles


Dernière mise à jour : Jeudi, le 28 juillet 2022