我正在制作一个扫雷游戏,到目前为止,它是完全可玩的,您可以完成游戏。但是,我的解决算法很糟糕。这很混乱,我正在寻找一种更干净的方式,也许是循环,但我想不到任何东西。
这是我目前正在使用的:
我有四个全局列表:
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个相邻瓷砖。有任何想法吗?谢谢:)
使用洪水填充。这是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