请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 2203|回复: 0

用Python写了一个「拥抱梅西」的小游戏

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2023-6-21 11:40:02 |显示全部楼层
大家好,欢迎来到 Crossin的编程教室 !
最近有个小伙儿因为在比赛中冲进场地拥抱梅西而出名了。
这种行为当然不可取,他也为此付出了代价。但要说我没有一丁点羡慕和佩服那是不可能的。
于是,我也尬蹭一下这个热点,用Python写了一个「拥抱梅西」的小游戏。
游戏效果是这样的:
WX20230618-164553@2x.png

>> 点击查看动图

游戏规则很简单:
  • 不要被拦截的工作人员追上
  • 抱到梅西(接触一定时长)
  • 定时会增加拦截的工作人员
  • 可以反复拥抱
  • 被追上后游戏结束,显示坚持的时间和拥抱的次数

代码已上传,获取请访问:python666.cn/c/9

运行说明

代码使用了游戏框架 pygame-zero 进行开发。之前我们也有发过基于这个框架的游戏:
如果你对于此框架还不熟悉,可以看下这篇介绍:
因此运行代码前需先安装模块:
  1. <font color="#000000">pip install pgzero</font>
复制代码
用此框架代码看起来与一般代码稍有不同,它更像一个配置脚本,其中会出现很多未定义的方法和变量,因此在很多编辑器里会提示有错,但其实是可以运行的,无需手动增加 import。这也是为什么你会看到我视频里的代码截图有大量的下划线。
pgzero有两种方式运行,一种是通过命令行的 pgzrun 命令;另一种是直接在编辑器中运行。参见官方文档:
https://pygame-zero.readthedocs.io/zh_CN/latest/ide-mode.html
本代码用的是第二种直接运行的方式(需新版pgzero),可直接在IDE中执行。
有部分读者反馈此代码在spyder等一些编辑器中无法运行,类似情况可以尝试第一种传统方法,即把最后一行代码 pgzrun.go() 去掉,然后直接在命令行该目录下运行:
  1. pgzrun iMessi.py
复制代码
代码简介

如果你对代码的核心逻辑其实比较容易理解。
  • 对于「玩家」来说,就是根据上下左右按键,变换位置坐标;
  • 对于「工作人员」来说,就是根据自身和玩家的相对位置算出移动的方向,不断靠近,如果碰上了就游戏结束
  • 对于「梅西」来说,就是判断是否与玩家碰上,并记录碰上的持续时间

判断是否“碰上”很简单,就是计算一下两个坐标的距离是否小于一定值。
至于角色的移动,粗略的做法是,计算出x轴方向和y轴方向上的速度,然后在update函数中,将原坐标位置加上速度值,得到新的坐标位置。
但在我这次的代码中,为了让跑动更“丝滑”,没有选择直接改变速度,而是根据玩家的按键计算出加速度,然后在update函数中,将原速度值加上加速度值,得到新的速度,再用新的速度去计算新的坐标位置。
  1. # 加速
  2. self.speedx += self.fx * self.acc
  3. self.speedy += self.fy * self.acc
  4. # 限制最高速度
  5. d = (self.speedx**2 + self.speedy**2)**0.5 / self.speed_max
  6. if d > 1:
  7.     self.speedx /= d
  8.     self.speedy /= d
  9. # 更新坐标
  10. self.x += self.speedx
  11. self.y += self.speedy
复制代码
有了这样的设定之后,还有个好处就是可以增加游戏的可玩性,比如你可以设定一种最高速度比玩家快,但是加速度比较小的「工作人员」,玩家就需要通过不停地变换方向来摆脱。
代码中另一个比较复杂的地方是“转向”的细节处理。同样为了更加丝滑,我没有选择直接根据计算出的方向来改变角色贴图方向,而是将计算出的方向作为“目标方向”,然后根据角色当前实际方向与目标方向的偏差,决定是向顺时针还是逆时针方向旋转,直到两个方向小于一定阈值。
  1. # 跑动方向
  2. if keyboard.left:
  3.     self.fx = -1
  4. elif keyboard.right:
  5.     self.fx = 1
  6. else:
  7.     self.fx = 0
  8. if keyboard.up:
  9.     self.fy = -1
  10. elif keyboard.down:
  11.     self.fy = 1
  12. else:
  13.     self.fy = 0
  14. # 计算目标方向角度
  15. directs = ((135, 180, -135), (90, None, -90), (45, 0, -45))
  16. direct = directs[self.fx + 1][self.fy + 1]
  17. if direct is None:
  18.     self.angle_dest = self.angle
  19. else:
  20.     self.angle_dest = direct        
  21. # 贴图旋转
  22. if abs(self.angle - self.angle_dest) < 5 or abs(self.angle - self.angle_dest) > 355:
  23.     self.angle = self.angle_dest
  24. else:
  25.     if (0 < self.angle - self.angle_dest < 180) or (
  26.         self.angle - self.angle_dest < -180):
  27.         self.angle -= 500 * dt
  28.     else:
  29.         self.angle += 500 * dt
复制代码
这段会牵扯一点初中几何的知识,想要理清的话建议在纸上画一画。
最后,是关于这个游戏的一个小视频,给大家图一乐:

https://www.bilibili.com/video/BV1pu411a7ij/

欢迎大家关注+三连~
代码已上传,获取请访问:python666.cn/c/9



本书力求做到浅显易懂,让完全没有编程经验的零基础“小白”也能学会Python。内容从环境搭建这种最基础的步骤开始讲起,逐渐深入到常见的实际应用当中。在讲解知识点的同时配有相应的代码示例,让读者可以边学边练加深理解。书中还创新地使用 ChatGPT 作为编程学习的辅助,带领读者探索AI时代下学习编程的新模式。
公众号的读者朋友们购买后可在后台联系我,加入读者交流群,Crossin会为你开启陪读模式,解答你在阅读本书时的一切疑问。
感谢转发点赞的各位~
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-7-15 12:45 , Processed in 0.031022 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部