Python 的 Pygame 库,编写简单的 Flappy Bird 游戏

Pygame 是一个用 Python 编写的开源游戏开发框架,专门用于编写 2D 游戏。它提供了丰富的工具和功能,使得开发者能够快速实现游戏中的图形渲染、声音播放、输入处理和动画效果等功能。Pygame 非常适合初学者和想要快速创建游戏原型的开发者。

Pygame 的主要特点

  1. 跨平台:Pygame 可以在 Windows、Mac 和 Linux 上运行,使得开发的游戏能够在多个平台上发布。
  2. 简单易学:Python 的简洁语法加上 Pygame 提供的友好接口,使得 Pygame 非常适合编程初学者入门游戏开发。
  3. 丰富的功能模块
    • 图形处理:支持加载和绘制图像、图形元素、精灵动画等,方便构建游戏画面。
    • 声音和音乐:支持播放音效和背景音乐,为游戏添加声音效果。
    • 事件处理:可以处理键盘、鼠标、手柄等多种输入,响应玩家的操作。
    • 游戏时钟:提供了时间管理和帧率控制,确保游戏运行流畅。
  4. 良好的文档和社区:Pygame 有详细的文档和活跃的开发者社区,方便查阅资料和获取帮助。

Pygame 的基本架构

Pygame 的游戏一般由以下几个核心部分组成:

  • 初始化:导入并初始化 Pygame,设置窗口大小、标题等。
  • 主循环:包括事件处理、游戏逻辑更新、绘图和屏幕刷新。
  • 事件处理:通过捕获用户的输入事件(如键盘和鼠标)来控制游戏行为。
  • 游戏逻辑更新:更新游戏状态,例如角色位置、得分等。
  • 渲染和刷新:将画面绘制在屏幕上,并刷新显示。

示例

以下是一个简单的 Pygame 程序框架:

import pygame
import sys

# 初始化 Pygame
pygame.init()

# 设置屏幕大小
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame 简单示例")

# 游戏循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    
    # 填充背景色
    screen.fill((0, 0, 0))
    
    # 更新显示
    pygame.display.flip()

# 退出 Pygame
pygame.quit()
sys.exit()

Pygame 的应用场景

Pygame 适用于开发各种 2D 游戏和简单的交互式应用,如:

  • 跑酷游戏
  • 益智小游戏
  • 复古风格的像素游戏
  • 学习编程和游戏开发的教学助手

《Flappy Bird》是一个由越南开发者阮哈东(Dong Nguyen)设计的移动游戏,于2013年5月首次发布。游戏在2014年突然流行开来,因其简单而极具挑战性的玩法迅速吸引了大量玩家。

在《Flappy Bird》中,玩家通过点击屏幕使小鸟向上飞行,松开则下落,目标是操控小鸟飞过一系列管道而不碰到障碍物。游戏看似简单,但由于操作难度较高,很多人很难持续通过管道而不会失败。正因为其高难度和简单玩法,这款游戏迅速成为热门。

有趣的是,由于游戏过于流行,导致开发者觉得给人们带来了“太多压力”,在2014年初他决定从应用商店下架游戏。这种下架行为反而让《Flappy Bird》更加知名,并引发了一股怀旧情绪。


下面是一个完整的《Flappy Bird》简化版代码,实现了小鸟的跳跃、重力效果、障碍物生成、碰撞检测和得分系统。

在运行代码之前,请确保安装了Pygame库。你可以使用以下命令安装:

pip install pygame

完整代码

import pygame
import random
import sys

# 初始化 Pygame
pygame.init()

# 屏幕大小和颜色
WIDTH, HEIGHT = 400, 600
WHITE = (255, 255, 255)
BLUE = (135, 206, 250)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Flappy Bird 简化版")
clock = pygame.time.Clock()

# 小鸟参数
bird_x = 50                  # 小鸟的水平位置(x坐标)
bird_y = HEIGHT // 2         # 小鸟的垂直位置(y坐标),初始为屏幕高度的一半
bird_radius = 20             # 小鸟的半径,用于绘制小鸟的大小
gravity = 0.5                # 重力值,控制小鸟下落的速度
bird_speed = 0               # 小鸟的初始垂直速度
jump_speed = -8              # 小鸟跳跃时的速度(负值使小鸟向上飞)

# 管道参数
pipe_width = 70              # 管道的宽度
pipe_gap = 200               # 上下管道之间的距离(空隙)
pipe_speed = 3               # 管道移动的速度
pipe_frequency = 2500        # 管道生成的频率,以毫秒为单位(1500毫秒,即每1.5秒生成一个新管道)
 
# 分数
score = 0
font = pygame.font.Font(None, 36)

# 管道列表
pipes = []
ADD_PIPE = pygame.USEREVENT
pygame.time.set_timer(ADD_PIPE, pipe_frequency)

def create_pipe():
    """创建新的管道,返回上管道和下管道的矩形对象"""
    height = random.randint(100, 400)
    top_pipe = pygame.Rect(WIDTH, 0, pipe_width, height)
    bottom_pipe = pygame.Rect(WIDTH, height + pipe_gap, pipe_width, HEIGHT - height - pipe_gap)
    return top_pipe, bottom_pipe

def move_pipes(pipes):
    """移动管道"""
    for pipe in pipes:
        pipe.x -= pipe_speed
    return [pipe for pipe in pipes if pipe.x + pipe_width > 0]

def check_collision(bird, pipes):
    """检查小鸟是否与管道或边界碰撞"""
    if bird.y - bird_radius <= 0 or bird.y + bird_radius >= HEIGHT:
        return True
    for pipe in pipes:
        if bird.colliderect(pipe):
            return True
    return False

# 游戏循环
running = True
while running:
    screen.fill(BLUE)
    
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            bird_speed = jump_speed  # 点击空格时小鸟向上跳跃
        if event.type == ADD_PIPE:
            pipes.extend(create_pipe())  # 添加新管道

    # 小鸟运动
    bird_speed += gravity
    bird_y += bird_speed
    bird = pygame.Rect(bird_x, bird_y, bird_radius * 2, bird_radius * 2)
    pygame.draw.circle(screen, YELLOW, (bird_x, int(bird_y)), bird_radius)

    # 管道运动
    pipes = move_pipes(pipes)
    for pipe in pipes:
        pygame.draw.rect(screen, GREEN, pipe)

    # 检查碰撞
    if check_collision(bird, pipes):
        print(f"游戏结束!最终得分: {score}")
        pygame.quit()
        sys.exit()

    # 更新得分
    for pipe in pipes:
        if pipe.right == bird_x:
            score += 0.5  # 每通过一个管道对得分加1(两个管道成对出现)
    
    # 显示得分
    score_text = font.render(f"Score: {int(score)}", True, WHITE)
    screen.blit(score_text, (10, 10))

    pygame.display.flip()
    clock.tick(30)  # 控制帧率

在这里插入图片描述

代码说明

  • 小鸟的运动:小鸟受到重力影响,按空格键可以向上跳跃。
  • 管道生成和移动:每隔一段时间生成一对上下管道,管道会从右向左移动。
  • 碰撞检测:检测小鸟是否碰到管道或屏幕边界,一旦碰到,游戏结束。
  • 得分系统:每通过一对管道得1分。

运行效果

  • 游戏中小鸟会自动下落,按空格键控制其上升。
  • 小鸟需要通过上下管道之间的空隙,碰到管道或边界即游戏结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【缓存策略】你知道 Cache Aside(缓存旁路)这个缓存策略吗

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

2024版最新kali linux 新手教程(非常详细)零基础入门到精通,收藏这篇就够了

您是否有兴趣使用 Kali Linux&#xff0c;但不知道从哪里开始&#xff1f;您来对地方了。 Kali Linux 是一个强大的渗透测试和道德黑客工具&#xff0c;提供许多工具和资源。 本 Kali Linux 教程将向您展示如何下载和安装它、解释桌面并强调您应该知道的关键领域。接下来&…

Android JNI 技术入门指南

引言 在Android开发中&#xff0c;Java是一种主要的编程语言&#xff0c;然而&#xff0c;对于一些性能要求较高的场景&#xff08;如音视频处理、图像处理、计算密集型任务等&#xff09;&#xff0c;我们可能需要使用到C或C等语言来编写底层的高效代码。为了实现Java代码与C…

国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?

EasyCVR视频融合云平台&#xff0c;是TSINGSEE青犀视频“云边端”架构体系中的“云平台”系列之一&#xff0c;是一款针对大中型项目设计的跨区域、网络化、视频监控综合管理系统平台&#xff0c;通过接入视频监控设备及视频平台&#xff0c;实现视频数据的集中汇聚、融合管理、…

HarmonyOS NEXT:模块化项目 ——修改应用图标+启动页等

涉及官方文档 应用配置文件应用/组件级配置图标资源规范 涉及到app.json5配置文件和module.json5配置文件 1、 icon和label的校验。 IDE从5.0.3.800版本开始&#xff0c;不再对module.json5中的icon和label做强制校验&#xff0c;因此module.json5与app.json5只需要选择其一…

产品经理晋级-Axure中继器+动态面板制作美观表格

步骤如下&#xff1a; 将你的表格&#xff08;制作好的表格复制&#xff09; 在工作页面中&#xff0c;添加动态面板&#xff0c;并把刚才复制的表格添加进来

java 面向对象高级

1.final关键字 class Demo{public static void main(String[] args) {final int[] anew int[]{1,2,3};// anew int[]{4,5,6}; 报错a[0]5;//可以&#xff0c;解释了final修饰引用性变量&#xff0c;变量存储的地址不能被改变&#xff0c;但地址所指向的对象的内容可以改变} }什…

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…

echarts引入自定义字体不起作用问题记录

echarts引入自定义字体不起作用问题记录 1、问题描述 初始化界面字体不作用&#xff0c;当界面更新后字体样式正常显示 2、原因描述 这通常是由于字体文件加载延迟导致的。ECharts 在初始化时可能还没有加载完字体文件&#xff0c;因此无法正确应用字体样式 3、解决方案 …

AscendC从入门到精通系列(一)初步感知AscendC

1 什么是AscendC Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。基于Ascend C编写的算子程序&#xff0c;通过编译器编译和运行时调度&#xff0c;运行在昇腾AI处理器上。使用Ascend C&#xff0c;开发者…

JavaScript——函数、事件与BOM对象

一、系统函数(JS中预置的函数) JS的预置函数在遇到非数字字符时会停止解析 parseInt 转整型 parseFloat 转浮点型 isNaN !isNaN("10") 检测是否纯数字 eval 把字符串转成算式并计算 1.parseInt(string, radix); 语法&#xff1a; string&#x…

Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程

若事与愿违&#xff0c;请相信&#xff0c;上天自有安排&#xff0c;允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程 进程&#xff1a;就…

OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据 ECC 标准 78找到两幅图像之间的几何变换&#xff08;warp&#xff09;。 该函数根据 ECC 标准 ([78]) 估计最优变换&#xff08;warpMatri…

彻底解决单片机BootLoader升级程序失败问题

文章目录 1、引言2、MicroBoot&#xff1a;优雅的解决升级问题问题1&#xff1a;bootloader 在跳转到app前没有清理干净存在的痕迹问题2&#xff1a; 需要 APP 传递信息给 Bootloader问题3&#xff1a; APP单独运行没有问题&#xff0c;通过Bootloader跳转到APP运行莫名死机问题…

v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条

效果 导入组件 import ElImageViewer from "element-ui/packages/image/src/image-viewer"; components:{ ElImageViewer },模板使用组件 <el-image-viewerv-if"isShowPics":on-close"closeViewer":url-list"srcList"/>定义两…

山寨一个Catch2的SECTION

Catch2 是一个 C 单元测试库&#xff0c;吹嘘自己比 NUnit 和 xUnit 还要高明&#xff0c; 支持在 TEST_CASE() 中的多个 SECTION&#xff0c; 意思是说 SECTION 外头的代码相当于setup 和 teardown&#xff0c;section 内部则被认为是实际的 test case&#xff0c; 这种写法可…

深入剖析【C++继承】:单一继承与多重继承的策略与实践,解锁代码复用和多态的编程精髓,迈向高级C++编程之旅

​​​​​​​ &#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: C专栏 目录 继承的概念及定义 继承的概念 继承定义 定义格式 继承基类成员访问⽅式的变化 继承类模板 基类和派⽣类间的转换 继承中的作⽤域 隐藏规则 成员函数的隐藏 考察继承【作⽤…

36.Redis核心设计原理

本文针对前面的讲解做一次总结 1.Redis基本特性 1.非关系型的键值对数据库&#xff0c;可以根据键以O(1)的时间复杂度取出或插入关联值 2.Redis的数据是存在内存中的 3.键值对中键的类型可以是字符串&#xff0c;整型&#xff0c;浮点型等&#xff0c;且键是唯一的 4.键值对中…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

vue项目npm run serve出现【- Network: unavailable】(从排查到放弃)

1. 问题现象 环境&#xff1a; 系统&#xff1a;win11node&#xff1a;v16.20.2“vue”: “2.6.10” 执行npm run serve启动vue项目&#xff0c;期望&#xff1a; App running at:- Local: http://localhost:9528/ - Network: http://x.x.x.x:9528/实际&#xff1a; App runn…