[英]Tic Tac Toe Console Game Java - Check Winner method not working
[英]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.