嘿,我已经在编码4周左右工作了,我现在正在尝试做一款TIC TOC TOW游戏。我已经做到了,以至于我可以玩游戏并找到获胜者。当所有9个空间都满时,我有点困扰着如何确定抽奖。
我还需要在找到获胜者时停止游戏。换句话说,当找到获胜者时,不可能将另一件作品放置。
如果有人可以帮助其中一些,那么它将很棒!
这是我不太友好的代码来确定获胜者。
// check rows
if (GameBoard[0, 0] == 'X' && GameBoard[0, 1] == 'X' && GameBoard[0, 2] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
if (GameBoard[1, 0] == 'X' && GameBoard[1, 1] == 'X' && GameBoard[1, 2] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
if (GameBoard[2, 0] == 'X' && GameBoard[2, 1] == 'X' && GameBoard[2, 2] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
// check columns
if (GameBoard[0, 0] == 'X' && GameBoard[1, 0] == 'X' && GameBoard[2, 0] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
if (GameBoard[0, 1] == 'X' && GameBoard[1, 1] == 'X' && GameBoard[2, 1] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
if (GameBoard[0, 2] == 'X' && GameBoard[1, 2] == 'X' && GameBoard[2, 2] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
// check diags
if (GameBoard[0, 0] == 'X' && GameBoard[1, 1] == 'X' && GameBoard[2, 2] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
if (GameBoard[0, 2] == 'X' && GameBoard[1, 1] == 'X' && GameBoard[2, 0] == 'X') { message = "Winner winner chicen dinner Player 1 You won! GG"; }
// check rows
if (GameBoard[0, 0] == 'O' && GameBoard[0, 1] == 'O' && GameBoard[0, 2] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
if (GameBoard[1, 0] == 'O' && GameBoard[1, 1] == 'O' && GameBoard[1, 2] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
if (GameBoard[2, 0] == 'O' && GameBoard[2, 1] == 'O' && GameBoard[2, 2] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
// check columns
if (GameBoard[0, 0] == 'O' && GameBoard[1, 0] == 'O' && GameBoard[2, 0] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
if (GameBoard[0, 1] == 'O' && GameBoard[1, 1] == 'O' && GameBoard[2, 1] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
if (GameBoard[0, 2] == 'O' && GameBoard[1, 2] == 'O' && GameBoard[2, 2] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
// check diags
if (GameBoard[0, 0] == 'O' && GameBoard[1, 1] == 'O' && GameBoard[2, 2] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
if (GameBoard[0, 2] == 'O' && GameBoard[1, 1] == 'O' && GameBoard[2, 0] == 'O') { message = "Winner winner chicen dinner Player 2 You won! GG"; }
您到目前为止做得很好,似乎您缺少的是使用功能。例如,您可以定义一个函数以检查一行:
bool SingleRowComplete(int rowNum, char player) {
return GameBoard[rowNum, 0] == player && GameBoard[rowNum, 1] == player && GameBoard[rowNum, 2] == player;
}
然后我们可以创建一个包装函数:
bool AnyRowComplete(char player) {
return SingleRowComplete(0, player) || SingleRowComplete(1, player) || SingleRowComplete(2, player);
}
您可以为列和主要对角线创建相似的功能。
一旦下来,您就检查了:
bool PlayerWon(char player) {
return AnyRowComplete(player) || AnyColumnComplete(player) || AnyDiagonalComplete(player);
}
我猜是最后一点,我会说出色的工作,现在学习函数:)
就个人而言,我建议您在需要检查数组时使用循环。它将使您的代码更加干净,更容易阅读。
现在,对于您的第一个问题:当您的游戏开始时,将一些字符赋予数组,而这些字符既不是X''和o"(一个空字符串也是一个选项)。编写一个函数,每次转弯都会在整个数组中迭代并查找初始化值。如果发现,请继续游戏。如果找不到,请更改布尔标志变量以表明游戏结束并以平局结束。
public bool isFull(char[] arr){
for (int i = 0; i < arr.GetLength(0); i++){
for (int j = 0; j < arr.GetLength(1); j++){
if (arr[i, j] == initial_value){
//If array in row i and column j is equal to the inital
//value, return true.
return true;
}
}
}
return false;
}
对于您的第二个问题,我将把一块件放入板上的动作中,该函数将检查我之前提到的标志。如果标志等于" True",则不允许采取行动。我建议以这种方式设置标志:
public void placeGamePiece(Player p){
if (gameEndFlag == false){
//Do the turn
}
else
Console.WriteLine("The game is over!"); //Or any other print
//function you are using.
}
public void startGame(){
public bool gameEndFlag = false;
//..........
gameEndFlag = !isFull(GameBoard);
}
我希望我以足够的方式回答了您的所有问题。请让我知道您是否需要澄清我在这里写的任何内容。如果您尚未学会循环和功能,我建议您现在学习这些循环和功能。