【问题标题】:Check for Winner Tic Tac Toe game Java检查获胜者井字游戏 Java
【发布时间】:2016-05-12 23:30:57
【问题描述】:

问题尚未解决,但必须解决。

【问题讨论】:

  • 这段代码可以极大地受益于一些for 循环。这太重复了。
  • 我之前有 for 循环,但它不起作用,经过这么长时间的尝试,我给出了一个解决的 if 语句
  • 井字游戏最简单的模型是一个 9 槽阵列。使用二维数组版本是不必要的复杂性。值得深思。
  • 另一种很酷的方法是使用1 代表播放器,使用4 代表计算机。然后,您可以将行/列/对角线相加并从中得出含义。 1 和 4 很有用,因为当您将不同的可能排列相加时,含义上不会有任何重叠。
  • 我已经回滚了你的问题,因为当问题解决后,最好发布答案。如果您不想这样做,只需留下已解决的编辑即可。删除问题意味着社区无法再从答案中受益。

标签: java arrays tic-tac-toe


【解决方案1】:

问题在于 if 语句中的这个表达式:

GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player &&
                    GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player &&
                    GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player

您正在检查玩家是否在每个棋盘位置。

您想确定没有获胜者。这意味着检查行、列和对角线中没有相同的玩家。

【讨论】:

  • 但是我有 if 语句来检查对角线、行和列是否获胜,所以最后的可能性是,如果所有的地方都被占用了,那么没有宣布获胜者,因为其他 if 语句没有抓住它,因此一定没有赢家,这是一场平局?这有意义吗,我不知道我的逻辑可能有缺陷。
  • @JaneDoe 您甚至可以更早地检测到平局。如果每一行、每一列、每一对角线都有一个 X 和一个 O,则游戏平局。
【解决方案2】:

您没有检查“计算机”是否赢了,如果计算机没有赢,玩家也没有,那么您可以将 tieGame 标志设置为 true

【讨论】:

    【解决方案3】:

    编辑:Info on enums

    这可能不是您想要的,但我强烈建议您使用不同的移动/棋盘表示:

    如何

    首先,我建议您将板单元实现为枚举(因为只有 9 个)。

    然后,将板子实现为一组 9 个枚举,如下所示:

    public enum Move {
    A0, A1, A2, B0, B1, B2, C0, C1, C2; }
    

    此外,将获胜模式(例如整条线、整条对角线)实现为 3 个枚举的集合(即棋盘集的子集)。

    进行这些更改后,检查玩家(无论是您还是计算机)是否获胜变得容易得多。

    我建议您在 Move 类中添加子集和检查玩家是否获胜的方法。

    可以这样创建子集: 例如

    static private final EnumSet<Move> lineA = EnumSet.of(A0,A1,A2);
    

    从您的获胜方法中进行的检查(注意您需要检查所有子集)可能是:

    moves.containsAll(lineA)
    

    其中moves是玩家做出的一组动作(当玩家做出动作时,您将枚举添加到它的动作集合中)。

    为什么

    这种设计更加简洁、直接、优雅。如果您使用这种方法,您应该不会再遇到您描述的问题。

    【讨论】:

    • 我对java很基础,我还是个初学者,所以我不知道枚举是什么,所以我用了一个二维数组!
    • 那我推荐你docs.oracle.com/javase/tutorial/java/javaOO/enum.html。在你的情况下,枚举是更好的方法,所以如果我是你,我会花 10-15 分钟来阅读并为你的解决方案实施枚举。
    【解决方案4】:

    将所有 9 个条件的 GameBoard[0][0] == player 更改为 GameBoard[0][0] != 0。

    【讨论】:

      【解决方案5】:

      首先,在您的主要方法中,您说finalwinner=CheckForWinner(currentplayer);,因此您不必每次检查行、列和对角线后都设置finalwinner=true;。 return true; 就够了。

      您的问题是,您检查平局游戏,如果是这样,您也返回 true,但这是错误的,因为玩家和计算机都没有获胜!所以你的 checkForWinner 方法 always 返回 true。

      您实际上不必为 Tie Game 进行额外检查。只需检查玩家的胜利,检查计算机的胜利,如果两者都是错误的并且最后一步完成 - 这是一场平局。

      【讨论】:

        【解决方案6】:

        错误出现在函数的主要代码/结构中。您的函数需要返回两个变量,finalwinner 和 tie game。现在,您的函数在第一个 return 语句处停止,并将其设置为 main 中的 finalwinner。

        试试这样的:

        public static boolean[] CheckForWinner(int player)
                {
                    //Row and Column Check
                    if (GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player ||
                        GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player ||
                        GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player ||
                        GameBoard[0][0] == player && GameBoard[1][0] == player && GameBoard[2][0] == player ||
                        GameBoard[0][1] == player && GameBoard[1][1] == player && GameBoard[2][1] == player ||
                        GameBoard[0][2] == player && GameBoard[1][2] == player && GameBoard[2][2] == player)
                        {
                            boolean finalwinner=true;
                        }
        
                    //diagonal checks
                    if (GameBoard[0][0]==player && GameBoard[1][1]==player && GameBoard[2][2]==player)
                    {
                        boolean finalwinner=true;
                    }
        
                    if (GameBoard[2][0]==player && GameBoard[1][1]==player && GameBoard[0][2]==player)
                    {
                        boolean finalwinner=true;
                    }
        
                    //Tie Game Check
                    if (GameBoard[0][0] == player && GameBoard[0][1] == player && GameBoard[0][2] == player &&
                        GameBoard[1][0] == player && GameBoard[1][1] == player && GameBoard[1][2] == player &&
                        GameBoard[2][0] == player && GameBoard[2][1] == player && GameBoard[2][2] == player)
                        {
                        boolean tieGame=true;
                    }
                    return new boolean [] {finalwinner, tiegame};
                }
        
        public static void main (String[] args)
                        {
                        System.out.println("Tic Tac Toe Game");
                        System.out.println("Player 1 is 1, Computer is 2");
                    Draw();
                    currentplayer=1;
                    while (winner!= true)
                    {
                        if(currentplayer==1)
                            {
                                System.out.println("Your Turn");
                                Player1Turn(currentplayer);
                            }
                        else
                            ComputerTurn(currentplayer);
        
                        boolean result[] = CheckForWinner(currentplayer);
        
                        if(result[0]==true && result[1]==false)
                        {
                            System.out.println("Winner is Player" +currentplayer+ "Congrats Champion!");
                            System.out.println("Beginning New Game! Press Cancel then Enter to Exit");
                            Reset();
                        }
        
                        if(result[1]==true)
                        {
                            System.out.println("It's a Tie! Play Again.");
                            System.out.println("Beginning New Game! Press Cancel then Enter to Exit");
                            Reset();
                        }
        
                        if(currentplayer==1)
                            currentplayer=2;
                        else if(currentplayer==2)
                            currentplayer=1;
                    }
        
                    }
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多