2012-10-31 75 views
2

我正在做一個掃雷遊戲,到目前爲止它完全可玩,你可以完成遊戲。但是,我的解決算法很糟糕。這很雜亂,我正在尋找一種更乾淨的方式,也許帶有循環,但我什麼都想不到。改進我的掃雷算法c#

這裏是我目前使用:

我有四個全局列表:

List<String> flaggedButtons = new List<String>(); 
    List<String> minedNodes = new List<String>(); 
    List<String> playingField = new List<String>(); 
    List<String> adjacence = new List<String>(); 

,這是利用該列表來解決遊戲方法:

整個方法:http://pastebin.com/7J2Fc8yw

最重要的部分:

  char btnLetter = Convert.ToChar(buttonName.Substring(0, buttonName.Length - 1)); 
      char aboveLetter = btnLetter; aboveLetter--; 
      char belowLetter = aboveLetter; belowLetter++; belowLetter++; 
      int upDown = Convert.ToInt32(buttonName.Substring(1)); 
      int leftSide = Convert.ToInt32(buttonName.Substring(1)) - 1; 
      int rightSide = Convert.ToInt32(buttonName.Substring(1)) + 1; 

      //Clear the list by making a new list before adding the new values as to not overlap. 
      adjacence = new List<String>(); 

      //Put all adjacent sides in to a list 
      adjacence.Add(Convert.ToString(btnLetter.ToString() + leftSide)); 
      adjacence.Add(Convert.ToString(btnLetter.ToString() + rightSide)); 
      adjacence.Add(Convert.ToString(aboveLetter.ToString() + leftSide)); 
      adjacence.Add(Convert.ToString(aboveLetter.ToString() + rightSide)); 
      adjacence.Add(Convert.ToString(belowLetter.ToString() + leftSide)); 
      adjacence.Add(Convert.ToString(belowLetter.ToString() + rightSide)); 
      adjacence.Add(Convert.ToString(aboveLetter.ToString() + upDown)); 
      adjacence.Add(Convert.ToString(belowLetter.ToString() + upDown)); 

基本上這是我需要幫助的部分。它可以工作,但很麻煩。我知道我應該使用循環和什麼,但我不能找出一種方法來循環使它更清潔。基本上它在做的是找到你按下的瓷磚周圍的所有8個相鄰的瓷磚。 任何想法?謝謝:)

+0

+1只是因爲我喜歡這個問題。 Off-Topic:如果你想改善洗牌,可以用這個來洗牌:'fields.OrderBy(p => Guid.NewGuid())' –

回答

5

使用洪水填充。這是MS在其中使用的算法。可能更改爲存儲單元格值而不使用字符串的數組。

enum CellType 
{ 
    Bomb, 
    Flag, 
    Hidden, 
    Empty 
} 

CellType[,] cells = new CellType[10,10]; 

基本上,當有人點擊一個單元格檢查以查看它是否隱藏時,檢查它周圍的單元格是否隱藏。隱藏你周圍的每個單元格將添加到隊列或堆棧,然後返回跟蹤。 http://en.wikipedia.org/wiki/Flood_fill

更新: 下面是C#中的完整示例。這些是遞歸的,而不是使用一些回溯的集合 https://gamedev.stackexchange.com/questions/31909/best-algorithm-for-recursive-adjacent-tiles

+0

+1感興趣的鏈接 –

+0

感謝提示,在閱讀中我看到它只適用於一個多維數組?因此,我填充我的網格的方式將不起作用: http://pastebin.com/AN1ikXRn 這就是我如何填充它。爲了得到它的工作,我需要一個9x9陣列,而不是81陣列陣列? 據我所知,你不能以編程方式填充數組,因爲你不能追加到它們,你只能追加到列表。有沒有辦法將我的列表轉換爲多維數組..或者,以編程方式創建多維數組?謝謝。 – Anteara

+0

http://pastebin.com/e4NmraTQ – AbdElRaheim