找出矩阵中水平/垂直对齐的标记



如何在c#中解决井字棋问题

游戏规则是,在一个3*3的正方形棋盘上,玩家轮流。当玩家有3个标记水平或垂直排列时,即为获胜。

player1Marker =  new List<(int x, int y)>
{
(x:2, y:2),
(x:1, y:1),
(x:0, y:2),
(x:2, y:0),
}
player2Marker =  new List<(int x, int y)>
{
(x:0, y:1),
(x:0, y:0),
(x:1, y:2)
}

游戏从player1开始。Player1第一步:[2,2]玩家2第一步:[0,1]等等。

1的玩家获胜与输出[[1],[0,2],[2,0]]

public List<(int x, int y)> GetWinningCombo(List<(int x, int y)> player1Markers, List<(int x, int y)> player2Markers)
{

return new List<(int x, int y)>();
}

有一种方法:

public List<(int x, int y)> GetWinningCombo(List<(int x, int y)> player1Markers, List<(int x, int y)> player2Markers)
{
// make the board
int[,] brd = new int[3, 3];
// add player1 markers
foreach ((int x, int y) mrk in player1Markers)
{
brd[mrk.x, mrk.y] = 1;
}
// add player2 markers
foreach ((int x, int y) mrk in player2Markers)
{
brd[mrk.x, mrk.y] = 2;
}
// check horizontals
for(int i=0; i<=2; i++)
{
if (brd[i, 0] > 0 && brd[i, 0] == brd[i, 1] && brd[i, 1] == brd[i, 2])
return new List<(int x, int y)> { (i, 0), (i, 1), (i, 2) };
}
// check veritcals
for (int i = 0; i <= 2; i++)
{
if (brd[0, i] > 0 && brd[0, i] == brd[1, i] && brd[1, i] == brd[2, i])
return new List<(int x, int y)> { (0, i), (1, i), (2, i) };
}
// check diagonals
if (brd[0, 0] > 0 && brd[0, 0] == brd[1, 1] && brd[1, 1] == brd[2, 2])
return new List<(int x, int y)> { (0, 0), (1, 1), (2, 2) };
if (brd[2, 0] > 0 && brd[2, 0] == brd[1, 1] && brd[1, 1] == brd[0, 2])
return new List<(int x, int y)> { (2, 0), (1, 1), (0, 2) };
// no wins, return empty list
return new List<(int x, int y)>();
}

最新更新