A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陆权允 中级黑马   /  2017-4-1 18:54  /  1082 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陆权允 于 2017-4-1 18:56 编辑

贪食蛇相信大家都玩过吧。 之前在逛贴吧的时候看到过一副很BT的动态图


人做这样的事情还是很有难度的。 今天我们考虑用java写一个贪食蛇的简单AI,来实现上面图片中的吃满屏幕的情况。
贪食蛇网上代码也很多,大家也写了无数遍了,在这里就不详细描述,主要说下AI的思路。
这里主要用到了BFS算法,BFS在二维数组中搜索两点间最短距离用到
当然也还有一些其他算法也可以用,我只试过BFS,DFS和A*




第一步先让蛇动起来




如果一开始就想一次写好AI,会不知道从哪里开始写,所以我们先从简单的开始,然后慢慢改进。
我们先用BFS算法搜到蛇头到食物间的最短距离,然后让蛇按这个最短路径去吃食物。



蛇看到食物就直奔食物去了,也没想想如果吃了食物是不是还有活路。蛇总要为自己的下一步行动做考虑,这样才能活的久一点。


我们现在先让蛇学聪明点,让蛇每走一步就停下来,想想人生,欣赏下风景,看看前面通往美食的路上是否充满陷阱。


当然,只停下来想想是没有用的,实践出真知。现在蛇必须会一项技能,叫分身术,这个分身术有点厉害,这个分身可以进入另一个平行世间,分身在平行世界里面无论做了什么都不会影响蛇自己的世间。但是分身在平行世界了中了陷阱,它就回到现实世界并告诉蛇,前面的路不安全。
(这里 我们还可以 进一步思考,让分身再分身一个分身到另一个平行世界...可以用递归来做,好复杂,本人能力有限,尝试了一下就放弃了...)


蛇这么BT技能,用到的就是java中的克隆(clone)。


现在我们的蛇吃食物的策略就是,看到食物,让分身到平行世界里走一步看有没有危险,如果有危险,就告诉蛇前面的路不能走。如果没有危险,蛇就朝食物走一步。


这里我们还要分析下,什么是危险,或者什么是安全。


仔细看第一幅图,我们可以发现,那条蛇迷人的步伐都只是为了追着自己的尾巴。。*蛇头每走一步,蛇尾就空出一步,所以蛇头到蛇尾有路径就算安全*,那危险就是蛇头找不到蛇尾。


蛇头找不到蛇尾只是危险,但不一定会死掉。


为了避免死掉,只要是危险,我们就应该避免。


那蛇现在的思路就是:
看到美食,让分身探路,没有危险,朝美食走最短距离,有危险。走蛇头到蛇尾的最远距离(为什么是最远距离。最远距离蛇身会紧紧挨在一起,可以空出空地来),直到蛇可以安全的吃食物;
当然还有看不到美食的情况,美食随机出现在蛇身围起来的封闭空间里了。这个时候 蛇走蛇尾的最远距离,直到蛇头和美食间有最短距离。
当蛇头无路可走游戏结束。

5 个回复

倒序浏览
回复 使用道具 举报
贪吃蛇中的王者

会思考的贪吃蛇.jpg (608.74 KB, 下载次数: 14)

如果小时候会java 我就是王者

如果小时候会java 我就是王者
回复 使用道具 举报
一起玩玩 呢                 也许你的比我的更好
回复 使用道具 举报
回复 使用道具 举报
还没学到怎么显示,到时候一定试试
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马