L'un des plus grand classique des jeux, c'est le jeu Tic-Tac-Toe, consistant à remplir des cases avec un symbole de O ou X avant le joueur adverse, a été écrit dans de nombreux langages de programmation, mais très peu de version existe en Turbo Pascal.
Pourtant, il s'agit d'un des jeux les plus simples a produire, sauf bien sure si vous voulez jouer contre l'ordinateur, alors les choses sont complexes. Ainsi, la plupart des jeux vise uniquement de faire jouer 2 humains l'autre contre l'autre. Mais cette option est peu pratique si vous n'êtes qu'un seul utilisateur.
Contrairement à la plupart des autres jeux vidéos, pour développez un jeu de Tic-Tac-Toe, vous n'avez pas besoin d'autre chose qu'un écran de texte. Ainsi, il s'agit d'un jeu que vous pourriez développez facilement en BASIC ou sur une machine ancienne, voir même un terminal ou sur un vieux VAX. En autre, pour appuyer ses dires, sachez que dès 1974, l'auteur David H. Ahl, dans son livre «101 BASIC Computer Games», avait déjà proposé un exemple de jeu de Tic-Tac-Toe.
Tout d'abord, il faut demander à l'utilisateur pour déterminer si c'est l'humain ou l'ordinateur devant commencé. Le fait de faire choisir le premier joueur aura un impacte par la suite dans la stratégie de l'ordinateur, car s'il commence, il visera l'attaque, tandis que s'il joue en deuxième il sera désavantagé et jouera en défensive.
Ensuite, on initialisera le tableau, nommé Board, avec des valeurs 0. Noté, que le tableau à une seule dimension et que les valeurs sont situés entre 0 et 8, correspondant à chacun des cases du tableau. Ainsi, la position 0, correspondra à la première colonne et première ligne, ensuite, la position 1, correspondra à la deuxième colonne, première ligne, jusqu'à la position 8, correspondant à la troisième colonne et troisième ligne.
Parmi les routines qu'on retrouve dans le programme, il y a bien sur ShowBoard, permettant de dessiner le tableau du Tic-Tac-Toe avec les positions actuelles de chacune des X ou O que les joueurs ont inscrits. Il ne s'agit pas d'une tâche complexe, il suffit simplement d'avoir deux boucles pour afficher chacune des coordonnées X et Y dans l'intervalle de 1 à 3. Ensuite, il faut vérifier la valeur du tableau, nommé Board, contenant la valeur 0 pour aucune marque, 1 pour l'humain, et 2 pour l'ordinateur.
Une routine non négligeable, nommé CheckIfWin, consiste à vérifier, si l'ordinateur ou le joueur à réussis à gagner. Le principe est simple, il faut vérifier si 3 chiffres identiques sont disposés sur une même ligne, une même colonne ou en diagonale.
Le problème le plus complexe réside dans le fait de faire jouer l'ordinateur. Dans un jeu de 3 cases par 3 cases, le nombre de possibilité de réponse d'un ordinateur est relativement limité. A vrai, dire, le nombre de choix est tellement limité, que contrairement à des jeux ayant des tailles de 4, 5 ou 6 cases, qu'il est préférable de lui apprendre par coeur les bonnes réponses plutôt que de chercher des formules complexes. Par conséquent, on se contentera de faire vérifier l'ordinateur s'il n'a pas déjà deux cases de prête et une troisième à venir pour pouvoir gagné. Ensuite, on cherchera les meilleures coups en fonction du nombre de coup ayant déjà été jouer, les 1 et 2 coups sont assez crucial dans le résultat de la partie. Enfin, on lui demandera de cherchez à trouver un coup défensif afin d'empêcher l'autre joueur d'avoir 3 cases de suites. Avec ces 3 niveaux de résolutions de problèmes, on arrivera la plupart du temps à avoir un joueur de Tic-Tac-Toe pouvant rivaliser avec un humain peu expérimenté.
L'exemple de jeu Tic-Tac-Toe suivant est développé en Turbo Pascal 7 et fonctionne également sous Free Pascal. Voici le code source en Turbo Pascal du jeu :
- Program TTT;
-
- Uses CRT;
-
- Var
- Board:Array[0..8]of Byte;
- Beginner:(Human,Computer);
-
- Procedure InitGame;Begin
- ClrScr;
- GotoXY(34,1);
- WriteLn('Tic-Tac-Toe');
- WriteLn;
- TextColor(LightRed);
- Write(' O');
- TextColor(7);
- WriteLn(' = Ordinateur');
- TextColor(LightGreen);
- Write(' X');
- TextColor(7);
- WriteLn(' = Humain (vous)');
- FillChar(Board,SizeOf(Board),0);
- End;
-
- Procedure ChoiceBeginner;
- Var
- K:Char;
- Begin
- GotoXY(1,6);
- Write('Quel joueur commence (O=Moi/X=Vous) ?');
- K:=ReadKey;
- If UpCase(K)='O'Then Beginner:=Computer Else
- If UpCase(K)='X'Then Beginner:=Human;
- GotoXY(1,6);
- ClrEol;
- End;
-
- Procedure ShowBoard;
- Var
- I,J:Byte;
- Begin
- GotoXY(1,6);
- For J:=0 to 2 do Begin
- Write(' ':8,'+');
- For I:=0 to 2 do Begin
- Write('---');
- Write('+');
- End;
- WriteLn;
- Write(' ':8,'|');
- For I:=0 to 2 do Begin
- Write(I+J*3+1:3);
- Write('|');
- End;
- WriteLn;
- Write(' ':8,'|');
- For I:=0 to 2 do Begin
- Case Board[I+J*3]of
- 1:Begin
- TextColor(LightGreen);
- Write(' X ');
- TextColor(7);
- End;
- 2:Begin
- TextColor(LightRed);
- Write(' O ');
- TextColor(7);
- End;
- Else Write(' ':3);
- End;
- Write('|');
- End;
- WriteLn;
- End;
- Write(' ':8,'+');
- For I:=0 to 2 do Begin
- Write('---');
- Write('+');
- End;
- WriteLn;
- End;
-
- Function HumanPlay(P:Byte):Boolean;Begin
- HumanPlay:=False;
- If Board[P]=0 Then Begin
- Board[P]:=1;
- HumanPlay:=True;
- End;
- End;
-
- Function ComputerPlay:Boolean;
- Var
- ComputerMove,HumanX,ComputerO:Integer;
- I:Byte;
- AllEmpty:Boolean;
- Begin
- ComputerMove:=-1;
- ComputerPlay:=False;
- AllEmpty:=True;
- For I:=0 to 8 do If Board[I]<>0Then AllEmpty:=False;
- If(AllEmpty)Then ComputerMove:=2
- Else
- Begin
- ComputerO:=0;
- HumanX:=0;
- For I:=0 to 8 do Begin
- If Board[I]=1 Then Inc(HumanX);
- If Board[I]=2 Then Inc(ComputerO);
- End;
- If(HumanX=1)and(ComputerO=0)Then Begin
- If Board[4]=0 Then ComputerMove:=4;
- End;
- { Recherche une attaque }
- If ComputerMove=-1Then Begin
- If(Board[0]=2)and(Board[1]=2)and(Board[2]=0)Then ComputerMove:=2 Else
- If(Board[0]=2)and(Board[1]=0)and(Board[2]=2)Then ComputerMove:=1 Else
- If(Board[0]=2)and(Board[4]=2)and(Board[8]=0)Then ComputerMove:=8 Else
- If(Board[0]=2)and(Board[4]=0)and(Board[8]=2)Then ComputerMove:=4 Else
- If(Board[0]=2)and(Board[3]=2)and(Board[6]=0)Then ComputerMove:=6 Else
- If(Board[1]=2)and(Board[4]=2)and(Board[7]=0)Then ComputerMove:=7 Else
- If(Board[2]=2)and(Board[4]=2)and(Board[6]=0)Then ComputerMove:=6 Else
- If(Board[2]=2)and(Board[4]=0)and(Board[6]=2)Then ComputerMove:=4 Else
- If(Board[2]=2)and(Board[5]=2)and(Board[8]=0)Then ComputerMove:=8 Else
- If(Board[2]=2)and(Board[5]=0)and(Board[8]=2)Then ComputerMove:=5 Else
- If(Board[3]=2)and(Board[4]=2)and(Board[5]=0)Then ComputerMove:=5 Else
- If(Board[3]=2)and(Board[4]=0)and(Board[5]=2)Then ComputerMove:=4 Else
- If(Board[6]=2)and(Board[5]=2)and(Board[2]=0)Then ComputerMove:=2 Else
- If(Board[6]=2)and(Board[7]=2)and(Board[8]=0)Then ComputerMove:=8 Else
- If(Board[6]=2)and(Board[7]=0)and(Board[8]=2)Then ComputerMove:=7;
- End;
- If ComputerMove=-1Then Begin
- If(Board[2]=2)and(Board[4]=0)and(Board[6]=0)and(ComputerO=1)Then ComputerMove:=6 Else
- If(Board[2]=2)and(Board[6]=2)and(Board[8]=0)and(ComputerO=2)Then ComputerMove:=8 Else
- If(Board[2]=2)and(Board[6]=2)and(Board[0]=0)Then ComputerMove:=0;
- End;
- { Recherche une d,fense }
- If(ComputerMove=-1)Then Begin
- If(Board[0]=0)and(Board[3]=1)and(Board[6]=1)Then ComputerMove:=0 Else
- If(Board[0]=1)and(Board[3]=0)and(Board[6]=1)Then ComputerMove:=3 Else
- If(Board[0]=1)and(Board[3]=1)and(Board[6]=0)Then ComputerMove:=6 Else
- If(Board[0]=0)and(Board[1]=1)and(Board[2]=1)Then ComputerMove:=0 Else
- If(Board[0]=1)and(Board[1]=0)and(Board[2]=1)Then ComputerMove:=1 Else
- If(Board[0]=1)and(Board[1]=1)and(Board[2]=0)Then ComputerMove:=2 Else
- If(Board[1]=0)and(Board[4]=1)and(Board[7]=1)Then ComputerMove:=1 Else
- If(Board[1]=1)and(Board[4]=0)and(Board[7]=1)Then ComputerMove:=4 Else
- If(Board[1]=1)and(Board[4]=1)and(Board[7]=0)Then ComputerMove:=7 Else
- If(Board[2]=0)and(Board[4]=1)and(Board[6]=1)Then ComputerMove:=2 Else
- If(Board[2]=1)and(Board[4]=0)and(Board[6]=1)Then ComputerMove:=4 Else
- If(Board[2]=1)and(Board[4]=1)and(Board[6]=0)Then ComputerMove:=6 Else
- If(Board[2]=0)and(Board[5]=1)and(Board[8]=1)Then ComputerMove:=2 Else
- If(Board[2]=1)and(Board[5]=0)and(Board[8]=1)Then ComputerMove:=5 Else
- If(Board[2]=1)and(Board[5]=1)and(Board[8]=0)Then ComputerMove:=8 Else
- If(Board[3]=0)and(Board[4]=1)and(Board[5]=1)Then ComputerMove:=3 Else
- If(Board[3]=1)and(Board[4]=0)and(Board[5]=1)Then ComputerMove:=4 Else
- If(Board[3]=1)and(Board[4]=1)and(Board[5]=0)Then ComputerMove:=5 Else
- If(Board[6]=0)and(Board[7]=1)and(Board[8]=1)Then ComputerMove:=6 Else
- If(Board[6]=1)and(Board[7]=0)and(Board[8]=1)Then Computermove:=7 Else
- If(Board[6]=1)and(Board[7]=1)and(Board[8]=0)Then ComputerMove:=8;
- End;
- { Recherche al,atoire }
- If ComputerMove=-1 Then Begin
- For I:=0 to 8 do If Board[I]=0 Then Begin
- Board[I]:=2;
- Break;
- End;
- End;
- End;
- If ComputerMove<>-1 Then Begin
- If Board[ComputerMove]=0 Then Begin
- Board[ComputerMove]:=2;
- ComputerPlay:=True;
- End;
- End;
- End;
-
- Function CheckIfWin:Byte;
- Var
- I:Byte;
- Begin
- For I:=1 to 2 do Begin
- CheckIfWin:=I;
- If(Board[0]=I)and(Board[1]=I)and(Board[2]=I)Then Exit;
- If(Board[0]=I)and(Board[3]=I)and(Board[6]=I)Then Exit;
- If(Board[1]=I)and(Board[4]=I)and(Board[7]=I)Then Exit;
- If(Board[2]=I)and(Board[5]=I)and(Board[8]=I)Then Exit;
- If(Board[2]=I)and(Board[4]=I)and(Board[6]=I)Then Exit;
- If(Board[0]=I)and(Board[4]=I)and(Board[8]=I)Then Exit;
- If(Board[3]=I)and(Board[4]=I)and(Board[5]=I)Then Exit;
- If(Board[6]=I)and(Board[7]=I)and(Board[8]=I)Then Exit;
- End;
- CheckIfWin:=0;
- End;
-
- Function MatchNull:Boolean;
- Var
- I:Byte;
- Begin
- MatchNull:=False;
- For I:=0 to 8 do If Board[I]=0Then Exit;
- MatchNull:=True;
- End;
-
- Procedure RunGame;
- Var
- K:Char;
- Begin
- If(Beginner=Computer)Then ComputerPlay;
- Repeat
- ShowBoard;
- WriteLn;
- Write('Faites votre choix entre 1 et 9 : ');
- K:=ReadKey;
- Case K of
- '1':If HumanPlay(0)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '2':If HumanPlay(1)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '3':If HumanPlay(2)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '4':If HumanPlay(3)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '5':If HumanPlay(4)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '6':If HumanPlay(5)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '7':If HumanPlay(6)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '8':If HumanPlay(7)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- '9':If HumanPlay(8)Then Begin
- If CheckIfWin=1 Then Begin
- ShowBoard;
- WriteLn('Vous avez gagne !');
- Exit;
- End;
- ComputerPlay;
- If CheckIfWin=2 Then Begin
- ShowBoard;
- WriteLn('Vous avez perdu !');
- Exit;
- End;
- End;
- End;
- If(MatchNull)Then Begin
- ShowBoard;
- WriteLn('PARTIE NULLE !');
- Exit;
- End;
- Until K=#27;
- End;
-
- BEGIN
- Beginner:=Computer;
- InitGame;
- ChoiceBeginner;
- RunGame;
- END.
Code source
Voici le code source du jeu sur GitHub :
Lien | Langage de programmation | Projet |
---|---|---|
https://github.com/gladir/7iles/blob/main/TTT.PAS | Turbo Pascal, Free Pascal | 7iles |