2

我正在用 C# 制作 Connect 4 控制台游戏。除了功能之外,我已经设置了所有应用程序并正常工作hasGameBeenWon()。该函数在 Main 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;
    }

(显然,这段代码是不完整的)

...是它当前的样子,currentTurnvar 是当前玩家回合的 int 值(可以是 1 或 2)。BLUE 和 RED 是分配了值 1 和 2 的常量,当应用程序打印到控制台时,它们在板上转换为蓝色和红色。

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

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

4

1 回答 1

1

我将假设这只是一些带有andboard的二维值数组,并且您想要“连接”(在您的示例中是)。enum Cell {NONE, BLUE, RED}widthheightNN4

一个简单的向量类:

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>)元组描述了 position 的胜利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();

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

于 2013-04-21T18:34:31.960 回答