【python实战】使用 pygame 写一个 flappy-bird 类小游戏 | 涉及思路+项目结构+代码详解 | 新手向

本文详细介绍了如何使用 Python 的 Pygame 库制作一款类似 Flappy Bird 的游戏——Amazing Brick。内容涵盖游戏设计思路、简易物理引擎实现、屏幕上升机制、得分检测、碰撞检测、障碍物生成以及程序结构。通过阅读,读者可以了解到游戏开发的基本流程和关键技巧。
摘要由CSDN通过智能技术生成

基于 pygame 的 Amazing-brick 实现

本文涉及三个 .py 文件:

amazing_brick / amazing_brick_utils.py
              / wrapped_amazing_brick.py
keyboard_play.py


项目地址:https://github.com/PiperLiu/Amazing-Brick-DFS-and-DRL

微信公众号:Piper蛋窝

Bilibili:枇杷鹭

设计思路


从玩家角度看,该游戏是动态的;但实际上,由于我没有使用已有物理引擎/游戏引擎,我是基于每一帧对游戏进行设计、并迭代画面的。

keyboard_play.py 在操作时,游戏类实体:game_state.frame_step(action) 处于一个无限循环中:

  • 每执行一次 game_state.frame_step(action)game_state 会判断位移、是否碰撞、是否得分,并绘制这一帧,并显示;
  • 默认收到的动作 action=1 ,即什么也不干;
  • 玩家按下按钮,将改变 action 的赋值。

1. 整体思路

如图,在游戏中需要绘制在屏幕上的,一共有三种实体:

  • 玩家(黑色方块);
  • 方块障碍物;
  • 中间留有空隙的长条障碍物。

基于这三个实体,我们主要需要考虑以下五个事件:

  • 简易的物理引擎,考虑重力、阻力与加速度;
  • 当玩家上升时,屏幕要随之上升;
  • 检测得分,当玩家穿过间隙时,得分加一;
  • 检测碰撞,当玩家碰到障碍物或撞墙时,游戏结束;
  • 新建随机障碍物。

下面我将展开分别讲解上述事件的实现。

2. 简易的物理引擎

简易物理引擎是最简单的部分,我们为玩家(黑色方块)声明几个变量,作为定位的依据,我这里选择的是左上点 (x, y)

此外,玩家还应该具有速度变量。在 2D 空间里,速度是一个矢量(有大小,有方向),为了方便计算,我用横轴坐标方向的速度值表示 (velX, velY) ,即:单位时间内的 X 、 Y 轴位移量来表示速度。

此外,还有加速度系统。为玩家声明四个变量,分布表示重力加速度、横向空气阻力带来的加速度、按下按钮后带来的横向加速度、按下按钮后带来的纵向加速度: gravity, dragForce, AccX, AccY

因此,我们就能很轻松地实现符合物理公式的运动系统:

  • 首先根据加速度计算速度;
  • 接下来根据速度计算玩家应该处于什么位置。

game/amazing_brick_utils.py

class Play:
    def __init__(self):
        self.x = ...
        self.y = ...
        self.x_= ...
        self.y_= ...
        # 如果你觉得游戏太难的话,可以改变这些物理参数
        self.gravity = 0.35
        self.dragForce = 0.01
        self.velX = 0
        self.velY = 0
        self.AccX = 4.5
        self.AccY = 2.5
    
    def lFlap(self):
        # 按下左边按钮时,玩家获得一个向左上的力
        # 因此速度发生改变
        self.velX -= self.AccX
        self.velY -= (self.AccY - self.gravity)
    
    def rFlap(self):
        # 按下右边按钮时,玩家获得一个向右上的力
        # 因此速度发生改变
        self.velX += self.AccX
        self.velY -= (self.AccY - self.gravity)
    
    def noneDo(self):
        # 没有按按钮
        # 玩家因为横向空气阻力而减缓横向速度
        # 此外,还因为重力向下加速
        if self.velX > 0:
            self.velX -= self.dragForce
        elif self.velX < 0:
            self.velX += self.dragForce
        self.velY += self.gravity

game/wrapped_amazing_brick.py 中,我在每帧的迭代代码中,添加了下述代码,用来根据当前速度,确定玩家的新位置:

class GameState:
    def __in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值