智能蛇——自己找食物吃的贪吃蛇

本文介绍了如何使用C语言为贪吃蛇游戏添加智能寻食功能。通过定义whereGoNext函数计算蛇头到食物的最短距离,选择最近的方向移动。在Linux环境下,对原代码进行修改以适配不同的清屏和延时函数。然而,现有算法有时会导致蛇自我环绕困住。作者作为C语言初学者,欢迎读者指正错误。

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

上一篇博客中我们简单实现了如何用C语言编写一个简易的贪吃蛇,具体实现代码可以见用C语言设计贪吃蛇 ,并提到了可以使贪吃蛇具有“智能”,使其能够自动寻找食物。下面我们来看看如何实现这一功能


设计思路如下:

定义一个函数,用于判断蛇的下一步该往哪个方向走

函数伪代码如下:

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


具体代码如下

char whereGoNext(int Hx, int Hy, int Fx, int Fy)
{
    int i;
    int min = 9998,p=0;
    if (map[Hy][Hx - 1] != BLANK_CELL && map[Hy][Hx - 1] != SNAKE_FOOD)
        distance[0] = 9999;
    else
        distance[0] = abs(Fx - (Hx - 1)) + abs(Fy - Hy);
    if (map[Hy - 1][Hx] != BLANK_CELL && map[Hy - 1][Hx] != SNAKE_FOOD)
        distance[1] = 9999;
    else
        distance[1] = abs(Fx - Hx) + abs(Fy - (Hy - 1));
    if (map[Hy + 1][Hx] != BLANK_CELL && map[Hy + 1][Hx] != SNAKE_FOOD)
        distance[2] = 9999;
    else
        distance[2] = abs(Fx - Hx) + abs(Fy - (Hy + 1));
    if (map[Hy][Hx + 1] != BLANK_CELL && map[Hy][Hx + 1] != SNAKE_FOOD)
        distance[3] = 9999;
    else
        distance[3] = abs(Fx - (Hx + 1)) + abs(Fy - Hy);
    for (i = 0; i < 4; i++)
    {
        if (min > distance[i])
        {
            min = distance[i];
            p = i;
        }
    }
    return movable[p];
}

完成这一函数后,只需将原代码判断键盘输入并定义方向的部分删去,再将此函数插入即可!(别忘了加上 math.h 头文件)这样,会自动寻找食物的“智能”蛇就完成了!不过这一算法存在缺陷,经常走着走着就把自己绕进去死掉了!


由于课程要求,本次实验需要在Linux中完成。所以我们需要将我们的代码做如下修改:
1、把原来的清屏函数 system(“cls”) 改为 printf(“\033[2J”) 对此不熟悉的网友们可以参见 C语言与VT100控制码编程
2、把原来的控制速度函数Sleep()改为sleep(),同时把头文件 windows.h 改为 unistd.h ,需要注意的是Sleep()的单位是毫秒,而sleep()的单位是秒
这样,我们的程序基本就可以在Linux环境下运行了!


本人初学C语言不久,若有错误,还望指出,不胜感激!

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、付费专栏及课程。

余额充值