智能贪吃蛇(初级)

本文介绍了作者尝试创建自动智能贪吃蛇的过程,从最初让蛇寻找最短路径的构思,到改进策略避免蛇绕死,通过判断安全状态来决定蛇的行动。在不安全的情况下,蛇会寻找走的最深的路径直到再次安全。作者还设想了一个在特定地图规模下能形成S型路线的‘智障蛇’,并表达了向更复杂智能目标努力的愿望。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己玩贪吃蛇真的是累
为什么不写个自动的蛇呢?

1. 构思

如何让贪吃蛇自己寻路呢?
第一反应肯定是让蛇自己找最近的路
于是就有了个决定方向的伪代码

 Hx,Hy: 头的位置
 Fx,Fy:食物的位置
 function whereGoNext(Hx,Hy,Fx,Fy) {
     用数组movable[3]={“a”,”d”,”w”,”s”} 记录可走的方向
     用数组distance[3]={0,0,0,0} 记录离食物的距离
     分别计算蛇头周边四个位置到食物的距离。H头的位置,F食物位置
         例如:假设输入”a” 则distance[0] = |Fx – (Hx-1)| + |Fy – Hy|
     如果 Hx-1,Hy 位置不是Blank,则 distance[0] = 9999
     选择distance中存最小距离的下标p,注意最小距离不能是9999
     返回 movable[p]
    }

但是这样蛇就只会一直找最短路
很容易把自己坑死

2. 改进

我们要避免贪吃蛇自己绕死
所以要判断现在的情况是不是“安全”的
什么情况是安全的呢?
可以理解为
蛇头有路径到蛇尾

那如果是不安全的情况怎么办
这个时候蛇头和蛇尾在两个隔开的空间里
我们就要在蛇头判断一个走的最深的路径
一直走直到再次安全

 输出字符矩阵
 WHILE not 游戏结束 DO
     wait(time)
     IF safe() THEN 
         ch=whereGoNext(Hx,Hy,Fx,Fy)
     ELSE THEN 
         ch=mostdeep()
     CASE ch DO
         ‘A’:左前进一步,break 
         ‘D’:右前进一步,break    
         ‘W’:上前进一步,break    
         ‘S’:下前进一步,break    
     END CASE
     输出字符矩阵
 END WHILE
 输出 Game Over!!!

这样子就会改进很多
蛇也可以走更多步了

3. What else

其实
如果地图规模不是奇数*奇数的话
可以写一个s型的“智障蛇”
一定可以铺满地图哦

当然
最终的目标是做成这样的

这里写图片描述

当然我还做不到。。。

Snake-AI,这是一个用 C/C 语言编写的贪吃蛇游戏的人工智能。AI 的目的是让尽可能的吃更多的食物,直到吃满整个地图。想参与这个项目,请查看todos。Demo使用方法编译与运行:$ make $ make run为了解详细使用方法, 请查看主函数main()算法介绍函数Snake.decideNext(): 计算S1的下一个移动方向D计算S1的头部到达食物的最短路径P1。派一条与S1完全一样的虚拟S2沿路径P1吃掉食物。计算S2的头部到其尾部的最长路径P2。如果路径P2存在,将移动方向D设置为路径P1的第一个方向,否则进行步骤4。计算S1的头部到达其尾部的最长路径P3。如果P3存在,将移动方向D设置为路径P3的第一个方向,否则进行步骤5。将移动方向D设置为离食物最远的方向。函数Map.findMinPath(): 计算两个位置间的最短路径算法建立在BFS的基础上。为了使路径尽可能直,每次遍历邻接点时,在当前移动方向上的位置会被优先遍历。效果展示:(绿色区域为搜索算法扫描到的区域,红色区域为最后计算出的最短路径,每个位置上的数字表示了从起始位置开始到该位置的最短距离)函数Map.findMaxPath(): 计算两个位置间的最长路径算法建立在DFS与贪心算法的基础上。每次遍历邻接点时,离目标位置最远(使用曼哈顿距离估计)的位置将会被优先遍历到。另外,为了使路径尽可能直,如果两个位置到目标位置的距离相等,在当前移动方向上的位置将被优先遍历到。这个问题是一个NP完全问题,此算法得出的结果路径只是一个近似最长路径。效果展示:(绿色区域为搜索算法扫描到的区域,红色区域为最后计算出的最长路径,每个位置上的数字表示了从该位置开始到目标位置的估计距离) 标签:Snake
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值