Tic-Tac-Toe决定胜利者

时间:2013-02-25 18:52:24

标签: c# arrays console char

     public void CheckWin()
  {
     if (spillebræt[0, 0] == 'X' && spillebræt[1, 0] == 'X' && spillebræt[2, 0] == 'X')
     {
        Console.WriteLine("Player 1 wins!\nPress ENTER to end game");
        Console.ReadLine();
        Environment.Exit(0);
     }
  } 

Spillebræt=游戏板。我正在尝试创建一种方法来确定一个简单的基于控制台的Tic Tac Toe游戏的获胜者。对于游戏板,我有一个2维字符数组,最初填充'+'符号。玩家等级在两个玩家之间转换,检查每次是否找到胜利者。我想我可以使用很多if语句来确定胜利者,因为有8种可能的解决方案,但我正在寻找一种使用更少行间距的方法。上面的代码显示了我的初始方法(通过if语句检查每个可能的解决方案)。

2 个答案:

答案 0 :(得分:0)

您可以拥有一个包含所有获胜案例的矩阵,并检查当前状态是否为获胜状态:

        // Example
        var matrix = new[,] { { "O", "+", "+" }, { "O", "+", "+" }, { "O", "+", "+" } };

        var wins = new List<string> {
             "100100100", // 1st column vertical
             "010010010", // 2nd column vertical
             "001001001", // 3rd column vertical
             "111000000", // 1st row horizontal
             "000111000", // 2nd row horizontal
             "000000111", // 3rd row horizontal
             "100010001", // top-left bottom-right diagonal
             "001010100"  // top-right bottom-left diagonal
            };

        // Crosses (X)
        var check = new List<string> {"0", "0", "0", "0", "0", "0", "0", "0", "0"};
        for (var i = 0; i < 3; i++)
            for (var j = 0; j < 3; j++)
                if (matrix[i, j] == "X") check[i*3 + j] = "1";
        if (wins.Contains(string.Join("", check))) { /* crosses win */ }

        // Circles (O)
        check = new List<string> { "0", "0", "0", "0", "0", "0", "0", "0", "0" };
        for (var i = 0; i < 3; i++)
            for (var j = 0; j < 3; j++)
                if (matrix[i, j] == "O") check[i * 3 + j] = "1";
        if (wins.Contains(string.Join("", check))) { /* circles win */ }

答案 1 :(得分:0)

你总是可以写出所有各种情况,但它很麻烦,而且不能扩展(如果你想扩展电路板怎么办?)。

所以我建议更多参与实施作为练习。

您创建一个Line类,包含起点和终点。您还可以在Line上实现移动到下一行运算符,然后旋转它。然后,您可以通过简单规则移动起点和终点来循环遍历所有线。

然后,在电路板上创建一个操作员,让您将一条线应用到电路板上,如果线路路径上的每个电路板外壳都符号相同,则返回true。

通过这种方式,您可以使用以下内容检查董事会职位是否胜出:

for (Line l = new Line() ; l.Valid() ; l.MoveToNextLine())
{
    if (board.WinningLine(l))
        return true;
}
return false;

当然,您可以根据需要进行自定义,例如将MoveToNextLine替换为operator ++等等。您的线路上应该有end状态,以便您可以跳出循环而不是一遍又一遍地继续。

MoveToNextLine只会根据您决定的顺序在起点和终点附近移动。

现在你可以看到,如果你想在n x n板上扩展你的游戏,那将非常简单:你只需要更新MoveToNextLine