用Python写了一个「拥抱梅西」的小游戏
入门教程、案例源码、学习资料、读者群
请访问: python666.cn
(资料图片仅供参考)
大家好,欢迎来到 Crossin的编程教室 !
最近有个小伙儿因为在比赛中冲进场地拥抱梅西而出名了。
这种行为当然不可取,他也为此付出了代价。但要说我没有一丁点羡慕和佩服那是不可能的。
于是,我也尬蹭一下这个热点,用Python写了一个「拥抱梅西」的小游戏。
游戏效果是这样的:
游戏规则很简单:
不要被拦截的工作人员追上
抱到梅西(接触一定时长)
定时会增加拦截的工作人员
可以反复拥抱
被追上后游戏结束,显示坚持的时间和拥抱的次数
代码已上传,获取请访问:python666.cn/c/9
或在号内回复关键字:梅西
运行说明
代码使用了游戏框架 pygame-zero 进行开发。之前我们也有发过基于这个框架的游戏:
羊了个羊,但是Python简(li)单(pu)版
如果你对于此框架还不熟悉,可以看下这篇介绍:
PONG - 100行代码写一个弹球游戏
因此运行代码前需先安装模块:
pip install pgzero
用此框架代码看起来与一般代码稍有不同,它更像一个配置脚本,其中会出现很多未定义的方法和变量,因此在很多编辑器里会提示有错,但其实是可以运行的,无需手动增加 import。这也是为什么你会看到我视频里的代码截图有大量的下划线。
pgzero有两种方式运行,一种是通过命令行的 pgzrun 命令;另一种是直接在编辑器中运行。参见官方文档:
https://pygame-zero.readthedocs.io/zh_CN/latest/ide-mode.html
本代码用的是第二种直接运行的方式(需新版pgzero),可直接在IDE中执行。
有部分读者反馈此代码在spyder等一些编辑器中无法运行,类似情况可以尝试第一种传统方法,即把最后一行代码 pgzrun.go() 去掉,然后直接在命令行该目录下运行:
pgzrun iMessi.py
代码简介
如果你对代码的核心逻辑其实比较容易理解。
对于「玩家」来说,就是根据上下左右按键,变换位置坐标;
对于「工作人员」来说,就是根据自身和玩家的相对位置算出移动的方向,不断靠近,如果碰上了就游戏结束
对于「梅西」来说,就是判断是否与玩家碰上,并记录碰上的持续时间
判断是否“碰上”很简单,就是计算一下两个坐标的距离是否小于一定值。
至于角色的移动,粗略的做法是,计算出x轴方向和y轴方向上的速度,然后在update函数中,将原坐标位置加上速度值,得到新的坐标位置。
但在我这次的代码中,为了让跑动更“丝滑”,没有选择直接改变速度,而是根据玩家的按键计算出加速度,然后在update函数中,将原速度值加上加速度值,得到新的速度,再用新的速度去计算新的坐标位置。
# 加速self.speedx += self.fx * self.accself.speedy += self.fy * self.acc# 限制最高速度d = (self.speedx**2 + self.speedy**2)**0.5 / self.speed_maxif d >1:self.speedx /= dself.speedy /= d# 更新坐标self.x += self.speedxself.y += self.speedy
有了这样的设定之后,还有个好处就是可以增加游戏的可玩性,比如你可以设定一种最高速度比玩家快,但是加速度比较小的「工作人员」,玩家就需要通过不停地变换方向来摆脱。
代码中另一个比较复杂的地方是“转向”的细节处理。同样为了更加丝滑,我没有选择直接根据计算出的方向来改变角色贴图方向,而是将计算出的方向作为“目标方向”,然后根据角色当前实际方向与目标方向的偏差,决定是向顺时针还是逆时针方向旋转,直到两个方向小于一定阈值。
# 跑动方向if keyboard.left:self.fx = -1elif keyboard.right:self.fx = 1else:self.fx = 0if keyboard.up:self.fy = -1elif keyboard.down:self.fy = 1else:self.fy = 0# 计算目标方向角度directs = ((135, 180, -135), (90, None, -90), (45, 0, -45))direct = directs[self.fx + 1][self.fy + 1]if direct is None:self.angle_dest = self.angleelse:self.angle_dest = direct # 贴图旋转if abs(self.angle - self.angle_dest) < 5 or abs(self.angle - self.angle_dest) >355:self.angle = self.angle_destelse:if (0 < self.angle - self.angle_dest < 180) or (self.angle - self.angle_dest < -180):self.angle -= 500 * dtelse:self.angle += 500 * dt
这段会牵扯一点初中几何的知识,想要理清的话建议在纸上画一画。
最后,是关于这个游戏的一个小视频,给大家图一乐:
欢迎大家关注+三连~
代码已上传,获取请访问:python666.cn/c/9
或在号内回复关键字:梅西
公众号的读者朋友们购买后可在后台联系我,加入读者交流群,Crossin会为你开启陪读模式,解答你在阅读本书时的一切疑问。
感谢转发和点赞的各位~
_往期文章推荐_
英语不好能不能学编程?如需了解付费精品课程及教学答疑服务请在Crossin的编程教室内回复: 666关键词:
您可能也感兴趣:
为您推荐
“数算电”融合发展强引领 “郑庆哈”合作携手向未来 环球观速讯
世界观点:什么牌子的逆变器比较好_逆变器哪个牌子好逆变器十大品牌排行榜
淳安县青溪新城物业管理有限公司是国企吗?|速看
排行
最近更新
- 用Python写了一个「拥抱梅西」的小游戏
- 播报:忆江南白居易_长歌行白居易
- 这次,韦老师也生气了 环球热点
- 市盈率怎么算股价,市盈率则么算|全球资讯
- 每日速讯:重磅!苹果Vision Pro开发者工具包正式发布!上海...
- 每日快报!俄外交部发言人:俄密切关注北约军演 北约以遏制俄...
- 7月1日调图后 长三角铁路旅客列车开行总数将创新高|全球要闻
- 每日动态!知托付广告(知托付)
- 小米7pro手环app|天天报资讯
- 科力尔:股东拟减持不超过0.02%的股份
- 中方代表在联合国人权理事会就涉疆等问题阐明严正立场
- rar密码清除工具绿色版_criotlauncherelevatecom rar
- 今热点:硬核科技论丨从概念到现实 车外后视镜大变革即将到...
- 全球最资讯丨吃榴莲会上火吗_榴莲上火吗
- 快消息!“小揽运”/引入插混系统 新款路虎揽胜极光官图发布
- 全球微头条丨夜读 | 红孩:我可以在这里唱歌
- 昆明市西山区的邮编_昆明市西山区邮编_全球即时看
- 全球热点评!疫情期间,吃什么食物比较好?最有帮助?
- 世界视讯!两部门优化研发费用加计扣除申报方式 政策享受时...
- 工信部:制定实施“5G+工业互联网”512升级版工作方案
- 如果三方交易最终完成 布罗格登将在8个赛季内为8位不同主帅...
- 广州市增城白水寨好玩吗多少钱_广州市增城白水寨好玩吗
- 启用会计期间是什么意思 会计期间是什么意思
- 【天天聚看点】安康刘仁卫简介(刘仁和 原陕西省安康地区行...
- 正荣地产7500万出售南京江北新区地块项目公司部分股权及债权
- 早参|端午假期出行请注意;广州要求开齐开足上好体育课
- 实时:长歌怀采薇是哪首诗(长歌怀采薇)
- 世界快播:凯叔讲故事全集完整版(凯叔讲故事全集)
- 全球速看:【网络中国节·端午】平凉华亭:多彩生活一起“绣...
- 世界今亮点!微软发布 Windows 11 Build 22621.1926 预...
今日要闻
- Soul发布《2023年轻人搭子社交报告》 全球滚动
- 每日快报!俄外交部发言人:俄密切关注北约军演 北约以遏制俄为目标
- 环球今头条!海棠花的诗句将门毒后_海棠花的诗句
- 【天天报资讯】保利水管和天力水管哪个好(天力水管好不好)
- 《FF16》中评汇总:老套的支线和故事是最大槽点 全球今热点
- SUKA世界行第十季泰国·曼芭站,泰国前副总理亲自接见,2000+SUKA人燃炸泰国
- 天际汽车停产后续:新增被执行超5036万
- “粽”享浓情 端午假期温州高速自制“安康粽”送祝福 环球时快讯
- 聚焦“恢复和扩大消费”专家支招“增强消费能力和消费信心”
- 中国夫妇日本旅游抓683只蟹被抓 称食用不知是保护动物:网友感叹