前提:本文实现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