贪吃蛇对战:有什么策略?算法怎么实现?

cafeeee 2003-10-09 12:26:34
两条蛇在m*n的地图上(m,n随机产生)以相同的速度自由游走,蛇每行走一个单位距离地图会以一定的概率随机产生一个苹果,蛇每吃到一个苹果长度加一,在一个比较大的时间段内,比较长的蛇取胜(如果某条蛇在时间结束之前由于撞上自己或另一条蛇而挂掉,则其长度以挂掉前的长度计)。

地图是一种特殊形式的二维阵列,可以从左边直接到右边(反之亦行),也可以从上边直接到下边(反之亦行)。

为了取胜,贪吃蛇应该有哪些策略呢?这些策略用算法又怎么实现呢?

注:由于苹果随机产生,在某一时刻,地图上可能有多个苹果,也有可能没有苹果;并且由于其随机性,蛇的初始位置和初始长度并不重要。
...全文
627 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbsoft 2003-11-11
  • 打赏
  • 举报
回复
mark
v_salt 2003-11-11
  • 打赏
  • 举报
回复
up
duguyai 2003-11-11
  • 打赏
  • 举报
回复
Yep~
cafeeee 2003-11-11
  • 打赏
  • 举报
回复
想参加比赛的各位:

比赛在即,各位加油了。
请到 http://www.zxhp.com/bbs/index.php?showforum=39 下载Alpha版的裁判程序和客户端源代码。
cafeeee 2003-11-08
  • 打赏
  • 举报
回复
To duguyai

Are you Duke Cliff?
shwen 2003-11-07
  • 打赏
  • 举报
回复
这个问题和 http://www.cfcs.com.cn/fjas/training.htm 所提的问题区别还是比较大的,一条蛇主要考虑如何最快吃到最多的苹果即可,而且地图是不变的,而两条蛇的时候,任何一个时刻可以把另一条蛇看成是一个障碍,而且它在运动。简单的说,一条蛇是规划问题,而两条蛇是对策问题。初步的分析我觉得取胜的蛇应该采取以下策略:
1、如果自己的长度太小一致无法逼死对方(小于5想逼死对方就很难了),则必须以抢苹果为取胜手段
2、如果自己长度较大容易逼死对方,则逼死对方为取胜手段,因为对方一挂则自己能赢则肯定赢了。
3、如果自己已经无法取胜(例如估计剩余的苹果已经无法让自己取胜),那么一头撞死算了,同归于尽最好 ^_^

很显然,如果蛇的初始长度或者决胜时间足够长,则蛇一定会发展到第二阶段,那么能够掌握逼死策略的蛇应该是赢率比较大的,不过逼死策略的算法确实比较难,这个问题可能又需要进行以下两种分析:
1、如果能够从数学上证明,逼死对方或者被对方逼死是一定会发生的,那么一般来说,猜测逼死或被逼死需要经历的过程应该不长,也就是不会长到逼死对方时对方已经吃掉了大部分的苹果,这时其实一开始就胜负已分了。
2、如果逼死或被逼死不一定会发生,则可能存在一个反逼死策略,那么这时候采用反逼死策率+如何更快吃到苹果反而是取胜的策略了。
iscxy 2003-11-07
  • 打赏
  • 举报
回复
here!
cafeeee(cafeeee)
在互联网上联机,用TCP/IP协议,Socket通信,是吗?
cxy00@21cn.com
C/S两个都要哦.
duguyai 2003-11-07
  • 打赏
  • 举报
回复
To SHWEN
你的想法实际就是一个策略模板,我们制定的规则是以M(100)轮每轮N(1000)步以后得分高的获胜
如果逼死对方,自己耽误太多步数而吃不到苹果,以后的苹果随机或按某种概率分布出现,小蛇就算在某一步逼死大蛇都不一定会赢,当然如果大蛇能逼死小蛇是稳赢了。
这实际上牵扯到策划分配方案,当本蛇处于在某个状态时,如果达到一定条件就转换策略。
比如一开始蛇可以吃离自己身边最近的苹果同时避免碰撞的策略,当发现自己长度大于对方一定数值,开始转化为逼死策略,如果中途对方长度突然增长,判断此时逼死对方会冒一定风险而恢复食苹果的策略。又或者发现自己长度小于对方,而对方步步相逼,则会采用某种躲避或反逼策略。
具体策略,策略的规划和策略执行的方式就是决定智能的好坏
另外在不知道对方算法的前提下是很难证明是否肯定能逼死或被逼死,除非无路可走。
最简单出路选择就是在地图上选择一个安全点,然后搜自己到这个点的最短路径,当然对方也可以帮你搜出这条路径想办法封死它
duguyai 2003-11-07
  • 打赏
  • 举报
回复
这个题目是我去年设想的,Cafeee用mfc实现
我们系每年都会举行一次这样的“图灵杯”比赛(以前都是拱猪),也希望有兴趣的外校同学可以参加,等我们把规则接口和裁判端发布到网上,大家感兴趣可以作一作,用C/S实现
我们还可以举行远程网络大赛,如果来不及,可以把程序发过来如果获奖我们会通知您。完全是希望大家有这样一个有趣的交流算法的平台。
csyw 2003-11-03
  • 打赏
  • 举报
回复
up
cafeeee 2003-10-28
  • 打赏
  • 举报
回复
谢谢 iscxy

我已经有一个Server的初期版本,还有个没有实现智能的Client源代码,不过Server与Client之间只能在同一台电脑上实现通信,那位要得话,请留个email在这。
iscxy 2003-10-21
  • 打赏
  • 举报
回复
BlueSky2008(懒惰是程序员的美德) :
修正:你提出的初期和后期分离宏观策略,理解你说的分初期和后期的情况,好象也不太能降低编程的复杂度,如果两条snake的位置没有限定,初期,一开始就可能逼死死对方,或自己有被逼死的可能。后期,如果逼死对方也不能增加自己的总进食量,或者减少对方的总进食量,这也是没有意义的。

建议:BlueSky2008(懒惰是程序员的美德) 开设一个擂台赛。给出专家分奖励。并设定一个程序之间能够通信的协议。C/S模式。
cafeeee(cafeeee) :实现Server端、和提供一个只缺snake算法的Client端。这样大家搞算法的就直接在cafeeee的客户端源程序中添加自己的算法,最后参加擂台赛,一较高低。当然,擂台赛完了大家再讨论自己算法,相信cafeeee的问题能有一个较好的结果。
相信能有专家分的奖励,和省去写界面和通信的麻烦,参加者还是会有不少的,我一定参加(用BCB或VC均可)。
BlueSky2008 2003-10-19
  • 打赏
  • 举报
回复
其实我也只是大概考虑了一下这个问题,感觉很难,实际上可以分成两部分:
一是初期抢苹果的算法,另外一个是后期靠蛇身逼死对方的算法,两部分都很难,
主要是要考虑到对手的策略,我也想不出什么好的算法。
想做成一个人人对战的擂台,参赛者一开始可以写一些简单的AI,也不要考虑最优,
只要能不死就行了,慢慢再加强,不知道能不能展开。
cafeeee 2003-10-19
  • 打赏
  • 举报
回复
UP
各位帮我再想一想。
ilian 2003-10-19
  • 打赏
  • 举报
回复
UP
cafeeee 2003-10-10
  • 打赏
  • 举报
回复
对不起了,BlueSky2008。
谢谢ZhangYv。

赞成iscxy(GameBoy)说的:尽可能自己多吃且不让对手吃的很多。
但是,你提到的算法在速度上会不会有点问题呢?我感觉,可能有更简单的算法。毕竟,这是比赛,我并不需要最优算法,只要比对手强就行了。
ZhangYv 2003-10-09
  • 打赏
  • 举报
回复
呵呵,清华大学有举行过类似的比赛,你去水木清华问问^^
BlueSky2008 2003-10-09
  • 打赏
  • 举报
回复
Faint! 楼主把我下一期准备的擂台问掉了:)
cafeeee 2003-10-09
  • 打赏
  • 举报
回复
1.可以把地图可以想象为球状的。
2.这是我们学校举办的一个编程比赛,各人自己实现AI.

谢谢ZhangYv,不过这个比赛要求算法比较快,大概是0.1秒行走一步,算法复杂度太高的话,会来不及反应而延时,那样的话会扣分的.
iscxy 2003-10-09
  • 打赏
  • 举报
回复
good problem!顶!
我的看法:
可以分成发展自己的策略和遏制对手的策略。
如果对手不移动,可以找出发展自己的最优的策略。
可是对手在移动,是不是要分析对手的移动倾向呢?
无论发展自己还是遏制对手,对要对对手的移动作预测,但对手的移动是无法100%的预见的最后的算法是一个概率算法,概率算法中包含了一些搜索算法,如动态规划、回溯,但是不用搜索得太精确,精确意义不大,提高作出反映的速度意义更大。

记得有一个竞争游戏:有n个物品,2人对弈,每次每人能够取m(1<m<n)个以内的物品,两个人交替拿,谁能够拿到最后的物品谁胜利。这个问题的解很简单,不知道对这个题目有启示没有。
加载更多回复(4)
这个采用C语言开发的项目是一个多功能的软件应用程序。它旨在提供一个高效、可靠的解决方案,用于处理各种计算机科学和软件开发任务。该项目的目标是为开发人员和计算机科学专业人员提供一个功能强大且易于使用的工具集。 该项目具有许多令人印象深刻的特性。首先,它提供了一组丰富的库和工具,以支持C语言的开发和调试。这些库包括用于字符串处理、内存管理、文件操作和网络编程等常见任务的函数。此外,该项目还提供了一套强大的调试工具,帮助开发人员快速定位和修复代码中的错误。 另一个令人赞赏的特点是该项目的跨平台性。它可以在多个操作系统上运行,包括Windows、Linux和Mac OS等。这使得开发人员可以在不同的环境中使用同一套工具和库,从而提高了开发的灵活性和效率。 该项目还具有高度可定制性。开发人员可以根据自己的需求和偏好,灵活地配置和扩展项目的功能。这包括选择所需的库、启用或禁用特定的功能模块以及修改项目的行为。 此外,该项目还注重性能和效率。通过优化算法和数据结构,以及利用硬件资源的最佳方式,该项目能够在处理大规模数据和复杂计算时提供出色的性能。 总之,这个采用C语言开发的项目是一个强大而灵活的工具,为开发人员和计算机科学专业人员提供了丰富的功能和可靠的解决方案。它的跨平台性、可定制性和高性能使其成为一个理想的选择,无论是进行系统编程、嵌入式开发还是进行科学计算和数据处理。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧