Я пытаюсь создать рекурсивный алгоритм Tic-Tac-Toe, который находит наилучшую позицию для игры.Сейчас предполагается, что он вернет 10, если сможет выиграть, когда оба игрока играют оптимально, -10, если проиграет при оптимальной игре, и 0, если это будет ничья с обоими игроками оптимально.Я пытаюсь сохранить оценки для каждого уровня рекурсии в массиве tempMax или tempMin в зависимости от компьютера или человека, «играющего».Однако, хотя он правильно хранит оценки для каждого уровня рекурсии, он изменяет массив tempMax / Min в рекурсивной функции, которая его вызвала.Извините, если я не объяснил проблему хорошо.
Я пробовал много версий этого кода, но ни одна из них, похоже, не работает.Для приведенного ниже кода я убрал большинство вещей, которые я пробовал ранее, но оставил в операторах печати и тестировании в реальной рекурсивной функции.
#include <iostream>
using namespace std;
string board[9];// = {"X", "O", "X", "O", "O", "_", "X", "_", "_"};
//uncomment out above line to enter a specific case
int minBoard[9] = {999, 999, 999, 999, 999, 999, 999, 999, 999};
int maxBoard[9] = {-999, -999, -999, -999, -999, -999, -999, -999, -999};
string computer = "X", human = "O";
void reset(){
for (int i = 0; i < 9; i++){
minBoard[i] = 999;
maxBoard[i] = -999;
}
}
int maximum(int arr[]){
int MAX = arr[0];
for (int i = 1; i < 9; i++){
MAX = max(arr[i], MAX);
}return MAX;
}
int minimum(int arr[]){
int MIN = arr[0];
for (int i = 1; i < 9; i++){
MIN = min(arr[i], MIN);
}return MIN;
}
void printBoard(){
for (int i = 0; i < 9; i++){
if (i%3 != 0){
cout << "|";
}
cout << board[i];
if (i%3 == 2){
cout << endl;
}
}cout << endl;
}
void updateSpots(){
for (int i = 0; i < 9; i++){
if (board[i] == "_"){
availableSpots[i] = 1;
}else{
availableSpots[i] = 0;
}
}
}
bool tied(){
for (int i = 0; i < 9; i++){
if (board[i] == "_"){
return false;
}
}return true;
}
bool winning(string player){
if ((board[0] == player && board[1] == player && board[2] == player) ||
(board[3] == player && board[4] == player && board[5] == player) ||
(board[6] == player && board[7] == player && board[8] == player) ||
(board[0] == player && board[3] == player && board[6] == player) ||
(board[1] == player && board[4] == player && board[7] == player) ||
(board[2] == player && board[5] == player && board[8] == player) ||
(board[0] == player && board[4] == player && board[8] == player) ||
(board[2] == player && board[4] == player && board[6] == player)
){
return true;
}else{
return false;
}
}
int solve(string player, int tempMin[], int tempMax[]){
// printBoard();
// for (int i = 0; i < 9; i++){
// cout << tempMax[i] << ", ";
// }cout << " TEMPMAX" << endl;
// for (int i = 0; i < 9; i++){
// cout << tempMin[i] << ", ";
// }cout << " TEMPMIN" << endl;
if (winning(human)){
return -10;
}else if (winning(computer)){
return 10;
}else if (tied()){
return 0;
}else if (player == "X"){
for (int i = 0; i < 9; i++){
if (board[i] == "_"){
board[i] = "X";
// alpha = min(solve(human), alpha);
reset();
tempMax[i] = solve(human, minBoard, maxBoard);
// cout << tempMax[i] << " MAAAAAAAAAA " << i << endl;
board[i] = "_";
}
}
// for (int i = 0; i < 9; i++){
// cout << tempMax[i] << ", ";
// }cout << " TEMPMAX" << endl;
// cout << maximum(tempMax) << " TEMPMAX" << endl;
return maximum(tempMax);
// int MAX = tempMax[0];
// for (int i = 1; i < 9; i++){
// MAX = max(tempMax[i], MAX);
// }return MAX;
}else if (player == "O"){
for (int i = 0; i < 9; i++){
if (board[i] == "_"){
board[i] = "O";
// beta = max(solve(computer), beta);
reset();
tempMin[i] = solve(computer, minBoard, maxBoard);
// cout << tempMin[i] << " MIIIIIIIIII " << i << endl;
board[i] = "_";
}
}
// for (int i = MPMIN" << endl;
// for (int i = 0; i < 9; i++){
// cout << tempMin[i] << ", ";
// }cout << " TEMPMIN" << endl;
// cout << minimum(tempMin) << " TEMPMIN" << endl;
return minimum(tempMin);
// int MIN = tempMin[0];
// for (int i = 1; i < 9; i++){
// MIN = min(tempMin[i], MIN);
// }return MIN;
}
}
int main(){
for (int i = 0; i < 9; i++){
board[i] = "_";
}//comment the for loop out for specific case testing
cout << solve(computer, minBoard, maxBoard) << endl;
}
Для пустой доски Tic-Tac-Toe, если оба игрока играют оптимально, это должна быть ничья, поэтому программа должна вернуть 0. Однако это возвращает 10. Я также пробовал меньшие случаи, ноэто все еще не работает.