Как передать массив в качестве параметра без изменения исходного массива? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать рекурсивный алгоритм 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. Я также пробовал меньшие случаи, ноэто все еще не работает.

1 Ответ

0 голосов
/ 07 февраля 2019

Массивы передаются по адресу, поэтому, когда вы передаете массив в функцию, он берет его адрес, но вы можете сделать его копию, а затем передать его, поэтому объявите функцию copy_array_function, которая возвращает новый адрес копии вашего исходного массива

...