Language agnostic 如何建立同一游戏的可解水平(又名链式射击,又名点击游戏)

Language agnostic 如何建立同一游戏的可解水平(又名链式射击,又名点击游戏),language-agnostic,Language Agnostic,我正在构建一个游戏,比如,当我必须创建一个新的关卡时,我刚刚运行了一个算法,用N种颜色填充棋盘,这个算法随机填充棋盘,但显然,以这种方式生成的关卡并不都有解决方案 我必须做一个函数来解决这个问题,这样一个完美的玩家就可以永远玩这个游戏了 我有一个最大的6种颜色,最小的2个和董事会有一个合理的大小(14x12),但可以修改 语言是不相关的 编辑:我不需要解决这个难题,我需要创建至少有一个解决方案的关卡。我要补充的是,有一种方法很少是最有效的,那就是反向构建关卡 不过在这种情况下做起来相当简单。你只

我正在构建一个游戏,比如,当我必须创建一个新的关卡时,我刚刚运行了一个算法,用N种颜色填充棋盘,这个算法随机填充棋盘,但显然,以这种方式生成的关卡并不都有解决方案

我必须做一个函数来解决这个问题,这样一个完美的玩家就可以永远玩这个游戏了

我有一个最大的6种颜色,最小的2个和董事会有一个合理的大小(14x12),但可以修改

语言是不相关的


编辑:我不需要解决这个难题,我需要创建至少有一个解决方案的关卡。

我要补充的是,有一种方法很少是最有效的,那就是反向构建关卡

不过在这种情况下做起来相当简单。你只需要从零开始,添加一些随机的可点击组。。。我说的是一些随机性,因为您可能需要添加额外的块以确保所有列都已填充

但是想想看,即使这样,你添加的两个可点击的组也有可能相互接触,导致无法预料的崩溃,导致游戏无法完成。所以这种方法不能保证游戏是可解的


您可以查看开源版本的源代码,如,看看他们是如何做到的(如果他们真的做到了!)

创建一个“已解决”的板,然后使用N个有效但随机的向后移动来更改它。添加每次向后移动后,您可以运行向前移动(在临时板上)来验证可解决的谜题。

如果由于时间限制,您无法运行验证算法,那么您可能需要处理的是一个谜题库。您可以让一个后台线程始终生成新的随机谜题,并对其运行验证算法以检查它们是否有效。当找到一个有效的谜题时,它会被添加到你的谜题库中(假设同一个谜题不存在)


然后你的游戏从库中随机加载。这允许您确保始终拥有有效的谜题,但仍然允许您随机生成并验证它们,而不会减慢谜题加载速度。

我刚刚在Ubuntu上查看了大约五个不同版本的游戏,我找到了一个答案,您可以从中获取

我不停地玩他的五个游戏,但我更喜欢同一个侏儒。我刚刚加载了他的同一个游戏,它有一个选项,以确保在创建自定义游戏时的溶解度。甚至有一个可定制的评分系统。这一切都非常先进

可从上面的链接获取exe和源代码


许可证是MIT(意味着你可以在商业游戏中免费使用它,但如果你能负担得起的话,请给他捐赠一些东西)

我认为最好的方法是,如果你随机生成一个关卡,我的意思是在同一列中同时添加1个或多个关卡,这样你就有了一些连接关卡。然后编写一个简单的求解算法,只需求解电路板,直到不再有可能的移动。然后你只要试着完成剩下的部分,从顶部推一些块,这样你就有更多的块消失。你继续下去,直到你完成黑板。 您将添加的片段存储在另一个矩阵中。
之后,您只需将第二个矩阵添加到从顶部开始的第一个矩阵。如果电路板未满,只需使用块(连接块)完成电路板即可。

第一种方法是按照您所说的向后构建电路板,但我在该方法中遇到了许多错误。我看过的游戏都是随机的(同一个侏儒就是其中之一),也许拥有一个可解的网格并不一定是你应该追求的目标。同一个侏儒给你一个清除奖励,但他们也使用指数计分法(例如2分一次,4分一次,8分一次,16分一次,等等)。这增加了一个用户必须选择的策略:要么以完成为目标,要么以得分高到不必为目标。哈哈!我很乐意。我发现发现游戏中的成瘾因素是一个令人着迷的话题。所有方法都有优点。可完成的游戏是一个不错的挑战,但击败高分或计时游戏也是一个不错的挑战。。。在与其他用户竞争的网络世界中,后两种方法的效果稍好一些。我当然认为你至少应该确保你的老板能看到每种方法的好处。要知道它是否可以解决的算法不是问题,问题是要创造一个可以解决的谜题(如果我只是随机填充电路板并运行“验证”算法,这将花费我不想计算的更多时间)你不需要完全随机,以可控的方式随机。当你向后构建棋盘时,根据对可解游戏有效的方式,随机决定颜色是否与相邻的左/右/底等匹配。