双人贪吃蛇@botzone算法设计

单人贪吃蛇游戏的一般算法思路是进行前向预测,寻找空间最大的可能走法。
双人对战中,对方的走法不确定,必须加以预测。此外,还可以堵截对方的权值。
为了实现以上目的,需要对于己方蛇体、对方蛇体、地图障碍物进行建模。建立局面对象包含全部信息,每移动一个回合递归复制局面对象,以某种规则预测对手行为进行更新。

需要传递的数据有:
- 地图信息(本游戏中为静态,故传全局指针单一对象)
- 对方蛇所在位置
- 我方蛇所在位置
- 蛇历史运动数据*

可以供决策的技术指标:
1. 近步成杀。即按照这一走法,己方不死,对方无论怎么走都会死。该情况属于硬性胜利条件,只要存在即实施,无须再看其他指标。
2. 自己不死的自由度大小,对方可假设为路径贪心:适用于敌人的模型,假设对手(我)为不动,选取可行步数最长的方向
3. 连通性分析寻找关键通道,力求将对方包围在尽量小的封闭区域内。应用最短路径算法,对于每个方格假设按最短路径到达,则令对方到达各方格最曲折甚至不能到达的就是最优路径。
有一点需要注意,即不同的路径有不同的长度,我们在评价最优的时候需要排除单纯由于走的路线长占据的格点多而使得对方无路可走。这种“最优”是被动的,因为会轻易被对方的移动所搅乱,故不具有实用性。解决方法是将评价函数S设置为:
S=SUM(1/(1+对方的可行方格数的步数))+自身步数/6

然后取MAXS-S最大的前几个方案,按照初始方向累加,返回最大的方向和对应权值。
其中MAXS是S的最大值,超过此值就没意义了不合格。
4. 贴近对方,并且自己能逃脱


搜索最短路径使用dijistra算法,使用小顶堆寻找未放入连通子图的最近的顶点。
从堆顶取出顶点时,关心的是其值和坐标;
在更新顶点的值的时候,需要修改指定坐标顶点的值,然后修正堆(也可以删除指定顶点,修改值后重新插入)。需要通过坐标索引小顶堆的位置;
于是,我们需要一个数据结构具有双向指向功能

为了加快移动速度,节省空间,小顶堆中存储的都是指针

typedef struct _Block
{
    int<
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值