c# Tic Toc Tow determin draw



嘿,我已经在编码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);
}

我希望我以足够的方式回答了您的所有问题。请让我知道您是否需要澄清我在这里写的任何内容。如果您尚未学会循环和功能,我建议您现在学习这些循环和功能。

最新更新