井字游戏确定获胜者

本文关键字:获胜者 游戏 | 更新日期: 2023-09-27 18:00:57

     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 = 游戏板。我正在尝试创建一种方法来确定一个简单的基于控制台的井字游戏的获胜者。对于游戏板,我有一个二维字符数组,最初填充有"+"符号。玩家职业在 2 个玩家回合之间切换,检查每次是否找到获胜者。我想我可以使用很多 if 语句来确定获胜者,因为有 8 种可能的解决方案,但我正在寻找一种使用更少行空间的方法。上面的代码显示了我的初始方法(通过 if 语句检查每个可能的解决方案(。

井字游戏确定获胜者

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

        // 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 */ }

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

因此,我建议将更多的实施作为一种练习。

创建一个具有起点和终点的Line类。您还可以在 Line 上实现移动到下一行运算符,以旋转它。然后,您可以按照简单的规则移动起点和终点,简单地循环浏览所有线条。

然后,在电路板上创建一个运算符,允许您将一条线应用于电路板,如果该线路路径上的每个板案例都具有相同的符号,则返回 true。

这样,您可以使用以下内容简单地检查董事会位置是否获胜:

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

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

MoveToNextLine只是根据您决定的顺序在您的起点和终点周围移动。

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