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

得益于Python简洁的语法和强大的扩展库,使用Python编写应用变得十分快捷方便。比如今天要介绍的一款经典游戏超级玛丽的编写,如果用其他语言可能要上千行代码,而使用Python最少只需两百多行就可完成。不信?那就让我们一起开始吧。

我们使用的扩展库是Pygame Zero(简称Pgzero)。该库是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。

安装: pip install pgzero

建立游戏场景

建立游戏窗口只需两行代码:

import pgzrun
pgzrun.go()

在Python自带的IDLE编辑器中输入上述代码,运行便可以看到一个游戏窗口

如果想到调整窗口大小也很简单,只需再加入两行代码:

import pgzrun
HEIGHT=640
WIDTH=1024
pgzrun.go()

现在我们想为窗口设置一个背景颜色,可以在Pgzero提供的draw()函数中编写代码:

def draw():
    screen.fill((148, 146, 255))

上述代码用RGB颜色值(148, 146, 255)为游戏窗口生成了一个背景色,并自动显示出来,效果如下:

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

然后在程序中编写代码来读取文件,在相应字符的位置处生成物体,并将生成的物体全部加入到列表objs中。

最后在draw()函数中加入显示物体的代码即可:

def draw():
    screen.fill((148, 146, 255))
    for obj in objs:
        obj.draw()

场景的最终显示效果如下:

创建游戏角色

现在轮到主角隆重登场了。Pgzero中生成一个游戏角色十分简单,只需一行代码即可:

mario=Actor("smario.png",(200,HEIGHT-120))

Actor类是Pgzero提供的角色类,调用该类的构造方法并传入角色图片和位置便可生成一个角色对象,同时在draw()函数中显示该角色即可。修改后的draw()函数如下:

def draw():
    screen.fill((148, 146, 255))
    for obj in objs:
        obj.draw()
    mario.draw()

现在看看效果:

怎样?是不是还原度很高呢!

现在我们想让他动起来,比如按下空格键玛丽能跳跃,那么怎么办呢?首先可以为玛丽对象设置一个属性vy来表示垂直方向的速度值:

mario.vy=0

然后使用Pgzero提供的键盘处理函数on_key_down(),在其中加入如下代码:

def on_key_down(key):
    if key==keys.SPACE and mario.vy==0:
        mario.vy=-800

该函数会自动检测玩家的键盘按键事件,并将按键信息保存在key变量中。从代码中可以看到,当玩家按下的是SPACE键(即空格键),那么玛丽将获得一个垂直向上的速度值。

此外还要在Pgzero提供的update()方法中编写代码:

def update(dt):
    uy=mario.vy
    mario.vy=mario.vy+2000.0*dt
    mario.y=mario.y+(uy+mario.vy)*0.5*dt

update()也是Pgzero提供的一个内置函数,用来按固定的频率更新游戏逻辑,它和draw()一道构成了基本的游戏循环。上述代码对玛丽的速度值vy和坐标值y进行了精细的控制,以便真实模拟跳跃时的重力效果。

如此一来,当玩家按下空格键时,玛丽便可以腾空而起,然后在重力作用下掉回到地面。对于玛丽的左右移动控制也与此类似,详情可以查阅源代码,这里不再赘述。

场景与角色的交互

最后编写代码实现场景与角色的交互,这样玛丽便能站在地面上,而且可以顶砖块、吃蘑菇、捡金币、踩怪物等等。

以吃金币为例,我们可以编写如下代码:

class Coin(Actor):
    def react(self):
        if mario.colliderect(self):
            sounds.coin.play()
            objs.remove(self)
            mario.points=mario.points+1

我们首先定义了一个金币类Coin,它继承自Actor类。然后在其中定义了react()方法,该方法判断玛丽是否“吃”到了金币,如果吃到则先播放一个音效,接着将金币对象从objs列表中移除,最后为玛丽增加一个游戏积分。

可以看到,Pgzero为我们提供了非常便捷的API来实现游戏基础功能,比如判断玛丽是否吃到金币,这实际上是个碰撞检测问题,只需调用colliderect()方法即可,而不需要手动编制大量代码。同时播放声音也只用一行代码就可搞定,足见Pgzero是多么的方便。

游戏场景中其他物体与玛丽的交互与此类似,有兴趣的朋友可自行参阅代码。游戏最终运行效果如下:

《趣学python游戏编程》

源码下载链接:

https://www.aliyundrive.com/s/8uDL2tA3GyY


PS:若要全面系统学习Pygame Zero可以参考《趣学Python游戏编程》一书,该书通过十个经典游戏案例,深入浅出地介绍了游戏编程的基本原理,以及Pygame Zero的具体使用方法。相信学完这本书后你也能开发出如此精彩的小游戏。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
创建一个完整的超级玛丽游戏的代码会非常庞大,涉及到图形界面、游戏逻辑、物理引擎等多个复杂组件。不过,我们可以从基础开始,简要地演示如何使用Python的pygame库来创建一个简单的马里奥移动的原型。 ```python import pygame import sys # 初始化pygame pygame.init() # 设置窗口大小 screen_width = 600 screen_height = 400 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("Super Mario Prototype") # 马里奥图片 mario_image = pygame.image.load('mario.png') # 假设有一个名为'mario.png'的文件作为马里奥图像 mario_size = mario_image.get_size() # 定义马里奥位置 mario_x = 50 mario_y = 200 # 游戏主循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 移动马里奥 keys = pygame.key.get_pressed() # 获取按键状态 if keys[pygame.K_LEFT]: mario_x -= 10 if keys[pygame.K_RIGHT]: mario_x += 10 # 检查马里奥是否超出屏幕范围 if mario_x < 0: mario_x = 0 elif mario_x + mario_size > screen_width: mario_x = screen_width - mario_size # 绘制马里奥到屏幕上 screen.blit(mario_image, (mario_x, mario_y)) # 更新屏幕 pygame.display.update() # 结束游戏 pygame.quit() ``` 这个代码只是一个非常简化的版本,真正的超级玛丽游戏还会包含跳跃、敌人、关卡切换、得分等功能。如果你对特定的部分感兴趣,比如游戏控制、碰撞检测或动画处理,我可以提供更详细的指导。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值