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

liftword1周前 (06-21)技术文章5

大家好,欢迎来到 Crossin的编程教室 !

最近有个小伙儿因为在比赛中冲进场地拥抱梅西而出名了。

这种行为当然不可取,他也为此付出了代价。但要说我没有一丁点羡慕和佩服那是不可能的。

于是,我也尬蹭一下这个热点,用Python写了一个「拥抱梅西」的小游戏。

游戏效果是这样的:

游戏规则很简单:

  1. 不要被拦截的工作人员追上
  2. 抱到梅西(接触一定时长)
  3. 定时会增加拦截的工作人员
  4. 可以反复拥抱
  5. 被追上后游戏结束,显示坚持的时间和拥抱的次数

代码已上传:python666.cn/c/9

运行说明

代码使用了游戏框架 pygame-zero 进行开发。之前我们也有发过基于这个框架的游戏:

羊了个羊,但是Python简(li)单(pu)版

因此运行代码前需先安装模块:

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.acc
self.speedy += self.fy * self.acc
# 限制最高速度
d = (self.speedx**2 + self.speedy**2)**0.5 / self.speed_max
if d > 1:
    self.speedx /= d
    self.speedy /= d
# 更新坐标
self.x += self.speedx
self.y += self.speedy

有了这样的设定之后,还有个好处就是可以增加游戏的可玩性,比如你可以设定一种最高速度比玩家快,但是加速度比较小的「工作人员」,玩家就需要通过不停地变换方向来摆脱。

代码中另一个比较复杂的地方是“转向”的细节处理。同样为了更加丝滑,我没有选择直接根据计算出的方向来改变角色贴图方向,而是将计算出的方向作为“目标方向”,然后根据角色当前实际方向与目标方向的偏差,决定是向顺时针还是逆时针方向旋转,直到两个方向小于一定阈值。

# 跑动方向
if keyboard.left:
    self.fx = -1
elif keyboard.right:
    self.fx = 1
else:
    self.fx = 0
if keyboard.up:
    self.fy = -1
elif keyboard.down:
    self.fy = 1
else:
    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.angle
else:
    self.angle_dest = direct        
# 贴图旋转
if abs(self.angle - self.angle_dest) < 5 or abs(self.angle - self.angle_dest) > 355:
    self.angle = self.angle_dest
else:
    if (0 < self.angle - self.angle_dest < 180) or (
        self.angle - self.angle_dest < -180):
        self.angle -= 500 * dt
    else:
        self.angle += 500 * dt

这段会牵扯一点初中几何的知识,想要理清的话建议在纸上画一画。

最后,是关于这个游戏的一个小视频,给大家图一乐:

我用Python抱梅西

相关文章

从python入门开始,玩这个炸弹超人小游戏,打通关就可以掌握编程

还记得那个街机游戏炸弹超人吗?#python#现在用python可以直接开发出一个这样的炸弹超人小游戏,并且非常简单,跟着详细教程学,再加上所有的源码,你就不仅能开发出一个这样的python小游戏,还...

原来通过玩游戏也可以学会编程,这里有六款编程游戏让你尝试

前言除了想成为一名程序员并拥有一份高薪工作之外,还有很多理由让你去学习编程。即使是那些认为自己在其他行业工作的人也可以学习编程,因为它在很多领域都有作用。如果您知道如何编写代码,那么您也知道如何将问题...

用python迭代器开发可以通关的小游戏

python的迭代器有两个重要的函数,一个是iter()用于创建迭代器,一个是next()用于获取迭代器中的元素。同样是遍历数据序列,迭代器与for循环比起来,各有各的优势,比如下面这个用迭代器开发的...

分享编程之美:Python弹球小游戏

Python是一种流行的编程语言,也是许多游戏开发者所使用的工具。我们可以使用Python来创建各种有趣的小游戏,比如弹球小游戏。首先,我们需要安装一个名为“pygame”的Python库。这个库包含...

Python 小白也能轻松上手!手把手教你用 for 和 if 打造猜数字游戏

大家好!今天,我们要用 Python 来制作一个经典的猜数字游戏。游戏规则很简单:电脑会随机想一个数字(比如 1 到 100 之间),然后你有几次机会来猜这个数字。每次猜测后,电脑会告诉你猜的数字是太...

python游戏编程你知道吗?小白也可以做游戏啦

代码敲不下去?讲解听不下去?那看看这个游戏编程吧,小白入门也没压力!...