首页 > 编程语言 >用Python写了一个「拥抱梅西」的小游戏

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

时间:2023-06-20 20:46:29浏览次数:62  
标签:angle Python 代码 dest 梅西 小游戏 方向 self

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

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

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

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

游戏效果是这样的: 

 游戏规则很简单:

  1. 不要被拦截的工作人员追上

  2. 抱到梅西(接触一定时长)

  3. 定时会增加拦截的工作人员

  4. 可以反复拥抱

  5. 被追上后游戏结束,显示坚持的时间和拥抱的次数

代码已上传,获取请访问: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.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

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

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

欢迎大家关注+三连~

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

标签:angle,Python,代码,dest,梅西,小游戏,方向,self
From: https://www.cnblogs.com/crossin/p/17494663.html

相关文章

  • 使用python对AWS-CloudTrail-Json-日志文件key字段名称的提取
    关于AWS CloudTrail-在Console界面,默认只能看到最近90天的数据如果需要追踪更早的操作记录,得需要配置CloudTrail日志输出保存到s3在s3上不同的region位于不同的目录,最后会将某一天的日志,存放到那一天的目录/文件夹中,目录路径格式(部分)如:aws-account-xxx/CloudTrail/cn-nort......
  • Python asyncio 库源码分析
    Pythonasyncio库源码分析前言本着「路漫漫其修远兮,吾将上下而求索」的精神。终于要开始深入研究Python中asyncio的源码实现啦。本文章可能篇幅较长,因为是逐行分析asyncio的实现,也需要读者具有一定的asyncio编码经验和功底,推荐刚开始踏上Python异步编程之旅的朋......
  • Python 列表生成式(转载)
    Python列表生成式列表生成式列表生成式即ListComprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式如何生成[1,2,3,4,5,6,7,8,9,10]列表?>>>list(range(1,11))[1,2,3,4,5,6,7,8,9,10]如何生成[1x1,2x2,3x3,...,10x10]......
  • Python 函数
    Python函数一、Python函数之定义函数在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:然后,在缩进块中编写函数体,函数的返回值用return语句返回。1、定义一个函数defmyfirst():print("Helloworld!")myfirst()#输出结果Hellow......
  • Python 迭代器和生成器
    Python迭代器和生成器1、迭代器迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于......
  • 【python】logging日志打印重复输出冗余日志
    https://blog.csdn.net/Moonlight_16/article/details/123334339?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-123334339-blog-96309743.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source=......
  • Python工具箱系列(三十六)
    基于Docker的数据库开发环境前文介绍了sqlite/mysql/mssql等数据库系统在ubuntu的安装与部署过程,相对是比较复杂的,需要耐心等待下载以及排除各种故障,对于开发人员来说是不太友好。在某些情况下,开发人员要测试在多个数据库环境下软件的正确性,需要部署多个数据库,为此可以使用Docker技......
  • 超级详细的python爬虫
    演示一个虎扑体育网站-NBA球员新手的话需要安装两个模块requests和lxmlrequests的作用:就是爬虫模块不断向浏览器发送请求lxml的作用:模块可以利用XPath规则语法,来快速的定位HTML\XML文档中特定元素以及获取节点信息1.mportrequests2.fromlxmlimportetree3.ur......
  • Python 强制杀死运行中的多进程脚本
    本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Python强制杀死运行中的多进程脚本,实现完全停止环境win10Pytho3.9获取当前脚本的进程id#获取当前进程......
  • requests爬虫实践之安居客二手房屋数据(python实现)
    1.先从安居客官网上淘到如下数据(详细方法可见博主爬取爱彼迎那篇博客):2.源码(警告:若频繁爬取安居客官网数据,将被要求入网验证…)importrequestsfrombs4importBeautifulSoupheaders={'user-agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,l......