Python制作AI贪吃蛇

前提:本文实现AI贪吃蛇自行对战,加上人机对战,文章末尾附上源代码以及各位大佬的链接,还有一些实现步骤,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都一样)   大佬Coco2d制作:http://www.waitingfy.com/html5/snake/   实现效果:   具体功能:       1.智能模式:电脑自己玩(自己吃食物)       2.人机对战:电脑和人操作(在上步的基础上加一个键盘控制的贪吃蛇即可)   实现环境:       Pycharm + Python3.6 + Curses + Win10    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------      具体过程:       一:配置环境:         Curses: 参考链接 (Cp后面代表本地Python环境,别下错了)          (Stackoverflow 真的是个非常好的地方)       二:         1.灵感来源+参考链接:           http://www.hawstein.com/posts/snake-ai.html (Chrome有时候打不开,Firefox可以打开)           网上基本都是这篇博客的转载(本人和通过Wechat和该大佬取得了联系[此人超级厉害])           https://blog.csdn.net/fox64194167/article/details/19965069 (这个就更厉害了,Coco2d制作:分为人机对战,AI模式,AI打AI,人人对战)         2.算法思路:           A*算法:https://www.cnblogs.com/21207-iHome/p/6048969.html(本人之前接触过,当时讲课老师说是自动寻路算法,我感觉和BFS+DFS一样,结果没想到居然是A*算法)           BFS+DFS(略)           第一步是能制作一个基本的贪吃蛇,熟悉Curses的相关环境(最好别对蛇和食物使用特殊字符,在windows环境下会导致像素延迟,非常丑)            复制代码 #curses官方手册:https://docs.python.org/3.5/library/curses.html#module-curses #curses参考手册:https://blog.csdn.net/chenxiaohua/article/details/2099304 复制代码           具体思路:             熟悉Curses中相关指令后基本就没什么了,保证按的下一个键不导致蛇死亡,保证蛇吃食物后食物不在蛇身上,保证蛇碰到自己和边框就死亡,如果按其他键,会导致头被插入2次,从而让蛇死亡。(具体见代码分析) 基本贪吃蛇         ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------            3.代码剖析:          [红色为代码所需函数]         (蛇每走一步,就更新snake距离food的board距离,涉及board_rest(更新每个非snake元素距离food的距离)和board_refresh(本文这里采用BFS算法)),寻找到best_move,然后让蛇移 动 即可           如果吃的到食物(find_safe_way):----> 放出虚拟蛇(virtual_shortest_move)(防止蛇吃完食物就被自己绕死)                   如果虚拟蛇吃完食物还可以找到 蛇尾(出的去)(is_tail_inside)                       直接吃食物(choose_shortest_safe_move)                   反之,出不去:                       就跟着尾巴走(follow_tail)就好比一直上下绕,就绝对不会死,但是蛇就完全没有灵性           如果吃不到食物                   跟着尾巴(走最远的路(choose_longest_safe_move)),四个方向走(如果是A*算法需要将8个方向改成4个方向)           如果上诉方法都不行,就涉及到any_possible_move,挑选距离最小的走(这里就会涉及到将自己吃死,有待改进)          (通过以上方法,就可以制造一个基本AI贪吃蛇了,当然,还有很多细节方面东西需要考虑) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------             报错: win = curses.newwin(HEIGHT, WIDTH, 0, 0) _curses.error: curses function returned NULL           原因: Pycharm下面(或者cmd、exe太小,需要拉大点)        贪吃蛇-02          在以上基础上,还需要引入第一步制造的基本贪吃蛇          细节: 1.键盘蛇加入后如何与蛇抢分(只需要return即可,但是 new_food()里面是需要更改的)            复制代码 1 # 产生新食物 2 def new_food(): 3 global food, snake_size, myfood 4 cell_free = False 5 while not cell_free: 6 food1 = [random.randint(1, HEIGHT - 2), random.randint(1, WIDTH - 2)] 7 w = randint(1, WIDTH - 2) 8 h = randint(1, HEIGHT - 2) 9 myfood = [h, w] 10 food = h * WIDTH + w 11 if (is_cell_free(food, snake_size, snake) and [w, h] not in snake1): 12 cell_free = True 13 win.addch(food // WIDTH, food % WIDTH, '@') 复制代码            2.一直没说,由于蛇加入后很多变量都需要global,导致变量看起来非常麻烦(读者要有心理准备)            3.curses里面的win.timeout()是控制蛇的速度            好像就没什么了,想起来了在更。我没加入2条蛇不能彼此碰撞(读者也可以弄成2个地图,然后看AI蛇和你自己的蛇如何操作跑,我是放在了一个地图里面)            当然还有很多很多细节,不过主要思路写下来了。其余就靠分析代码自行研究了。 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------              最终源代码: https://pan.baidu.com/s/1TaPIja8FVpyFZRbvjuvEvA 提取码: ff6f 书山有路勤为径,学海无涯苦作舟https://www.cnblogs.com/meditation5201314/p/9985495.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信