Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Java tic-tac-toe的获胜者搜索算法_Java_Algorithm_Data Structures - Fatal编程技术网

Java tic-tac-toe的获胜者搜索算法

Java tic-tac-toe的获胜者搜索算法,java,algorithm,data-structures,Java,Algorithm,Data Structures,在以矩阵表示棋盘的3x3井字游戏中,找出赢家的最佳方法是什么?建议请这些功能应该可以。我在做tic-tac-toe时使用了一个字符数组 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];

在以矩阵表示棋盘的3x3井字游戏中,找出赢家的最佳方法是什么?建议请

这些功能应该可以。我在做tic-tac-toe时使用了一个字符数组

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;
}
int行检查(char ch[3][3])
{
int i;
查尔安斯;

对于(i=0;i我假设您使用的是一个由
Booleans
组成的二维数组。因为布尔值可以有三个值(null、true和false)。因为在任何给定时间只有两个玩家可以玩,那么您只需要三个值。未定义,玩家1和玩家2

这里有一个方法,只要大小大于
1
就可以处理任何
Boolean
数组。如果
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;
}
公共静态布尔getWinner(布尔[][]网格){
if(grid==null)
返回null;
int size=grid.length;
如果(大小==0)
返回null;
如果(大小==1&&(网格[0][0]!=null)){
返回网格[0][0];
}
布尔标志=真;
//水平检查

对于(int index=0;index是的,我理解逻辑,谢谢!!!但是有没有更好的方法,比如时间复杂度更低的方法呢?如果你需要检查等式,我看没有比这更好的方法了。另外,考虑到你在玩井字游戏,我看不出有理由降低时间复杂度。但是如果你必须这样做,最简单的方法是至少在已经做了6步。考虑到只能做9步,这将减少超过三分之二的时间。如果你喜欢我的答案,请投票。@AkshayBhat Umm也许你应该检查我的答案,寻找一种更有效的算法,可以让你在任何给定大小的数组中获胜。@nickzoum是的,有点泛化是很好的。这是一个在我刚粘贴代码的第一个游戏中,当时我刚刚开始编程。在后来的游戏中,我开始概括和适当的评论。谢谢你的提示,请随时查看我的博客,了解其他游戏,如Snake或Sudoku解算器。可能重复的感谢我成功地实现了把它涂上薄荷!!