基于Python实现的吃豆人游戏设计
资源下载地址:https://download.csdn.net/download/sheziqiong/86817091
资源下载地址:https://download.csdn.net/download/sheziqiong/86817091
基于Python设计的吃豆人游戏
一、实现 Expectimax
期望最大(Expectimax)是在 MINIMAX 的基础上进行了概率的计算,这个最开始我还是很没有理解的,后来和叶老师与111173田鑫讨论后才悟了,如图 1:
图 1 一颗普通的状态树 图 2 新的计算公式 这一层原本是 MINI 层,按照原来的算法,应该在其子节点中选择一个最小值传递到上一层,因此结果应该是-12。但现在添加了到达每个节点的概率,计算的方式就变成了求期望值,即图 2 的公式。其中 p 表示概率,value 该点的值。这样一来,该点的值就是 8 * 1/2+ 1/3 + -12 * 1/6 = 10,就不是之前的-12 了。
在吃豆人问题中,由于向每个方向走的概率都是相同的,因此只需要将子节点求和后除以合 action 的数量,就可以达到 Expecrimax 所描述的计算要求。
1.1 结果展示
通过对比AphasiaBeta和Expectimax对同一个地图进行测试,可以得到如下结果:
图 3 结果截图
可以看到相比之下,AphasiaBeta一场都没有赢过,而Expectimax赢了半数以上的对局,足以说明其策略更优。
二、实现 Reflex
在实现自定义评价函数的时候没懂是什么意思,因此和叶老师沟通后,开始着手做第一题。因为第一题也有自定义评价函数的内容,与第五题类似。Reflex中基本的思路就是
离食物越近越好
离鬼越远越好
因此评分标准就要围绕着上面两个思想来进行。首先离食物越近越好这个可以用倒数的形式来完成,而离鬼越远越好的话,我通过很长一段时间考虑…觉得用那种“离鬼越近负分越高”的评价会比较好,因此我决定用一个呈指数级别的函数,即 e的-x 次方。此时横坐标的x表示的就是吃豆人离鬼的距离。我们可以分析得到,当距离为0的时候是最危险的,因此其负的分数更高,如图5所示。
图 4 给我启发的 exp 的图象 图 5 最终使用的-exp 的图象
接下来的代码就比较玄学了,我直接(1/到最近食物距离)-exp(到鬼的距离),并且也尝试了很久调试参数,但是无论如何都不能使其运作的很好…最终我在github上参考了别人的代码,发现他也用的exp进行权值计算。但是他首先利用到了“oldFood”,用移动之前的食物记录,来判断当前这次有没有吃到食物,有的话就设置一个很高的分数,没有的话就设置为0。然后她也计算出了“到最近食物距离”和“到鬼的距离”,用刚才的分数减去这两个值。虽然不知道他咋想的,但这样确实管用…下面附上这位同学的代码链接:
图 6 这位同学的精妙算法结果
三、实现 Evaluation Function
实现 Evaluation Function 的时候,我先按照自带的评价函数 scoreEvaluationFunction 直接计算 state 的得分,并作为评价值返回。运行结果如下:
图 8 打印分数由于原来的评分功能已经很好的实现了正常吃豆和躲避鬼的代码,因此这里我添加了吃“药丸”的权重判断(在阅读源码的时候发现了 getCapsules 这个函数,可以获得地图中药丸的坐标)。在这个判断的规则下,吃豆人会更倾向于靠近药丸,并且在吃到药丸后,也更倾向于追逐鬼。这里我参考了 Reflex 中的计算方法,即计算得到曼哈顿距离后用 exp 计算获得一个较大的分数。
代码如下:
图 9 评价计算公式
这两段代码的计算方式十分相似,都是得到所有药丸/鬼的位置,然后计算曼哈顿得到一个最近的距离,对这个距离进行形如 math.exp(-(Value-5))的计算,便可得到评价值。需要说明的是,当吃豆人没有吃到药丸的时候,对鬼的分数依然是要打负分,因此有了图 9 中的那个 else 语句。
最终将原本的评分数值加上图 9 两个计算出来的两个值,就是最终的评分了,代码如下
图 10 最终评价计算
需要注意的是,这里加了一个小 tick:药丸得到的分数我乘以了 1.5 倍,因为如果不乘以这个系数的话,最终的平均得分是小于 1000 的,只能拿到这题的 5/6 分,如图 11:
图 11 一次不太完美的结果
之所以乘以 1.5,这是在和111172周伟国同学讨论 Reflex 的时候他给我提供的思路,就是当好几个评分结果都影响最终得分的时候,可以设置权重系数,把你认为影响最大的那个结果通过系数放大,影响小的就通过系数变得更小。这样一来就能将局势判断朝你更倾向的那个思路进行下去。最终 PASS 的结果如图 12 所示:
图 12 Perfect!
资源下载地址:https://download.csdn.net/download/sheziqiong/86817091
资源下载地址:https://download.csdn.net/download/sheziqiong/86817091
基于Python实现的吃豆人游戏设计相关推荐
- Python 玩出花了!一文教你用 Python 制作吃豆人游戏! | 附代码
作者 | 李秋键 责编 | Carol 封图 | CSDN 下载自视觉中国 近几年来Python语言得到了快速发展,而Pygame作为Python开发应用和游戏必备的库更是展现了Python的优越性. ...
- c语言吃豆人游戏怎么理解,python 实现简单的吃豆人游戏
效果展示: 程序简介 1.使用pygame模组 2.在material目录下有一些素材 3.吃豆人的游戏主体 4.吃豆人怪物的AI(未使用深度学习) 主要代码 main.py import pygam ...
- 【人工智能导论】吃豆人游戏(上):对抗搜索与Minimax算法
吃豆人实验(The Pac-Man Project)简介 The Pac-Man projects were developed for UC Berkeley's introductory arti ...
- C++ 使用 openGL 实现吃豆人游戏
一.游戏须知 1.1 实验内容 本节实验主要通过 C++ 和 openGL 库来实现了一个吃豆人的小游戏.主要的课程内容涉 及到 C++ 相关的序 ...
- 吃豆人游戏-第12届蓝桥杯Scratch选拔赛真题精选
[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第79讲. 蓝桥杯选拔赛每一届都要举行4~5次,和省赛.国赛相比,题目要简单不少,再加上篇幅 ...
- Java语言制作吃豆人游戏
(此项目源码已上传至Github网站,网址为GitHub - Ran-a/Pac-man-yar) 1 游戏界面 游戏的角色分别是追赶者和吃豆人,玩家使用方向键来控制吃豆人的运动方向并吃食物,将食物 ...
- 吃豆人游戏【附源码】
吃豆游戏[附源码] 吃豆人游戏[附源码] 我的网站已经上线了 http://javapub.net.cn/ 博主介绍:
- 游戏开发经典样例 | web html5 吃豆人游戏
很早就知道canvas,当时一直没应用到,最近闲来无事就顺便写写看.吃豆游戏可以说是我们80,90后共同的回忆录,小时候常常在学习机上玩,所以也就有了强烈的欲望去写.为了写这个游戏,看了很多吃豆人游戏 ...
- linux 吃豆人游戏,C++ 使用 openGL 实现吃豆人游戏
C++ 使用 openGL 实现吃豆人游戏 一.实验介绍 1.1 实验内容 本节实验主要通过 C++ 和 openGL 库来实现了一个吃豆人的小游戏.主要的课程内容涉及到 C++ 相关的序列容器 ve ...
最新文章
- java win10 写入c盘_win10 1709 安装后很多软件没有权限向C盘写入文件
- 通用c/c++的Makefile模版
- 数据库及线程死锁(转)
- nodejs fs path
- windows下github 出现Permission denied (publickey)
- 企业级应用的前端思考。
- 算法5-----三个数大小比较
- 调试mysql语句_Mysql sql 语句调试
- 马尾物联网企业主导或参与制定修订各级标准达60项
- ArcGIS代码进行重分类
- dp交换机命令_交换机常用指令总结
- Java游戏聊斋聂小倩_【聊斋故事汇】之聂小倩(篇一)
- 高质量代码的几大标准
- Classic Shell不起作用(失效)的解决
- 各式各样的计算机教学设计,7. 各式各样的椅子教案设计(一等奖)
- 艰难的抉择,阿里“小前台、大中台”的解读
- matlab之运动目标检测
- 鸿蒙系统通知栏怎么清理,教你两招 彻底关掉手机通知栏烦人的无用通知
- 提速20倍!谷歌AI发布TensorFlow 3D,智能汽车场景亲测好用
- Unity3D: 给字符串中的部分字体添加颜色突出显示