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

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

【bash】

pip install pygame

游戏的代码:

【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及其子模块:用于游戏开发,包括图形显示、声音处理等。

  1. 游戏设置和初始化:

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

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

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

  1. 游戏循环:

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

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

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

  1. 事件处理:

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

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

  1. 碰撞检测:

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

  1. 得分系统:

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

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

  1. 游戏重置:

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

  1. 变量和数据类型:

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

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

  1. 控制结构:

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

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

  1. 函数和模块:

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

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

  1. 物理效果(可选):

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

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

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

相关推荐
凡人的AI工具箱14 分钟前
每天40分玩转Django:Django管理界面
开发语言·数据库·后端·python·django
每天写点bug28 分钟前
【go每日一题】:并发任务调度器
开发语言·后端·golang
一个不秃头的 程序员30 分钟前
代码加入SFTP Go ---(小白篇5)
开发语言·后端·golang
Gauss松鼠会37 分钟前
GaussDB数据库中SQL诊断解析之配置SQL限流
数据库·人工智能·sql·mysql·gaussdb
数据小爬虫@39 分钟前
Python爬虫抓取数据,有哪些常见的问题?
开发语言·爬虫·python
愚者大大1 小时前
1. 深度学习介绍
人工智能·深度学习
liuming19921 小时前
Halcon中histo_2dim(Operator)算子原理及应用详解
图像处理·人工智能·深度学习·算法·机器学习·计算机视觉·视觉检测
逊嘘1 小时前
【Java数据结构】ArrayList相关的算法
java·开发语言
基哥的奋斗历程1 小时前
初识Go语言
开发语言·后端·golang