连接4的Minimax代码使最佳移动

时间:2015-04-05 19:13:55

标签: c algorithm artificial-intelligence minimax

我最近尝试为连接4实现minimax算法,但我无法让它工作。 这是我的heuristicAIminimax代码。完整代码为here。我不知道它能做出正确行动的问题在哪里。

int heuristic(int s[6][7]) {
    int result = 0;
    int i, j;

    //check horizontals
    for(i=0; i<6; i++)
        for(j=0; j<=7-4; j++){
            if(s[i][j]!= 2 && s[i][j+1]!= 2 && s[i][j+2]!= 2 && s[i][j+3]!= 2)
                result++;
            if(s[i][j]!= 1 && s[i][j+1]!= 1 && s[i][j+2]!= 1 && s[i][j+3]!= 1)
                result--;
        }

    //check verticals
    for(i=0; i<=6-4; i++)
        for(j=0; j<7; j++){
            if(s[i][j]!= 2 && s[i+1][j]!= 2 && s[i+2][j]!= 2 && s[i+3][j]!= 2 )
                result++;
            if(s[i][j]!= 1 && s[i+1][j]!= 1 && s[i+2][j]!= 1 && s[i+3][j]!= 1 )
                result--;
        }

    return result;
}

int minimax(int board[R][C], int depth, int turn /*1 or 2*/) {
    int e;
    int col, best;
    int n;
    int player;
    if((e=endgame(board, player))) {
        if(e==3)
            return 0;
        if(e==turn)
            return 10000;
        else
            return -10000;
    }

    if(depth==0)
        return ((turn==1) ? heuristic(board) : -heuristic(board));

    best = -10000;

    for(col=0; col < 7; col++)     //check every move
        if(board[6-1][col]==0) {   //make sure column isn't empty
            put(board, col, turn);
            n = minimax(board, depth-1, 3-turn);
            if(turn==1) {
                if ( -n > best ) best = -n;
            } else { //turn==2
                if ( -n > best ) best = -n;
            }
            rmv(board, col);
        }

    return best;
}

int ai(int board[R][C], int depth) {
    int col, move;
    int n, val = -10000-1;

    for(col=0; col < 7; col++)
        if(board[6-1][col]==0) {
            put(board, col, 2);
            n = minimax(board, depth, 1);
            if ( -n > val ) {
                val = -n;
                move = col;
            }
            rmv(board, col);
        }

    return move;
}

1 个答案:

答案 0 :(得分:2)

查看Dropbox上的代码:

void rmv(int board[6][7], int column) { 
    int i;
    for (i=R-1; i>=0; i--){
        if (board[i][column] != 0) {
            board[i][column] = 0;
        }
    }
}

循环中没有中断,因此每次撤消移动时,您都会删除该列中的每个部分。

另外我认为在僵局代码中坐标是错误的方式:

for(i=0; i<7; i++)
    if(s[i][6-1]==0)
        return 0;

我认为这应该是:

for(i=0; i<7; i++)
    if(s[6-1][i]==0)
        return 0;

结束游戏检测代码也看起来很奇怪:

int player;
if((e=endgame(board, player)))

这是将未初始化的变量播放器传递给最终游戏功能,这似乎不太可能是正确的。