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
| #include <iostream>
#include <vector>
using namespace std;
void printGame(vector< vector<int> > game);
char coin(int player) {return (player == 1 ? '1' : (player == 2 ? '2' : ' '));}
int checkEnded(vector< vector<int> > game);
bool play(vector< vector<int> > game, int column, int player);
int robotGo(vector< vector<int> > game);
int calcMax(vector< vector<int> > game, int depth);
int calcMin(vector< vector<int> > game, int depth);
int main()
{
vector< vector<int> > game(7, vector<int>(6, 0));
printGame(game);
int winner;
bool robot = false;
while((winner = checkEnded(game)) < 0)
{
int column = 0;
if(robot) column = robotGo(game);
else cout << endl << "Where play ? ", cin >> column, column--;
for(int i = 0; i < 6; i++) if(game[column][i] == 0) { game[column][i] = (robot ? 2 : 1); break; }
printGame(game);
robot = !robot;
}
switch(winner)
{
case 0 : cout << endl << "Match nul" << endl; break;
case 1 : cout << endl << "Gagne !!!" << endl; break;
case 2 : cout << endl << "Perdu !!!" << endl; break;
}
cin.get();
return 0;
}
void printGame(vector< vector<int> > game)
{
system("cls"), cout << " 1 2 3 4 5 6 7" << endl << endl;
for(int i = 5; i >= 0; i--)
{
cout << "| " << coin(game[0][i]) << " | " << coin(game[1][i]) << " | " << coin(game[2][i]) << " | " << coin(game[3][i]) << " | "
<< coin(game[4][i]) << " | " << coin(game[5][i]) << " | " << coin(game[6][i]) << " |" << endl << "+---+---+---+---+---+---+---+" << endl;
}
}
int checkEnded(vector< vector<int> > game)
{
for(int i = 0; i < 7; i++) for(int j = 0; j < 3; j++) for(int p = 1; p < 3; p++)
if(game[i][j] == p && game[i][j + 1] == p && game[i][j + 2] == p && game[i][j + 3] == p) return p;
for(int i = 0; i < 4; i++) for(int j = 0; j < 6; j++) for(int p = 1; p < 3; p++)
if(game[i][j] == p && game[i + 1][j] == p && game[i + 2][j] == p && game[i + 3][j] == p) return p;
for(int i = 0; i < 4; i++) for(int j = 0; j < 3; j++) for(int p = 1; p < 3; p++)
if(game[i][j] == p && game[i + 1][j + 1] == p && game[i + 2][j + 2] == p && game[i + 3][j + 3] == p) return p;
for(int i = 0; i < 4; i++) for(int j = 3; j < 6; j++) for(int p = 1; p < 3; p++)
if(game[i][j] == p && game[i + 1][j - 1] == p && game[i + 2][j - 2] == p && game[i + 3][j - 3] == p) return p;
for(int i = 0; i < 7; i++) for(int j = 0; j < 6; j++) if(game[i][j] == 0) return -1;
return 0;
}
bool play(vector< vector<int> > game, int column, int player)
{
// On joue sur la première case de la colonne qui est vide. Si on ne peut pas, on retourne faux
for(int i = 0; i < 5; i++) if(game[column][i] == 0) {game[column][i] = player; return true;}
return false;
}
int robotGo(vector< vector<int> > game)
{
// On initialise le meilleur coup (score minimum, première colonne)
int max = -1, best = 0;
// Pour tous les coups
for(int i = 0; i < 7; i++)
{
// On fait une copie du jeu
vector< vector<int> > tmpGame = game;
if(play(tmpGame, i, 2))
{
// Si on peut jouer le coup, on calcul son score
int tmp = calcMax(tmpGame, 3);
// Si le score est meilleur que le précédant, on l'enregistre
if(tmp > max) { max = tmp; best = i; }
}
}
// On retourne le meilleur coup trouvé
return best;
}
int calcMax(vector< vector<int> > game, int depth)
{
// Si le noeud est une feuille ou si le jeu est fini, on retourne 1 si on a gagné, -1 si l'adversaire a gagné ou 0 si il n'y a pas de gagnant
int winner = checkEnded(game);
if(depth == 0 || winner > -1) return winner == 1 ? -1 : (winner == 2 ? 1 : 0);
// On initialise le score : minimum
int max = -1;
// Pour tous les coups suivants
for(int i = 0; i < 7; i++)
{
// On fait une copie du jeu
vector< vector<int> > tmpGame = game;
if(play(tmpGame, i, 2))
{
// Si on peut jouer le coup, on calcul son score
int tmp = calcMin(tmpGame, depth - 1);
// Si le score est meilleur que le précédant, on l'enregistre
if(tmp > max) max = tmp;
}
}
// On retourne le score
return max;
}
int calcMin(vector< vector<int> > game, int depth)
{
// Si le noeud est une feuille ou si le jeu est fini, on retourne 1 si on a gagné, -1 si l'adversaire a gagné ou 0 si il n'y a pas de gagnant
int winner = checkEnded(game);
if(depth == 0 || winner > -1) return winner == 1 ? -1 : 1;
// On initialise le score : minimum
int min = 1;
// Pour tous les coups suivants
for(int i = 0; i < 7; i++)
{
// On fait une copie du jeu
vector< vector<int> > tmpGame = game;
if(play(tmpGame, i, 1))
{
// Si on peut jouer le coup, on calcul son score
int tmp = calcMax(tmpGame, depth - 1);
// Si le score est meilleur que le précédant, on l'enregistre
if(tmp < min) min = tmp;
}
}
// On retourne le score
return min;
} |
Partager