900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > java推箱子随机地图的产生_为什么没有人研究推箱子地图自动生成算法?算法随机生成地

java推箱子随机地图的产生_为什么没有人研究推箱子地图自动生成算法?算法随机生成地

时间:2019-05-25 02:38:41

相关推荐

java推箱子随机地图的产生_为什么没有人研究推箱子地图自动生成算法?算法随机生成地

其实是有的,可以参考 Ty Taylor 的 The Art and Science of Procedural Puzzle Generation,/watch?v=RLcMvCS4-gY

《推箱子》游戏中有墙壁、地板、目标点三类不会发生变动的游戏地图数据,以及箱子、推箱子的小人两种可变的对象。

《推箱子》的游戏规则是:玩家控制小人在地图上 上下左右 移动,当小人的移动方向上有箱子时,可以推动箱子向相应的方向移动。但是遇到墙壁,小人不能移动;如果推箱子时箱子前面有墙壁或另一个箱子,则小人不能推动箱子前进。

《推箱子》的胜利条件是所有的箱子都位于目标点之上。失败的条件是没有箱子能够被推动且有箱子没有位于目标点之上。

一个有意义的益智游戏关卡,通常要满足以下要素:关卡要可解:至少有一种推箱子的步骤,能够达到胜利状态。

关卡的解状态空间要大:如果一个关卡只有有限的状态空间,就意味着这个关卡是一个一本道的关卡,过于简单,没有挑战难度。比如下面这个关卡:

▩▩▩▩▩▩▩▩▩▩▩▩

▩@#--------------* ▩

▩▩▩▩▩▩▩▩▩▩▩▩

3. 关卡的求解最短路径要足够长:如果一个关卡的最优解路径过短,说明关卡的解谜程度较弱,玩家看一眼就能看出解法。比如下面这个关卡:

▩▩▩▩▩▩▩▩▩▩▩▩

▩-------------------▩

▩---*---------------▩

▩@#---------------▩

▩-------------------▩

▩-------------------▩

▩▩▩▩▩▩▩▩▩▩▩▩

为此,一个自动关卡生成器,通常由三部分组成:

1. 关卡生成器:采用随机或者过程化的方式增量式地生成关卡。

2. 关卡求解器:输入关卡生成器生成的一个关卡,判断其是否有解。

3. 关卡过滤器:输入一个生成好且有解的关卡,判断其解状态空间与最小求解步数是否满足需求。

三个部分的相互作用如下图所示:关卡生成器的三个部分及它们的关系

下面我们详细阐述一下关卡生成器、求解器与过滤器的具体实现。

关卡生成器

关卡生成器采用增量式随机生成关卡的策略:

关卡求解器

我们采用广度优先搜索的算法来求解推箱子谜题。理由是:

1. 广度优先可以计算出游戏从初始状态到解谜成功状态的最少步骤。

2. 广度优先可以回溯取得解谜过程的状态序列,这些状态序列就是谜题的最短解题步骤。

3. 广度优先搜索的过程中会获得一棵解法树,这棵树的深度与广度可以衡量所生成关卡的解状态空间复杂度。

由于游戏中可变的单位只有箱子和小人的位置,所以状态节点只需要记录箱子与小人的位置即可。需要注意的是,在用广度优先搜索的过程中,会发生状态空间爆炸的情况,必须对每一个状态节点进行剪枝,否则求解一次非常慢。可以考虑从以下几点进行剪枝:去重:将每个状态节点散列到一个Hash临接表上,每次生成新的状态都判断之前是否有同样的游戏状态,如果有,则不添加该状态。

判断死锁:比如以下情况中有箱子没有办法被推动,如果此时箱子没有位于目标点上,则说明该状态之后不可能达到胜利状态,不添加该状态。

死锁情况一:

##

##

死锁情况二:

--▩

▩ #

关卡过滤器

利用广度优先搜索已经能够计算出生成的每个关卡的解状态空间与最短解谜步数。因此过滤器只需要把迭代过程中生成的各有解的关卡的解状态空间与最短解谜步数进行比较与权衡,选出其中状态空间与最短解谜步数均比较多的关卡,作为最终输出的关卡。

结果展示

以下是采用我们的关卡自动生成器生成的一些推箱子关卡。其中迭代次数为广度优先搜索实现的求解器找到该关卡最优解时经过的迭代次数。最小步数为解谜成功所需要的最少推动箱子的步数 + 1(初始状态也被记为1步)。

源代码

java推箱子随机地图的产生_为什么没有人研究推箱子地图自动生成算法?算法随机生成地图 不需要地图库!?...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。