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