C# “检测”;“不要再动了”;在益智游戏中

C# “检测”;“不要再动了”;在益智游戏中,c#,xna,puzzle,C#,Xna,Puzzle,不久前,我用Flash编写了一个小游戏,现在我正在用新的编程经验用C#重新编码。然而这一次,我希望能够实现检测网格何时变得不可能解决的想法。这更像是一个概念上的难题,但我会尽你所能 游戏包括在地图上上上下左右移动玩家,推块。当没有剩余的特定类型的方块时,将赢得该关卡。然而,很容易在一张不再可解的地图上找到自己。例如,如果玩家一开始被困在一圈墙砖中,那么根本就没有办法解决它 很抱歉提出这个抽象的问题,但是有人对此有什么建议吗?您基本上有两种选择。两者都有优点和缺点,所以您可能希望将两者的想法结合到

不久前,我用Flash编写了一个小游戏,现在我正在用新的编程经验用C#重新编码。然而这一次,我希望能够实现检测网格何时变得不可能解决的想法。这更像是一个概念上的难题,但我会尽你所能

游戏包括在地图上上上下左右移动玩家,推块。当没有剩余的特定类型的方块时,将赢得该关卡。然而,很容易在一张不再可解的地图上找到自己。例如,如果玩家一开始被困在一圈墙砖中,那么根本就没有办法解决它


很抱歉提出这个抽象的问题,但是有人对此有什么建议吗?

您基本上有两种选择。两者都有优点和缺点,所以您可能希望将两者的想法结合到您的解决方案中

选项1:编写启发式

想想那些让游戏无法解决的情况(比如被困在一圈墙中)。检测此类情况,并在出现此类情况时立即打印“不再移动”。你能想到和实现的情况越多,你的算法就越好

优点:简单快捷

缺点:在某些情况下,游戏无法解决,但您的算法无法检测到它

选项2:编写求解器

编写一个程序,在给定游戏状态(玩家在哪里、区块在哪里等)的情况下,输出一个可以用来解决游戏的步骤列表(或
null
或在没有解决方案时的一些其他特殊值——这是“不再移动”的情况)

如何实现这样的东西取决于游戏的确切规则。一个简单的方法是在树上做一个动作:树中的每个节点都是一个游戏状态,节点之间的每个弧都是玩家可能采取的动作(上移、下移等)

优点:这可以可靠地检测到游戏何时无法再赢。此外,该程序可用于在玩家陷入困境时向其提供提示


缺点:根据游戏的复杂性,计算解决方案可能需要花费很多时间。对于非常简单的游戏,这是可行的;对于一些简单的游戏,它可能需要很长的时间,而对于相当复杂的游戏,如国际象棋或西洋跳棋,这是非常困难或不可能的。

对于几乎任何情况,都有蛮力的方法-只需创建玩家可以执行的整个移动树。如果没有一个能赢,这场比赛就不可能赢

当然,对于像纸牌这样的游戏,你应该只考虑用户知道的,而不是游戏中任何隐藏的元素——有些纸牌游戏一开始是不可能的,但玩家不应该知道这一点。对于其他更复杂的游戏,暴力是不合适的,因为树需要太长的时间来生成。在这些情况下,您需要找到常见模式并检测它们


对不起,这有点太模糊了,没有具体的答案。但这些都是我的建议。

你收到了关于确定一个游戏是否可解的答案,然而,在我看来,你只是想看看是否还有合法的移动,这要容易得多


当然,没有对游戏的描述,不可能给你任何具体的建议,但只要接受@Heinzi的建议,记住你只是想看看是否有任何合法的举动。因此,如果你真的可以构建一个非空的,那么还有一些合法的移动。

我曾经需要类似的东西。我做了一个随机生成的迷宫,想知道是否有可能解决它

我做了一个测试,测试了所有可能的解决方案。游戏区域(2D)是10*14个瓷砖大小,玩家可以向4个方向移动(就像在游戏中一样)。我的游戏是从A点到B点。在某种程度上,你的游戏是一样的,它将块从A点移动到B点。我将从块的当前位置开始,然后做一个算法,尝试在每个方向上移动它。如果该块有任何方向,我会将该块(我试图将该块移动到的对象)添加到一个列表中,该列表包含所有需要测试的尚未测试的块


所以基本上从一块瓷砖开始…测试4个方向…然后测试可能移动到的瓷砖。因此,如果可以将块向右移动,则需要测试是否可以将块从平铺向右移动到任何其他位置。要跟踪您已测试的磁贴,请在磁贴中添加一个变量,告诉您是否已测试,以及“可能到达”但尚未测试的磁贴列表。

我没有获得否决票或接近票。这是一个非常有效的问题,鉴于游戏的复杂性,启发式方法可能是最佳情况。谢谢你的提示!