• 售前

  • 售后

热门帖子
入门百科

Python编写超级玛丽竟然如此简单?不信你试试

[复制链接]
术数古籍专卖疤 显示全部楼层 发表于 2022-1-12 12:11:08 |阅读模式 打印 上一主题 下一主题
得益于Python简洁的语法和强大的扩展库,使用Python编写应用变得十分快捷方便。比如今天要介绍的一款经典游戏超级玛丽的编写,如果用其他语言可能要上千行代码,而使用Python最少只需两百多行就可完成。不信?那就让我们一起开始吧。
我们使用的扩展库是Pygame Zero(简称Pgzero)。该库是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。
安装: pip install pgzero
建立游戏场景

建立游戏窗口只需两行代码:
  1. <code>import pgzrun
  2. pgzrun.go()
复制代码
在Python自带的IDLE编辑器中输入上述代码,运行便可以看到一个游戏窗口

如果想到调整窗口大小也很简单,只需再加入两行代码:
  1. <code>import pgzrun
  2. HEIGHT=640
  3. WIDTH=1024
  4. pgzrun.go()
复制代码
现在我们想为窗口设置一个背景颜色,可以在Pgzero提供的draw()函数中编写代码:
  1. <code>def draw():
  2.     screen.fill((148, 146, 255))
复制代码
上述代码用RGB颜色值(148, 146, 255)为游戏窗口生成了一个背景色,并自动显示出来,效果如下:

接下来定义一个文本文件,把游戏场景中各种物体的位置用字母记录下来:

然后在程序中编写代码来读取文件,在相应字符的位置处生成物体,并将生成的物体全部加入到列表objs中。
最后在draw()函数中加入显示物体的代码即可:
  1. <code>def draw():
  2.     screen.fill((148, 146, 255))    for obj in objs:        obj.draw()
复制代码
场景的最终显示效果如下:

创建游戏角色

现在轮到主角隆重登场了。Pgzero中生成一个游戏角色十分简单,只需一行代码即可:
  1. <code>mario=Actor("smario.png",(200,HEIGHT-120))
复制代码
Actor类是Pgzero提供的角色类,调用该类的构造方法并传入角色图片和位置便可生成一个角色对象,同时在draw()函数中显示该角色即可。修改后的draw()函数如下:
  1. <code>def draw():
  2.     screen.fill((148, 146, 255))    for obj in objs:        obj.draw()    mario.draw()
复制代码
现在看看效果:

怎样?是不是还原度很高呢!
现在我们想让他动起来,比如按下空格键玛丽能跳跃,那么怎么办呢?首先可以为玛丽对象设置一个属性vy来表示垂直方向的速度值:
  1. <code>mario.vy=0
复制代码
然后使用Pgzero提供的键盘处理函数on_key_down(),在其中加入如下代码:
  1. <code>def on_key_down(key):
  2.     if key==keys.SPACE and mario.vy==0:
  3.         mario.vy=-800
复制代码
该函数会自动检测玩家的键盘按键事件,并将按键信息保存在key变量中。从代码中可以看到,当玩家按下的是SPACE键(即空格键),那么玛丽将获得一个垂直向上的速度值。
此外还要在Pgzero提供的update()方法中编写代码:
  1. <code>def update(dt):
  2.     uy=mario.vy
  3.     mario.vy=mario.vy+2000.0*dt
  4.     mario.y=mario.y+(uy+mario.vy)*0.5*dt
复制代码
update()也是Pgzero提供的一个内置函数,用来按固定的频率更新游戏逻辑,它和draw()一道构成了基本的游戏循环。上述代码对玛丽的速度值vy和坐标值y进行了精细的控制,以便真实模拟跳跃时的重力效果。
如此一来,当玩家按下空格键时,玛丽便可以腾空而起,然后在重力作用下掉回到地面。对于玛丽的左右移动控制也与此类似,详情可以查阅源代码,这里不再赘述。
场景与角色的交互

最后编写代码实现场景与角色的交互,这样玛丽便能站在地面上,而且可以顶砖块、吃蘑菇、捡金币、踩怪物等等。
以吃金币为例,我们可以编写如下代码:
  1. <code>class Coin(Actor):
  2.     def react(self):
  3.         if mario.colliderect(self):
  4.             sounds.coin.play()
  5.             objs.remove(self)
  6.             mario.points=mario.points+1
复制代码
我们首先定义了一个金币类Coin,它继承自Actor类。然后在其中定义了react()方法,该方法判断玛丽是否“吃”到了金币,如果吃到则先播放一个音效,接着将金币对象从objs列表中移除,最后为玛丽增加一个游戏积分。
可以看到,Pgzero为我们提供了非常便捷的API来实现游戏基础功能,比如判断玛丽是否吃到金币,这实际上是个碰撞检测问题,只需调用colliderect()方法即可,而不需要手动编制大量代码。同时播放声音也只用一行代码就可搞定,足见Pgzero是多么的方便。
游戏场景中其他物体与玛丽的交互与此类似,有兴趣的朋友可自行参阅代码。游戏最终运行效果如下:

 
源码下载链接:阿里云盘分享
最后祝大家天天进步!!学习Python最重要的就是心态。我们在学习过程中必然会遇到很多难题,可能自己想破脑袋都无法解决。这都是正常的,千万别急着否定自己,怀疑自己。如果大家在刚开始学习中遇到困难,想找一个python学习交流环境,可以 加入我们,领取学习资料,一起讨论。 

来源:https://blog.caogenba.net/huang5333/article/details/122408661
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作