最简单和可能是最有效的方法来检查数组中一行中的数据
本文关键字:数组 数据 一行 检查 方法 有效 最简单 | 更新日期: 2023-09-27 18:10:18
我正在用c#制作一款《Connect 4》主机游戏。除了hasGameBeenWon()
函数外,我已经设置了所有的应用程序并正常工作。函数在Main函数中调用。While循环,当游戏没有获胜时返回false。
static bool gameHasEnded(int currentTurn)
{
int currentTurnPiece;
if (currentTurn.Equals(1))
{
currentTurnPiece = BLUE;
}
else if (currentTurn.Equals(2))
{
currentTurnPiece = RED;
}
return false;
}
(显然,这段代码是不完整的)
…这是它当前的样子,currentTurn
变量是当前玩家回合的int值(它可以是1或2)。BLUE和RED是分配值为1和2的常量,当应用程序打印到控制台时,它们在板上转换为蓝色和红色。
现在我困在如何检查游戏是否已经赢得有效和尽可能简单。董事会存储在一个名为board
的数组中,我需要检查是否有一组4个相同的值向上/向下,向左/向右,以及在所有方向上对角线。上/下和左/右检查并不难,但我认为对角线可能有点慢,因为每次都要检查。
我是否可以加快检查整个棋盘,或者可能跳过检查整个棋盘,可能只搜索相关区域?
我将假设board
只是enum Cell {NONE, BLUE, RED}
值与width
和height
的一些二维数组,并且您想要"连接N
"(在您的示例中N
是4
)。
一个简单的vector类:
class Vec
{
public int i;
public int j;
public Vec(int i, int j) { this.i = i; this.j = j; }
}
描述胜利的模式/模板类型:
var winTemplates = new List<List<Vec>>
{
Enumerable.Range(0, N).Select(x => new Vec(x, 0)).ToList(),
Enumerable.Range(0, N).Select(x => new Vec(0, x)).ToList(),
Enumerable.Range(0, N).Select(x => new Vec(x, x)).ToList(),
Enumerable.Range(0, N).Select(x => new Vec(N - x - 1, x)).ToList()
};
是否存在(Cell, List<Vec>)
元组来描述在位置p
的胜利?
Func<Vec, Tuple<Cell, List<Vec>>> getWin = p => winTemplates
.SelectMany(winTemplate => winTemplate
.Select(q => new Vec(p.i + q.i, p.j + q.j))
.GroupBy(v => board[v.i, v.j])
.Where(g => g.Key != Cell.NONE && g.Count() == N)
.Select(g => Tuple.Create(g.Key, g.ToList())))
.FirstOrDefault();
在棋盘上有赢的地方吗?
Func<Tuple<Cell, List<Vec>>> findWin = () => Enumerable.Range(0, height - N)
.SelectMany(i => Enumerable.Range(0, width - N).Select(j => new Vec(i, j)))
.Select(p => getWin(p))
.FirstOrDefault();
这只是浏览器代码,所以它可能有拼写错误。如果你需要更多的帮助来理解它,请在评论中告诉我。