我做了一个flip-game,我正试图让一个方法给玩家一个关于他们下一步行动的暗示。基本上,我正在尝试使用广度优先搜索来解决游戏,然后向玩家展示下一步行动。但是,我的算法遇到了一些问题。 Exit()
只是为了帮我调试。无论如何,算法成功地将当前游戏状态isWhite
添加到gameStates
并检查它是否是解决方案。当我尝试添加到队列时出现问题。我的代码永远不会到达第二个Exit()
,我无法弄清楚原因。任何帮助,将不胜感激。感谢。
编辑:问题已解决。现在我只需要找出解决方案后该如何解决...
private void hint()
{
Queue<bool[,]> statesToCheck = new Queue<bool[,]>();
List<bool[,]> closedStates = new List<bool[,]>();
bool[,] rootState = new bool[4, 4];
rootState = (bool[,])isWhite.Clone();
statesToCheck.Enqueue((bool[,])rootState.Clone());
//closedStates.Add((bool[,])rootState.Clone());
while (statesToCheck.Count() > 0)
{
bool solved = true;
//checks for solution state
rootState = statesToCheck.Dequeue();
for (int row = 0; row < GAME_SIZE; row++)
for (int col = 0; col < GAME_SIZE; col++)
{
if (!rootState[row, col])
solved = false;
}
if (solved)
{
//add something to do
System.Diagnostics.Debug.Write("It worked");
return;
}
else
{
closedStates.Add((bool[,])rootState.Clone());
}
//simulates clicking each space and adds each one to statesToCheck
for (int row = 0; row < GAME_SIZE; row++)
for (int col = 0; col < GAME_SIZE; col++)
{
bool[,] stateToChange = new bool[4, 4];
stateToChange = (bool[,])rootState.Clone();
flip(stateToChange, row, col);//gets next gameState (next node in a typical breadth-first search)
if (!closedStates.Contains(stateToChange))
{
//closedStates.Add((bool[,])rootState.Clone());
statesToCheck.Enqueue((bool[,])stateToChange.Clone());
}
}
}
答案 0 :(得分:1)
如果您需要调试代码,为什么不使用断点,而不是调用Exit
并关闭程序?
通过这种方式,您可以按指令分析指令并了解代码中发生的情况。
修改强>
您声明的stateToCheck
与您在checkedStates
中添加的List
相同,并且您在“模拟点击每个空格并将每个空间添加到游戏状态”中编辑的相同,所以我认为您更改了该二维数组,您也更改了checkedStates.Contains(stateToCheck)
中的那个,因为它们具有相同的引用。
这就是{{1}}始终为真的原因。