2013-04-21 34 views
2

我在C#中进行连接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; 
    } 

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

...是怎么了目前看起来,当前玩家的回合currentTurn变种是int值(它可以是1或2)。 BLUE和RED是常数,它们被分配值1和2,当应用程序打印到控制台时,这些值在板上被转换成蓝色和红色。

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

无论如何,我可以加快检查整个董事会,或者可能跳过检查整个董事会,可能只是搜索相关领域?

+2

如果您打算发布代码,它可能会帮助您发布与您的问题有关的所有相关代码。根据代码的这一部分,很难确定您正在做什么..显示如何定义“board”以及 – MethodMan 2013-04-21 18:03:46

+1

1)请使用命名常量/对象而不是整数文字。 2)不要在主'do ... while'循环中进行检查。相反,在每次移动后执行check _once_。 3)我不认为效率应该是这样一个简单的检查/游戏的主要关注。让它首先使用可读/可维护的代码工作,然后决定是否需要优化。 – 2013-04-21 18:04:11

+0

添加电路板阵列。这应该很简单 – nmat 2013-04-21 18:04:25

回答

1

我要去假设board只是一些enum Cell {NONE, BLUE, RED}值的2-d阵列widthheight并要“连接N”(其中在你的例子N4)。

一个简单的载体类:

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

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

+0

嗨,对于迟到的回复感到抱歉。我试过这个,但它给了我错误的“不能隐式转换Cell.NONE到Cell.BLUE” – 2013-05-03 10:22:55

+0

@Simon Fletcher是'Cell.NONE'和'Cell.BLUE'不是同一类型?我以为'Cell'是一个枚举? – 2013-05-03 14:34:27

相关问题