1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
| #include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
bool victoire1( char player[], int taille);//fonction qui examine le tableau de PLAYER 1. prend en arguments le tableau de PLAYER 1 et sa taille . examine le tableau, s'il y'a 3 marques allignées la fonction retourne true, sinon retourne false.
bool victoire2( char player[], int taille);//fonction qui examine le tableau de PLAYER 2. prend en arguments le tableau de PLAYER 2 et sa taille . examine le tableau, s'il y'a 3 marques allignées la fonction retourne true, sinon retourne false.
void afficherGrille( char grillePrincipale[], int taille);//fonction qui dessine une grille de Tic-Tac-Toe en faisant les mises a jour de la grille. prend en arguments les deux tableaux action1[] et actions2[] et leurs taille. ne renvoient rien mais dessine dans la console output
int main()
{
string confirmation ;
int choix1, choix2;//choix1 va contenir le nombre du carreau choisi par le PLAYER 1, tandis que choix2 va contenir celui de PLAYER2
const int taille = 9;//Taille du tableau represente la grille du jeu 3x3
int roles = 0;//a chaque 2 nouveux tours ( quand PLAYER 1 et PLAYER 2 finissent 1 tour) passent, on ajoute 1 a roles, elle est indispensable pour le fonctionnement de l'egalite
bool commencer=false, dejaChoisie;//commencer est false pour ne pas reintialiser les tableaux( il y'a une instruction qui examine commencer a la fin destours de PLAYER 1 et PLAYER 2), car quand elle est true, sa veut dire qu'on veut recommencer la partie et donc reintialiser les tableaux. dejaChoisie prend true si le choix du joueur est deja selectionné par le meme joueur ou par un autre, et prend false sinon
char actions1[ taille]={ '1', '2', '3', '4', '5', '6', '7', '8', '9'};//va contenir les carreaux remplits par PLAYER1
char actions2[ taille]={ '1', '2', '3', '4', '5', '6', '7', '8', '9'};//va contenir les carreaux remplits par PLAYER2
char grillePrincipale[ taille]={ '1', '2', '3', '4', '5', '6', '7', '8', '9'};// celle qui va etre transmis a l'ecran, elle va contenir X et O et les nombres non-remplis
do
{
if ( !victoire2(actions2, taille) && !commencer)
{
afficherGrille( grillePrincipale, taille);
cout<<"PLAYER 1: Entrez le nombre de carreau ou vous voulez placer le X: ";//tour de PLAYER 1
do
{
commencer = false;//pour ne pas reintialiser le jeu
dejaChoisie = false;//pour que la boucle ne sois pas infinie
cin>>choix1;//Lire le nombre de carreau dont le PLAYER 1 veut poser le X
if ( grillePrincipale[ choix1-1] == 'X' || grillePrincipale[ choix1-1] == 'O')//demandez une autre fois un nombre de carreau car celui qui est entré est deja selectionné par PLAYER 1 ou par PLAYER 2
{
if (grillePrincipale[ choix1-1] == 'X')
{
cout<<"Vous avez deja choisis cette case."<<endl;
}
else if (grillePrincipale[ choix1-1] =='O')
{
cout<<"Cette case est deja choisie par votre adversaire."<<endl;
}
dejaChoisie=true;//dans les deux cas la case est deja choisie
}
else if ( choix1 > 0 && choix1 <= taille && grillePrincipale[ choix1-1] != 'X' && grillePrincipale[ choix1-1] != 'O')
{
actions1[ choix1-1]='X';//remplir la case "choix1-1"("-1" car les subscripts sont decales de 1, par exemple si le joueur choisi 5 sa veut dire qu'il faut remplir la case 4 ( qui fait reference a l'icone 5 de la grille du jeu) du tableau par X appartenant a PLAYER 1
grillePrincipale[ choix1-1]=actions1[ choix1-1];//remplir aussi le tableau grillePrincipale par X
}
else if ( choix1 <= 0 || choix1 > 9)
{
cout<<"Entrez un identifiant de carreau valide :"<<endl;
}
else if ( victoire1(actions1, taille) || roles==5)
{
cout<<"OUIIIIIIIIIIII"<<endl;
if (victoire1(actions1, taille))//Si victoire(actions1, taille) est true
{
afficherGrille( grillePrincipale, taille);
cout<<"PLAYER 1 gagne !"<<endl;
}
else if((!victoire1(actions1, taille))&&(!victoire2(actions2, taille)))
{
afficherGrille( grillePrincipale, taille);
cout<<"Egalite.";
}
cout<<"Voulez-vous reessayer ? (Y/N): ";
cin>>confirmation;
while( confirmation != "Y" && confirmation !="y" && confirmation !="N" && confirmation !="n")
{
cout<<"N'entrez que Y ou N : ";
cin>>confirmation;
}
if ( confirmation == "Y" || confirmation == "y")
{
commencer = true;
}
}
}while ( choix1 <= 0 || choix1 > 9 || dejaChoisie==true);//pour demander a chaque fois la variable choix1 si choix1 <= 0 || choix1 > 9 || si la case est deja choisie par PLAYER1 ou PLAYER2
}
else if (!victoire1(actions1, taille) && !commencer);//si victoire(actions1, taille) est false
{
afficherGrille( grillePrincipale, taille);
cout<<"PLAYER 2: Entrez le nombre de carreau ou vous voulez placer le O: ";//tour de PLAYER 2
roles+=1;//Si on l'inclut dans la boucle, a chaque fois que le joueur n'entre pas un identifiant valide, roles va s'incrementer, on definit alors la fin de 1 tour ici apres que le programme demande d'entrer un identifiant
do
{
dejaChoisie = false;
cin>>choix2;//Lire le nombre de carreau dont le PLAYER 1 veut poser le X
if ( grillePrincipale[ choix2-1] == 'X' || grillePrincipale[ choix2-1] == 'O')//demandez une autre fois un nombre de carreau car celui qui est entré est deja selectionné par PLAYER 1 ou par PLAYER 2
{
if (grillePrincipale[choix2-1] == 'O')
{
cout<<"Vous avez deja choisis cette case."<<endl;
}
else if (grillePrincipale[choix2-1]=='X')
{
cout<<"Cette case est deja choisie par votre adversaire."<<endl;
}
dejaChoisie = true;//dans les deux cas la case est deja choisie
}
else if ( choix2 > 0 && choix2 <= taille && grillePrincipale[ choix2-1] != 'O' && grillePrincipale[ choix2-1] != 'X')
{
actions2[ choix2-1]='O';//remplir la case "choix2-1"("-1" car les subscripts sont decales de 1, par exemple si le joueur choisi 5 sa veut dire qu'il faut remplir la case 4 ( qui fait reference a l'icone 5 de la grille du jeu) du tableau par 0 appartenant a PLAYER 2
grillePrincipale[choix2-1]=actions2[ choix2-1];//remplir aussi le tableau grillePrincipale[] par O
}
else if ( choix2 <= 0 || choix2 > 9)
{
cout<<"Entrez un identifiant de carreau valide :"<<endl;
}
else if ( victoire2(actions2, taille) || roles == 5)
{
if (victoire2(actions2, taille))//Si victoire(actions2, taille) est true
{
afficherGrille( grillePrincipale, taille);
cout<<"PLAYER 2 gagne !"<<endl;
}
else if((!victoire1( actions1, taille))&&(!victoire2( actions2, taille)))
{
afficherGrille( grillePrincipale, taille);
cout<<"Egalite.";
}
cout<<"Voulez-vous reessayer ? (Y/N): ";
cin>>confirmation;
while( confirmation != "Y" && confirmation !="y" && confirmation !="N" && confirmation !="n")
{
cout<<"N'entrez que Y ou N : ";
cin>>confirmation;
}
if ( confirmation == "Y" || confirmation == "y")
{
commencer = true;
}
}
}while ( choix2 <= 0 || choix2 > 9 || dejaChoisie);//pour demander a chaque fois la variable choix2 si choix2 <= 0 || choix2 > 9 || choix1 == choix2
}
if( commencer) //pour réintialiser les icones apres un redemarrage de la partie.
{
for ( int subscript=0, intialisation=1; subscript<taille; subscript++, intialisation++)//raccourcis en utilisant for pour affecter les cases des trois tableaux de 0-8 par 1-9 successivement.
{
actions1[subscript]=intialisation;
actions2[subscript]=intialisation;
grillePrincipale[subscript]=intialisation;
}
}
}while ( commencer || (((!victoire1( actions1, taille)) && (!victoire2( actions2, taille)))));
if ( confirmation == "N" || confirmation == "n")
{
cout<<"Merci d'avoir teste le jeu"<<endl;
system("PAUSE");
}
return 0;
}
bool victoire1( char player[], int taille)
{
if (( player[0]=='X' &&player[1]=='X' &&player[2]=='X') || ( player[0]=='X' &&player[3]=='X' &&player[6]=='X' ) || ( player[0]=='X' &&player[4]=='X' &&player[8]=='X' ) || ( player[1]=='X' &&player[4]=='X' &&player[7]=='X' ) || ( player[2]=='X' &&player[4]=='X' &&player[6]=='X' ) || ( player[2]=='X' &&player[5]=='X' &&player[8]=='X' ) || ( player[3]=='X' &&player[4]=='X' &&player[5]=='X' ) || ( player[6]=='X' &&player[7]=='X' &&player[8]=='X'))
{
return true;
}
else
{
return false;
}
}
bool victoire2( char player[], int taille)
{
if (( player[0]=='O' &&player[1]=='O' &&player[2]=='O') || ( player[0]=='O' &&player[3]=='O' &&player[6]=='O' ) || ( player[0]=='O' &&player[4]=='O' &&player[8]=='O' ) || ( player[1]=='O' &&player[4]=='O' &&player[7]=='O' ) || ( player[2]=='O' &&player[4]=='O' &&player[6]=='O' ) || ( player[2]=='O' &&player[5]=='O' &&player[8]=='O' ) || ( player[3]=='O' &&player[4]=='O' &&player[5]=='O' ) || ( player[6]=='O' &&player[7]=='O' &&player[8]=='O'))
{
return true;
}
else
{
return false;
}
}
void afficherGrille( char grillePrincipale[], int taille)
{
int subscript = 0;//va definir les cases a afficher
cout<<endl<<" ---+---+---"<<endl;
for ( int sauter = 0; sauter < 3; sauter++, subscript+=3)
{
cout<<" |";
for ( int remplir = subscript; remplir < subscript + 3; remplir++)//On va afficher les valeurs des cases 0-1-2, quand remplir va prendre la valeur 3, la boucle va arreter puis la boucle generale va redemarrer une deuxieme fois, on ajoute alors 3 a subscript, puis on entre dans la boucle secondaire ( d'affichage) pour afficher les valeurs dans les cases 3-4-5,.............. pour afficher les valeurs dans les cases 6-7-8
{
cout<<" "<<grillePrincipale[ remplir]<<" |";
}
cout<<endl<<" ---+---+---"<<endl;
}
cout<<endl;
} |
Partager