2013-04-21 33 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

相關問題