0
     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 语句检查每个可能的解决方案)。

4

2 回答 2

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.

于 2013-02-25T19:50:22.740 回答
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 */ }
于 2013-02-25T19:28:04.317 回答