Python小游戏27——飞翔的小鸟

首先,你需要确保已经安装了Pygame库。如果还没有安装,可以通过以下命令进行安装:

 

【bash】

 pip install pygame

7d38f50b463b4383ae3c994ee256f442.webp

 

游戏的代码:

 

【python】

 import pygame

import random

 

# 初始化Pygame

pygame.init()

 

# 设置屏幕大小和标题

screen_width = 288

screen_height = 512

screen = pygame.display.set_mode((screen_width, screen_height))

pygame.display.set_caption("飞翔的小鸟")

 

# 定义颜色

WHITE = (255, 255, 255)

BLACK = (0, 0, 0)

 

# 加载图像

bird_img = pygame.image.load('bird.png') # 你需要有一张名为bird.png的小鸟图像

pipe_top_img = pygame.image.load('pipe_top.png') # 管道上半部分图像

pipe_bottom_img = pygame.image.load('pipe_bottom.png') # 管道下半部分图像

 

# 定义小鸟类

class Bird:

    def __init__(self):

        self.x = screen_width // 2

        self.y = screen_height // 2

        self.gravity = 0.5

        self.jump = -10

        self.img = bird_img

        self.rect = self.img.get_rect()

        self.rect.centerx = self.x

        self.rect.bottom = self.y

 

    def update(self):

        self.gravity += 0.1

        self.y += self.jump + self.gravity

        self.jump = 0

        self.rect.centerx = self.x

        self.rect.bottom = self.y

 

        # 碰到地面则重置位置

        if self.rect.bottom >= screen_height:

            self.y = screen_height // 2

            self.gravity = 0.5

            self.jump = 0

 

    def draw(self, screen):

        screen.blit(self.img, self.rect)

 

    def jump_action(self):

        self.jump = -10

 

# 定义管道类

class Pipe:

    def __init__(self):

        self.x = screen_width + random.randint(0, 100)

        self.y = random.randint(100, 300)

        self.gap = random.randint(100, 200)

        self.top = pygame.transform.scale(pipe_top_img, (screen_width // 10, self.y))

        self.bottom = pygame.transform.scale(pipe_bottom_img, (screen_width // 10, screen_height - self.y - self.gap))

 

    def update(self):

        self.x -= 5

 

    def draw(self, screen):

        screen.blit(self.top, (self.x, 0))

        screen.blit(self.bottom, (self.x, self.y + self.gap))

 

    def check_collision(self, bird):

        bird_rect = pygame.Rect(bird.rect.x - bird.rect.width // 4, bird.rect.y, bird.rect.width // 2, bird.rect.height)

        if (bird_rect.colliderect(pygame.Rect(self.x, 0, self.top.get_width(), self.top.get_height())) or

            bird_rect.colliderect(pygame.Rect(self.x, self.y + self.gap, self.bottom.get_width(), self.bottom.get_height()))):

            return True

        return False

 

# 创建小鸟和管道对象

bird = Bird()

pipes = [Pipe() for _ in range(5)] # 初始生成5个管道

 

# 游戏主循环

running = True

clock = pygame.time.Clock()

 

while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

 

    # 检测按键

    keys = pygame.key.get_pressed()

    if keys[pygame.K_SPACE] and bird.y == screen_height // 2: # 只有当小鸟在地面上时才能跳跃

        bird.jump_action()

 

    # 更新小鸟和管道位置

    bird.update()

    for pipe in pipes:

        pipe.update()

 

    # 检查碰撞

    if any(pipe.check_collision(bird) for pipe in pipes):

        running = False # 碰到管道则游戏结束

 

    # 移除屏幕外的管道

    pipes = [pipe for pipe in pipes if pipe.x > -screen_width // 10]

    if not pipes:

        pipes.append(Pipe()) # 当所有管道都移出屏幕时,生成新的管道

 

    # 绘制背景(这里简单用白色填充)

    screen.fill(WHITE)

 

    # 绘制小鸟和管道

    bird.draw(screen)

    for pipe in pipes:

        pipe.draw(screen)

 

    # 更新屏幕显示

    pygame.display.flip()

 

    # 控制帧率

    clock.tick(30)

 

# 游戏结束处理

pygame.quit()

 

注意事项:

 

1. 你需要准备三张图像文件:bird.png(小鸟图像)、pipe_top.png(管道上半部分图像)和pipe_bottom.png(管道下半部分图像)。这些图像应该放在与你的Python脚本相同的目录中。

 

2. 游戏逻辑相对简单,只实现了基本的跳跃和碰撞检测功能。你可以根据需要进一步扩展和优化游戏功能,比如添加分数系统、增加更多的管道和障碍物等。

 

3. 游戏的帧率和管道生成速度等参数可以根据你的需要进行调整。

涉及代码知识总结:

 

1. 导入库和模块:

 

    • import pgzrun:导入pgzrun库,用于简化Pygame游戏的编写和运行。

 

    • import random:导入随机库,用于生成随机数和随机位置。

 

    • import pygame及其子模块:用于游戏开发,包括图形显示、声音处理等。

 

2. 游戏设置和初始化:

 

    • 设置窗口的宽度和高度。

 

    • 加载和显示背景、小鸟、障碍物等图片。

 

    • 初始化游戏变量,如得分、速度等。

 

3. 游戏循环:

 

    • draw()函数:负责绘制游戏的每一帧,包括背景、障碍物和小鸟。

 

    • update()函数:更新游戏状态,包括小鸟的下落与上升、障碍物的移动等。

 

    • 游戏循环中不断调用draw()和update()函数,形成游戏的动态效果。

 

4. 事件处理:

 

    • 检测鼠标点击事件,控制小鸟的上升。

 

    • 检测游戏结束条件,如小鸟碰到障碍物或超出屏幕边界。

 

5. 碰撞检测:

 

    • 使用Pygame的碰撞检测功能,判断小鸟是否与障碍物发生碰撞。

 

6. 得分系统:

 

    • 通过穿越障碍物间的空隙来增加得分。

 

    • 可以设置得分增加的条件和规则。

 

7. 游戏重置:

 

    • 当游戏失败时,重置游戏状态,包括得分、速度、小鸟和障碍物的位置等。

 

8. 变量和数据类型:

 

    • 使用整型、浮点型等数据类型存储游戏变量。

 

    • 使用列表、字典等数据结构存储和管理游戏元素。

 

9. 控制结构:

 

    • 使用if语句进行条件判断,如检测游戏结束条件。

 

    • 使用while循环实现游戏的主循环。

 

10. 函数和模块:

 

    • 定义函数来封装游戏逻辑和绘制代码,提高代码的可读性和可维护性。

 

    • 可以将游戏的不同部分拆分成多个模块,如背景模块、小鸟模块、障碍物模块等。

 

11. 物理效果(可选):

 

    • 对于进阶玩家,可以尝试将小鸟设定为受重力作用下落,实现更自然的游戏效果。这需要使用物理公式和计算来模拟小鸟的下落和上升过程。

 

12. 图形和音效(可选):

 

    • 使用Pygame的图形和音效功能,为游戏添加更丰富的视觉效果和听觉体验。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Three.js基础学习】24. shader patterns

前言 课程回顾: ShaderMaterial 这里用的是着色器材质 所以顶点和片段着色器就不需要像原始着色器那样添加需要的属性 然后写 片段着色器需要属性 : 顶点 属性 -》变化 -》 片段中 顶点中的属性不需要声明 只需要声明传送的变量 例如 varying vec vUv; vUv uv; 补充…

构建客服知识库:企业效率提升的关键步骤

客服知识库是企业提升客户服务效率和质量的重要工具。它不仅帮助客服团队快速准确地回答客户问题,还能通过数据分析来优化服务流程和提升客户满意度。 1. 明确知识库的目标和范围 构建客服知识库的第一步是明确其目标和范围。这包括确定知识库的主要用户群体、需要…

运动汇 专业的比赛管理平台数据获取

在获取到运动汇的网站链接后,界面如图所示: 右键检查,我们会发现没有任何数据,只有当我们点开这些"第一单元"、"第二单元"等,数据才会加载出来; 由于我们只需要分析这一个网页并获取其中的数据&a…

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。本文课题研究的“…

Docker环境搭建Cloudreve网盘服务(附shell脚本一键搭建)

Docker搭建Cloudreve Cloudreve介绍: Cloudreve 是一个基于 ThinkPHP 框架构建的开源网盘系统,旨在帮助用户以较低的成本快速搭建起既能满足个人也能满足企业需求的网盘服务。Cloudreve 支持多种存储介质,包括但不限于本地存储、阿里云OSS、…

Macs Fan Control - 控制 Apple 计算机上的风扇

免费下载 提供 macOS 和 Windows (Boot Camp) 版本 https://apsgo.cn/joN0WG Mac 风扇控制 监视和控制 Apple 计算机上的风扇 实时监控风扇速度和温度传感器,包括第三方 HDD/SSD(使用 S.M.A.R.T.)。设置自定义 RP…

3.STM32之通信接口《精讲》之USART通信

本节将进行实战,基础了解请查看第二节(Whappy)开始背!! USART ---》全双工 异步/同步 点对点 USART:STM32自带硬件电路,通过配置相对应的寄存器来设置数据帧的发送,我们收发只需要…

无插件H5播放器EasyPlayer.js网页web无插件播放器选择全屏时,视频区域并没有全屏问题的解决方案

EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方…

SPIRiT-Diffusion:基于自一致性驱动的加速MRI扩散模型|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 SPIRiT-Diffusion: Self-Consistency Driven Diffusion Model for Accelerated MRI SPIRiT-Diffusion:基于自一致性驱动的加速MRI扩散模型 01 文献速递介绍 磁共振成像(MRI) 在临床和研究领域被广泛应用。然而,其…

Vue3中一级导航栏的吸顶导航交互以及Pinia优化重复请求

一、前言 在日常的网站中,当鼠标滚轮往页面的底部滑动时,会出现顶部导航栏的隐藏,而出现新的导航栏显示,这就是一级导航栏的吸顶导航交互。本文当实现改模块功能的实现。 二、示例图 参考黑马程序员小兔仙儿PC端项目:…

JDK17源码系列-ArrayList源码解读

JDK17源码系列-ArrayList接口源码解读 1.List集合接口类图 2.ArrayList详细类图 ArrayList继承了AbstractList实现了List、Serializable等接口,实现Serializable接口使得ArrayList类的对象可以串行化,串行化后,对象可以进行网络传输&#x…

VBA学习笔记:点击单元格显示指定的列

应用场景: 表格中列数较多,特定条件下隐藏一些无关的列,只保留相关的列,使表格更加清晰。 示例:原表格如下 点击一年级,只显示一年级相关的科目: 点击二年级,只显示二年级相关的科…

RNN深度学习案例:LSTM火灾温度预测

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 前期准备数据 1.导入数据 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import MinMaxScaler from keras.lay…

nmap简单使用

nmap的基本功能 nmap有4个基本功能,分别是 端口扫描 主机探测 服务识别 系统识别 端口扫描 nmap 183.2.172.185 从图中可以看出开放了80和443端口 指定端口扫描 指定端口扫描使用-p参数,可以一次性扫描一个或多个或某个范围内的端口 nmap 183.…

python文件排序都有哪些方法

在python环境中提供两种排序方案:用库函数sorted()对字符串排序,它的对象是字符;用函数sort()对数字排序,它的对象是数字,如果读取文件的话,需要进行处理(把文件后缀名‘屏蔽’)。 …

uni-app快速入门(五)--判断运行环境及针对不同平台的条件编译

一、判断运行环境 在实际项目开发中,经常需要进行开发环境和生产环境的切换,uni-app可根据process.env.NODE_ENV判断当前运行环境是开发环境和生产环境,根据不同的环境调用不同的后台接口,具体实现方式: 在项目的static目录下建…

QT定时器

QT定时器 1.概述 这篇文章介绍如何使用定时器 2.定时器 2.1.创建项目 新建一个普通的widget类型项目,在widget.ui文件中添加一个label控件 2.1.QTimer 在帮助文档搜索timerEvent,查看QTimer Class 类提供的定时器。 该类提供了一个定时事件的函…

双指针优质算法题集

目录 一、双指针算法介绍 二、移动0 1、题目链接 2、题解 3、代码实现 (1)、初次实现: (2)、优化后的实现: 二、复写0 1、题目链接: 2、题解 3、代码实现 一、双指针算法介绍 这里的指…

博奥龙黑胶虫去除剂,新品来袭!

形态特征: 大小方面:黑胶虫的直径通常在 0.5~1 微米左右,一般比细菌要小,但在显微镜下仍可明显观察到。 形状方面:其形态不规则,初始呈现点状,随着培养时间的增加其形态可以转变为密集的小黑点…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…