Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定minimax tic tac toe中的正确位置 我试图用MIMPIX算法在C++中编写一个简单的TIC TAC趾,但是在确定分数是最好的位置时遇到了问题。minEval(返回最小值的分数)、maxEval(返回最大值的分数)和playMove(确定播放哪个位置,然后播放移动)功能如下所示 int maxEval(int board[9]) { if (checkDraw(board)) { return 0; } else if (checkWin(board)) { return -1000; } int finalScore = -1000; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = 1; int score = minEval(board); if (score > finalScore) { finalScore = score; } board[i] = 0; } } return finalScore; } int minEval(int board[9]) { if (checkDraw(board)) { return 0; } else if (checkWin(board)) { return 1000; } int finalScore = 1000; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = -1; int score = maxEval(board); if (score < finalScore) { finalScore = score; } board[i] = 0; } } return finalScore; } void playMove(int board[9], int player) { int finalScore = player * -1000; int position; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = player; int score; if (player == 1) { score = maxEval(board); } else { score = minEval(board); } if (player == 1 && score >= finalScore) { finalScore = score; position = i; } else if (player == -1 && score <= finalScore) { finalScore = score; position = i; } board[i] = 0; } } board[position] = player; } int-maxEval(int-board[9]){ if(支票提款(董事会)){ 返回0; } 否则如果(checkWin(董事会)){ 返回-1000; } int finalScore=-1000; 对于(int i=0;i最终分数){ 最终得分=分数; } 板[i]=0; } } 返回最终核心; } int minEval(int板[9]){ if(支票提款(董事会)){ 返回0; } 否则如果(checkWin(董事会)){ 返回1000; } int finalScore=1000; 对于(int i=0;i_C++_Tic Tac Toe_Minimax - Fatal编程技术网

确定minimax tic tac toe中的正确位置 我试图用MIMPIX算法在C++中编写一个简单的TIC TAC趾,但是在确定分数是最好的位置时遇到了问题。minEval(返回最小值的分数)、maxEval(返回最大值的分数)和playMove(确定播放哪个位置,然后播放移动)功能如下所示 int maxEval(int board[9]) { if (checkDraw(board)) { return 0; } else if (checkWin(board)) { return -1000; } int finalScore = -1000; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = 1; int score = minEval(board); if (score > finalScore) { finalScore = score; } board[i] = 0; } } return finalScore; } int minEval(int board[9]) { if (checkDraw(board)) { return 0; } else if (checkWin(board)) { return 1000; } int finalScore = 1000; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = -1; int score = maxEval(board); if (score < finalScore) { finalScore = score; } board[i] = 0; } } return finalScore; } void playMove(int board[9], int player) { int finalScore = player * -1000; int position; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = player; int score; if (player == 1) { score = maxEval(board); } else { score = minEval(board); } if (player == 1 && score >= finalScore) { finalScore = score; position = i; } else if (player == -1 && score <= finalScore) { finalScore = score; position = i; } board[i] = 0; } } board[position] = player; } int-maxEval(int-board[9]){ if(支票提款(董事会)){ 返回0; } 否则如果(checkWin(董事会)){ 返回-1000; } int finalScore=-1000; 对于(int i=0;i最终分数){ 最终得分=分数; } 板[i]=0; } } 返回最终核心; } int minEval(int板[9]){ if(支票提款(董事会)){ 返回0; } 否则如果(checkWin(董事会)){ 返回1000; } int finalScore=1000; 对于(int i=0;i

确定minimax tic tac toe中的正确位置 我试图用MIMPIX算法在C++中编写一个简单的TIC TAC趾,但是在确定分数是最好的位置时遇到了问题。minEval(返回最小值的分数)、maxEval(返回最大值的分数)和playMove(确定播放哪个位置,然后播放移动)功能如下所示 int maxEval(int board[9]) { if (checkDraw(board)) { return 0; } else if (checkWin(board)) { return -1000; } int finalScore = -1000; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = 1; int score = minEval(board); if (score > finalScore) { finalScore = score; } board[i] = 0; } } return finalScore; } int minEval(int board[9]) { if (checkDraw(board)) { return 0; } else if (checkWin(board)) { return 1000; } int finalScore = 1000; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = -1; int score = maxEval(board); if (score < finalScore) { finalScore = score; } board[i] = 0; } } return finalScore; } void playMove(int board[9], int player) { int finalScore = player * -1000; int position; for (int i = 0; i < 9; i++) { if (board[i] == 0) { board[i] = player; int score; if (player == 1) { score = maxEval(board); } else { score = minEval(board); } if (player == 1 && score >= finalScore) { finalScore = score; position = i; } else if (player == -1 && score <= finalScore) { finalScore = score; position = i; } board[i] = 0; } } board[position] = player; } int-maxEval(int-board[9]){ if(支票提款(董事会)){ 返回0; } 否则如果(checkWin(董事会)){ 返回-1000; } int finalScore=-1000; 对于(int i=0;i最终分数){ 最终得分=分数; } 板[i]=0; } } 返回最终核心; } int minEval(int板[9]){ if(支票提款(董事会)){ 返回0; } 否则如果(checkWin(董事会)){ 返回1000; } int finalScore=1000; 对于(int i=0;i,c++,tic-tac-toe,minimax,C++,Tic Tac Toe,Minimax,我会检查发现的变化,不仅仅是分数。你是否发现了任何获胜的变化,或者对手发挥最好的变化 e、 g.修改最小/最大评估代码,将所选移动添加到数组中 顺便说一句,如果将最小/最大评估例程合并为一个,可能更容易看到发生了什么 警告未测试代码 int minmaxEval(int board[9], int player, int moves[9], int move) { if (checkDraw(board)) { return 0; } int finalS

我会检查发现的变化,不仅仅是分数。你是否发现了任何获胜的变化,或者对手发挥最好的变化

e、 g.修改最小/最大评估代码,将所选移动添加到数组中

顺便说一句,如果将最小/最大评估例程合并为一个,可能更容易看到发生了什么

警告未测试代码

int minmaxEval(int board[9], int player, int moves[9], int move) {
    if (checkDraw(board)) {
        return 0;
    }
    int finalScore = player * -1000;
    if (checkWin(board)) {
        return finalScore;
    }
    for (int i = 0; i < 9; i++) {
        if (board[i] == 0) {
            board[i] = player;
            int score = minmaxEval(board, -player, moves, move+1);
            if ( (player > 0 && score > finalScore) ||
                (player < 0 && score < finalScore) ) {
                  finalScore = score;
                  moves[move] = i;
            }
            board[i] = 0;
        }
    }
    return finalScore;
}
int minmaxEval(int板[9],int玩家,int移动[9],int移动){
if(支票提款(董事会)){
返回0;
}
int finalScore=player*-1000;
if(checkWin(董事会)){
返回最终核心;
}
对于(int i=0;i<9;i++){
如果(板[i]==0){
board[i]=玩家;
int score=minmaxEval(棋盘,-玩家,移动,移动+1);
如果((玩家>0&&score>最终核心)||
(球员<0&&score
如果您在顶级套路中打印出移动[],您应该会看到给出该分数的变化。不匹配将告知您对算法的理解,例如,当它发现一个胜利时是否停止


一般来说,有一种方法来仔细检查代码是否达到预期效果是很重要的。研究单元测试和测试驱动开发。

我会检查发现的变化,不仅仅是分数。你是否发现了任何获胜的变化,或者对手发挥得最好的变化

e、 g.修改最小/最大评估代码,将所选移动添加到数组中

顺便说一句,如果将最小/最大评估例程合并为一个,可能更容易看到发生了什么

警告未测试代码

int minmaxEval(int board[9], int player, int moves[9], int move) {
    if (checkDraw(board)) {
        return 0;
    }
    int finalScore = player * -1000;
    if (checkWin(board)) {
        return finalScore;
    }
    for (int i = 0; i < 9; i++) {
        if (board[i] == 0) {
            board[i] = player;
            int score = minmaxEval(board, -player, moves, move+1);
            if ( (player > 0 && score > finalScore) ||
                (player < 0 && score < finalScore) ) {
                  finalScore = score;
                  moves[move] = i;
            }
            board[i] = 0;
        }
    }
    return finalScore;
}
int minmaxEval(int板[9],int玩家,int移动[9],int移动){
if(支票提款(董事会)){
返回0;
}
int finalScore=player*-1000;
if(checkWin(董事会)){
返回最终核心;
}
对于(int i=0;i<9;i++){
如果(板[i]==0){
board[i]=玩家;
int score=minmaxEval(棋盘,-玩家,移动,移动+1);
如果((玩家>0&&score>最终核心)||
(球员<0&&score
如果您在顶级套路中打印出移动[],您应该会看到给出该分数的变化。不匹配将告知您对算法的理解,例如,当它发现一个胜利时是否停止


一般来说,仔细检查代码是否达到预期效果是很重要的。请查看单元测试和测试驱动开发。

感谢您的见解,我解决了这个问题。playMove函数中存在一个错误,我将maxEval和minEval错配,这导致AI无法为胜利或平局而游戏。因此,正确的ted代码为:

void playMove(int board[9], int player) {
    int finalScore = player * -1000;
    int position;
    for (int i = 0; i < 9; i++) {
        if (board[i] == 0) {
            board[i] = player;
            int score;
            if (player == 1) {
                score = minEval(board);  //Previously Mismatched
            }
            else {
                score = maxEval(board);  //Previously Mismatched
            }
            if (player == 1 && score >= finalScore) {
                finalScore = score;
                position = i;
            }
            else if (player == -1 && score <= finalScore) {
                finalScore = score;
                position = i;
            }
            board[i] = 0;
        }
    }

    board[position] = player;
}
void playMove(智力板[9],智力玩家){
int finalScore=player*-1000;
内部位置;
对于(int i=0;i<9;i++){
如果(板[i]==0){
board[i]=玩家;
智力得分;
如果(玩家==1){
score=minEval(board);//以前不匹配
}
否则{
分数=最大值(板);//以前不匹配
}
如果(玩家==1&&score>=finalScore){
最终得分=分数;
位置=i;
}

否则,如果(player==-1&&score感谢您的见解,我解决了这个问题。playMove函数中有一个错误,我不匹配maxEval和minEval,这导致AI不能为赢或平局而玩。因此,更正的代码是:

void playMove(int board[9], int player) {
    int finalScore = player * -1000;
    int position;
    for (int i = 0; i < 9; i++) {
        if (board[i] == 0) {
            board[i] = player;
            int score;
            if (player == 1) {
                score = minEval(board);  //Previously Mismatched
            }
            else {
                score = maxEval(board);  //Previously Mismatched
            }
            if (player == 1 && score >= finalScore) {
                finalScore = score;
                position = i;
            }
            else if (player == -1 && score <= finalScore) {
                finalScore = score;
                position = i;
            }
            board[i] = 0;
        }
    }

    board[position] = player;
}
void playMove(智力板[9],智力玩家){
int finalScore=player*-1000;
内部位置;
对于(int i=0;i<9;i++){
如果(板[i]==0){
board[i]=玩家;
智力得分;
如果(玩家==1){
score=minEval(board);//以前不匹配