这个显卡不太冷 发表于 2016-5-1 18:48:35

自制AI贪吃蛇,吃满全屏!!

本帖最后由 这个显卡不太冷 于 2016-5-1 19:44 编辑

这个东西其实以前就想做了。这次放假刚好有时间。



简单说一下这次做这个程序的思路和过程、心得吧。



思路:
这个贪吃AI的实现分了两个部分,一部分是负责蛇的可以怎么行走,另一部分负责能不能这么走
所以这里我用了BFS寻路的算法。
遵循以下行走的策略:
a.蛇如果吃了苹果后能找到自己的尾巴,才去吃这个苹果。否则在头部找一个方向,这个方向满足1.离苹果最远距离(这里我用的曼哈顿距离)。2.走完后能找到尾巴。
b.如果吃了苹果后,生成的新苹果和自己不在一个次元,也就是寻路算法无法找到新苹果。那么就在头部找一个方向,这个方向满足   1.离苹果最远。2.走完后能找到尾巴。

以上两条策略可以处理蛇的所有死路的情况。

过程:
一开始界面和内部代码一起写,(由于技术太渣)bug满天飞,根本不能用。
后来认真规划了一下,先用一个list存蛇的身体的坐标,行走求解都单独完成。输出显示单独用一个method,先把蛇坐标装进邻接矩阵,然后输出邻接矩阵。
感谢NK后来百忙之中抽了时间帮我改进界面。


遇到的问题:
排除了一些很容易改掉的bug后,遇到了一些难改的问题
1.蛇在贴着尾巴走的时候会抛异常。
经排查是因为在执行“离苹果最远且能找到尾巴”这个策略的时候没有模拟行走。导致蛇身比行走前长,寻路算法无法找到路径。
模拟了一下就解决了

2.蛇会不时的,很白痴的,追着自己的尾巴原地绕圈而不去吃苹果,即使满足上述吃苹果的策略。
经排查发现是因为BFS寻路是找到的最短路。而在矩阵中距离相同最短路可以有很多条。而有的路径走法走了以后刚好使其不满足吃苹果后能找到尾巴的策略。
这个想了一下。后来把方向数组改了一下,改成了循环的方向,每次BFS的时候随机一次方向数组。使每次的找到的最短路不相同。成功解决问题。





心得:
做程序之前还是要想一下,规划一下。就像做题一样,得想一下再动手。
第一次写的时候最好还是特别细心,每个细节都要考虑到,不然后来排查起来很痛苦!!真的很痛苦
{:5_156:}
总之这次还是学到了一些东西。包括和NK愉快♂的合作。






感谢NK站长帮助改进界面!!@nkc3g4
纯属娱乐+练习。效果有视频,代码自取。
http://pan.baidu.com/share/link?shareid=595141889&uk=4027770837





Hashimoto 发表于 2016-5-3 19:52:31

显卡好厉害w~话说显卡的C#是如何上手的呢?就是如何入门的…

user 发表于 2016-5-4 14:07:43

居然能看懂一部分。。。。 看样子是托了 菜到爆的JS和PY底子 的福

nkc3g4 发表于 2016-5-4 17:27:27

Hashimoto 发表于 2016-5-3 19:52
显卡好厉害w~话说显卡的C#是如何上手的呢?就是如何入门的…

学好英语

Hashimoto 发表于 2016-5-5 13:44:55

nkc3g4 发表于 2016-5-4 17:27 static/image/common/back.gif
学好英语

曝光显卡英语大学霸

这个显卡不太冷 发表于 2016-5-14 23:44:42

Hashimoto 发表于 2016-5-3 19:52
显卡好厉害w~话说显卡的C#是如何上手的呢?就是如何入门的…

入门嘛。看了一些教程。基本语句明白了后面学起来要简单点。这个程序其实主要用到一些算法知识。.net特色部分比较少吧。界面是nk帮忙改进的

Hashimoto 发表于 2016-5-15 13:15:37

这个显卡不太冷 发表于 2016-5-14 23:44 static/image/common/back.gif
入门嘛。看了一些教程。基本语句明白了后面学起来要简单点。这个程序其实主要用到一些算法知识。.net特色 ...

显卡好厉害…壕啊…

user 发表于 2016-5-15 16:37:22

Hashimoto 发表于 2016-5-15 13:15
显卡好厉害…壕啊…

在我这个半吊子看来,E文不是主要的, 懂一些大概就行了(if, else, else if, for, while, define, function, return什么的)。 剩下的就是逻辑和内建函数(Built-in Functions)
页: [1] 2
查看完整版本: 自制AI贪吃蛇,吃满全屏!!