done implementing minmax, only needs some better printing now
This commit is contained in:
parent
ce62662dbb
commit
5f055f644c
2 changed files with 55 additions and 21 deletions
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"iostream": "cpp"
|
"iostream": "cpp",
|
||||||
|
"ostream": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
73
ttt.cc
73
ttt.cc
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
int game_over(const int dimension, vector<vector<int>> &grid);
|
||||||
|
int min(const int dimension, vector<vector<int>> &grid, int &x, int &y);
|
||||||
|
int max(const int dimension, vector<vector<int>> &grid, int &x, int &y);
|
||||||
|
|
||||||
void print_grid(const int dimension, vector<vector<int>> &grid) {
|
void print_grid(const int dimension, vector<vector<int>> &grid) {
|
||||||
for (int y = 0; y < dimension; y++) {
|
for (int y = 0; y < dimension; y++) {
|
||||||
for (int x = 0; x < 2 * dimension + 1; x++) {
|
for (int x = 0; x < 2 * dimension + 1; x++) {
|
||||||
|
@ -34,10 +38,6 @@ void print_grid(const int dimension, vector<vector<int>> &grid) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int *minimax(const int dimension, vector<vector<int>> &grid) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int max(const int dimension, vector<vector<int>> &grid, int &x, int &y) {
|
int max(const int dimension, vector<vector<int>> &grid, int &x, int &y) {
|
||||||
int n = game_over(dimension, grid);
|
int n = game_over(dimension, grid);
|
||||||
if (n == 2) return 0;
|
if (n == 2) return 0;
|
||||||
|
@ -45,18 +45,53 @@ int max(const int dimension, vector<vector<int>> &grid, int &x, int &y) {
|
||||||
else if (n == -1) return -1;
|
else if (n == -1) return -1;
|
||||||
|
|
||||||
int value = INT_MIN;
|
int value = INT_MIN;
|
||||||
for (int y = 0; y < dimension; y++) {
|
for (int y_ = 0; y_ < dimension; y_++) {
|
||||||
for (int x = 0; x < dimension; x++) {
|
for (int x_ = 0; x_ < dimension; x_++) {
|
||||||
if (grid[y][x] != 0) continue;
|
if (grid[y_][x_] != 0) continue;
|
||||||
grid[y][x] = 1;
|
int old_x = x;
|
||||||
|
int old_y = y;
|
||||||
|
grid[y_][x_] = 1;
|
||||||
|
int next_val = min(dimension, grid, x, y);
|
||||||
|
if (next_val > value) {
|
||||||
|
value = next_val;
|
||||||
|
x = x_;
|
||||||
|
y = y_;
|
||||||
|
} else {
|
||||||
|
x = old_x;
|
||||||
|
y = old_y;
|
||||||
|
}
|
||||||
|
grid[y_][x_] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void min(const int dimension, vector<vector<int>> &grid, int &x, int &y) {
|
int min(const int dimension, vector<vector<int>> &grid, int &x, int &y) {
|
||||||
|
int n = game_over(dimension, grid);
|
||||||
|
if (n == 2) return 0;
|
||||||
|
else if (n == 1) return 1;
|
||||||
|
else if (n == -1) return -1;
|
||||||
|
|
||||||
int value = INT_MAX;
|
int value = INT_MAX;
|
||||||
|
for (int y_ = 0; y_ < dimension; y_++) {
|
||||||
|
for (int x_ = 0; x_ < dimension; x_++) {
|
||||||
|
if (grid[y_][x_] != 0) continue;
|
||||||
|
int old_x = x;
|
||||||
|
int old_y = y;
|
||||||
|
grid[y_][x_] = -1;
|
||||||
|
int next_val = max(dimension, grid, x, y);
|
||||||
|
if (next_val < value) {
|
||||||
|
value = next_val;
|
||||||
|
x = x_;
|
||||||
|
y = y_;
|
||||||
|
} else {
|
||||||
|
x = old_x;
|
||||||
|
y = old_y;
|
||||||
|
}
|
||||||
|
grid[y_][x_] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -89,10 +124,8 @@ int game_over(const int dimension, vector<vector<int>> &grid) {
|
||||||
sum += grid[x][y];
|
sum += grid[x][y];
|
||||||
}
|
}
|
||||||
if (sum == dimension) {
|
if (sum == dimension) {
|
||||||
cout << "player won" << endl;
|
|
||||||
return 1;
|
return 1;
|
||||||
} else if (sum == -dimension) {
|
} else if (sum == -dimension) {
|
||||||
cout << "bot won" << endl;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
sum = 0;
|
sum = 0;
|
||||||
|
@ -104,10 +137,8 @@ int game_over(const int dimension, vector<vector<int>> &grid) {
|
||||||
sum += grid[n][n];
|
sum += grid[n][n];
|
||||||
}
|
}
|
||||||
if (sum == dimension) {
|
if (sum == dimension) {
|
||||||
cout << "player won" << endl;
|
|
||||||
return 1;
|
return 1;
|
||||||
} else if (sum == -dimension) {
|
} else if (sum == -dimension) {
|
||||||
cout << "bot won" << endl;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,10 +148,8 @@ int game_over(const int dimension, vector<vector<int>> &grid) {
|
||||||
sum += grid[dimension - n][n - 1];
|
sum += grid[dimension - n][n - 1];
|
||||||
}
|
}
|
||||||
if (sum == dimension) {
|
if (sum == dimension) {
|
||||||
cout << "player won" << endl;
|
|
||||||
return 1;
|
return 1;
|
||||||
} else if (sum == -dimension) {
|
} else if (sum == -dimension) {
|
||||||
cout << "bot won" << endl;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -183,7 +212,11 @@ void player_move(const int dimension, vector<vector<int>> &grid) {
|
||||||
grid[x][y] = 1;
|
grid[x][y] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void computer_move() {
|
void computer_move(const int dimension, vector<vector<int>> &grid) {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
min(dimension, grid, x, y);
|
||||||
|
grid[y][x] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -212,13 +245,13 @@ int play_game(const int dimension) {
|
||||||
|
|
||||||
// Do move according to startPlayer
|
// Do move according to startPlayer
|
||||||
if (startPlayer == 1) {
|
if (startPlayer == 1) {
|
||||||
computer_move();
|
computer_move(dimension, grid);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
player_move(dimension, grid);
|
player_move(dimension, grid);
|
||||||
if (game_over(dimension, grid) != 0) break;
|
if (game_over(dimension, grid) != 0) break;
|
||||||
computer_move();
|
computer_move(dimension, grid);
|
||||||
if (game_over(dimension, grid) != 0) break;
|
if (game_over(dimension, grid) != 0) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue