C# 检查数组中某一行中的数据的最简单且可能最有效的方法

C# 检查数组中某一行中的数据的最简单且可能最有效的方法,c#,C#,我正在用C语言制作一个Connect 4控制台游戏。除了hasGameBeenWon函数外,我所有的应用程序都已正确设置和运行。该函数在主do…while循环中调用,当游戏尚未获胜时返回false static bool gameHasEnded(int currentTurn) { int currentTurnPiece; if (currentTurn.Equals(1)) { currentTurn

我正在用C语言制作一个Connect 4控制台游戏。除了hasGameBeenWon函数外,我所有的应用程序都已正确设置和运行。该函数在主do…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。蓝色和红色是分配值1和2的常量,当应用程序打印到控制台时,这些值在电路板上转换为蓝色和红色

现在我被困在如何检查游戏是否已经赢得了有效和尽可能简单。电路板存储在一个名为board的数组中,我需要检查是否有一组4个相同的值向上/向下、左/右以及所有方向的对角线。检查上/下和左/右并不是那么难,但对角线我认为可能有点慢,每次都要检查

无论如何,我是否可以加快检查整个电路板,或者可能跳过检查整个电路板,并可能只搜索相关区域?

我将假设电路板只是一个二维数组,包含宽度和高度的枚举单元{NONE,BLUE,RED}值,并且您希望连接N,在您的示例中,N是4

一个简单的向量类:

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()
};
在董事会的任何地方都有赢家吗

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();

这只是浏览器代码,所以可能有输入错误。如果您需要更多帮助来理解它,请在评论中告诉我。

如果您要发布代码,如果您发布与您的问题相关的所有代码,可能会有所帮助。。根据这一段代码很难确定您正在做什么。。显示如何定义板1请使用命名常量/对象而不是整数文本。2不要费心在主do…while循环中执行检查。而是在每次移动后执行一次检查。3我认为效率不应该是这种简单的检查/游戏的首要考虑因素。首先让它使用可读/可维护的代码,然后决定是否需要优化。添加板阵列。这应该是简单的,从那里嗨,为迟到的答复感到抱歉。我已经试过了,但它给了我一个错误,即不能隐式地将Cell.NONE转换为Cell。BLUE@SimonFletcher是Cell.NONE和Cell.BLUE不是同一类型的吗?我以为Cell是一个枚举?
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();