智能蛇?智障蛇?

前言

为了赋予贪吃蛇游戏新的玩法,我们可以在游戏中为玩家添加一些竞争对手,比如添加几条与它争夺食物的智能蛇。

伪代码

决定蛇行走的方向函数的伪代码

 // 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]
}

智能蛇的程序框架

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

智能蛇算法

char WhereGoNext(int Hx, int Hy, int Fx, int Fy)
{
char moveable[4] = { 'a','d','w','s' };
int distance[4] = { 0 };
distance[0] = abs(Fy - (Hy - 1)) + abs(Fx - Hx);
if (map[Hx][Hy - 1] != BLANK_CELL&&map[Hx][Hy - 1] != SNAKE_FOOD)
    distance[0] = 9999;

distance[1] = abs(Fy - (Hy + 1)) + abs(Fx - Hx);
if (map[Hx][Hy + 1] != BLANK_CELL&&map[Hx][Hy + 1] != SNAKE_FOOD)
    distance[1] = 9999;

distance[2] = abs(Fy - Hy) + abs(Fx - (Hx - 1));
if (map[Hx - 1][Hy] != BLANK_CELL&&map[Hx - 1][Hy] != SNAKE_FOOD)
    distance[2] = 9999;

distance[3] = abs(Fy - Hy) + abs(Fx - (Hx + 1));
if (map[Hx + 1][Hy] != BLANK_CELL&&map[Hx + 1][Hy]!=SNAKE_FOOD)
    distance[3] = 9999;

int min=0;
for (int i = 0; i <= 3; i++)
{
    if (distance[i] < distance[min] && distance[i] != 9999)
        min = i;
}
return moveable[min];
}

用这个代码替换原来贪吃蛇的键入指令上下左右就可以实现自动寻路。
但这个算法有个明显的缺点就是这条蛇只会算最近距离,却不考虑会不会把自己困死,因此它总是走着走着就把自己围死了。
所以说它是智能蛇,其实是条智障蛇~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值