找到tic tac toe胜利者的算法

时间:2016-07-21 06:39:26

标签: java algorithm data-structures

在3x3 Tic tac toe游戏中找出胜者的最佳最佳方式是什么?其中棋盘由矩阵表示?建议请

2 个答案:

答案 0 :(得分:2)

我假设您使用的是Booleans的双维数组。由于布尔值可以有三个值(null,true和false)。由于在任何给定时间只有2名玩家可以玩,因此您只需要三个值。未定义,玩家1和玩家2.

只要大小超过Boolean,这是一种适用于任何1数组的方法。如果true获胜,则会返回true,如果false获胜,则返回false,如果还没有获胜者,则返回null

public static Boolean getWinner(Boolean[][] grid) {
    if (grid == null)
        return null;
    int size = grid.length;
    if (size == 0)
        return null;
    if (size == 1 && (grid[0][0] != null)) {
        return grid[0][0];
    }
    boolean flag = true;
    // checks horizontal
    for (int index = 0; index <= size - 1; index++) {
        flag = true;
        for (int i = 1; i <= size - 1; i++) {
            if (grid[index][i] != grid[index][i - 1]) {
                flag = false;
                break;
            }
        }
        if (flag)
            return grid[index][0];
    }
    // checks vertical
    for (int index = 0; index <= size - 1; index++) {
        flag = true;
        for (int i = 1; i <= size - 1; i++) {
            if (grid[i][index] != grid[i - 1][index]) {
                flag = false;
                break;
            }
        }
        if (flag)
            return grid[0][index];
    }
    // checks diagonal
    flag = true;
    for (int index = 1; index <= size - 1; index++) {
        if (grid[index][index] != grid[index - 1][index - 1]) {
            flag = false;
            break;
        }
    }
    if (flag)
        return grid[0][0];
    flag = true;
    for (int index = 1; index <= size - 1; index++) {
        if (grid[size - index - 1][index] != grid[size - index][index - 1]) {
            flag = false;
            break;
        }
    }
    if (flag)
        return grid[size - 1][0];
    return null;
}

旁注: 如果您使用的是Enum而不是Boolean,那么您只需更改第一行的两个Booleans==的所有equals < / p>

答案 1 :(得分:1)

这些功能应该这样做。我做了我的井字游戏后,我使用了一个字符数组。

int  rowcheck(char ch[3][3])
{
    int i;
    char ans;
    for(i=0;i<3;i++)
    {
        if(ch[i][0]==ch[i][1] && ch[i][1]==ch[i][2])
        {
            ans=ch[i][0];
            break;
        }
    }
    if(ans=='O')
    return 1;
    else if(ans=='X')
    return 2;
    else
    return 0;
}
int  colcheck(char ch[3][3])
{
    int i;
    char ans;
    for(i=0;i<3;i++)
    {
        if(ch[0][i]==ch[1][i] && ch[1][i]==ch[2][i])
        {
            ans=ch[0][i];
            break;
        }
    }
    if(ans=='O')
    return 1;
    else if(ans=='X')
    return 2;
    else
    return 0;
}
int  diagcheck(char ch[3][3])
{
    char ans;
    if(ch[0][0]==ch[1][1] && ch[1][1]==ch[2][2])
    ans=ch[0][0];
    if(ch[0][2]==ch[1][1] && ch[1][1]==ch[2][0])
    ans=ch[0][2];
    if(ans=='O')
    return 1;
    else if(ans=='X')
    return 2;
    else
    return 0;
}

如果1返回,则玩家1获胜,否则玩家2获胜。 查看此链接以获取更多信息:

https://keepkoding.wordpress.com/2015/12/12/everybody-knows-tic-tac-toe/

请注意,这个链接是用C ++编写的,但逻辑很容易理解。