簡體   English   中英

檢查勝利者井字游戲Java

[英]Check for Winner Tic Tac Toe game Java

問題尚未解決,但必須予以解決。

問題是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

您正在檢查播放器是否處於每個棋盤位置。

您想確定沒有贏家。 這意味着檢查所有行,列和對角線是否都沒有播放器。

您不檢查“計算機”是否贏了,如果計算機沒有贏了,那么玩家可以將tieGame標志設為true

對於所有9個條件,將GameBoard[0][0] == player更改為GameBoard[0][0] != 0

錯誤出在函數的主要代碼/結構中。 您的函數需要返回兩個變量,即finalwinner和平局。 現在,您的函數在第一個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;
            }

            }

編輯: 有關枚舉的信息

這可能不是您想要的,但是我強烈建議您采用其他移動/板表示法:

怎么樣

首先,我建議您將板單元實現為枚舉(因為只有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);

從您的won方法檢查(注意,您需要檢查所有子集)可能是:

moves.containsAll(lineA)

其中move是玩家進行的一組動作(當玩家進行移動時,請將枚舉添加到其動作集中)。

為什么

這種設計更加簡潔,直接和優雅。 如果使用此方法,則您不應再遇到上述問題。

首先,在您的主要方法中,您說的是finalwinner=CheckForWinner(currentplayer); 因此您不必設置finalwinner=true; 每次檢查行,列和對角線之后。 return true; 足夠。

您的問題是,您檢查是否有平局游戲,如果是這種情況,您還返回true,但這是錯誤的,因為玩家和計算機都不會贏! 因此,您的checkForWinner方法始終返回true

您實際上並不需要為“領帶游戲”做額外的檢查。 只要檢查玩家是否獲勝,檢查計算機是否獲勝,如果兩者都是錯誤的且最后一招都完成了-這是一場平局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM