用python和Pygame库实现“跳过障碍”游戏
游戏开发
跳过障碍游戏流程说明:
启动游戏后显示开始界面(包含游戏说明)
按空格键进入游戏
游戏过程中躲避障碍物获取分数
碰撞后显示结束界面(包含最终得分)
按空格键可立即开始新一局游戏
运行效果:
游戏体验优化建议(代码中修改):
可通过调节OBSTACLE_SPEED改变游戏难度(当前值5)
修改SPAWN_RATE调整障碍物生成频率(当前60帧/个)
调整JUMP_POWER和GRAVITY改变跳跃手感(当前15和0.5)
源码如下:
import pygame
import sys
# 初始化 Pygame
pygame.init()
# 游戏窗口设置
WIDTH, HEIGHT = 800, 600
win = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简易跳过障碍")
# 颜色定义
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GROUND_COLOR = (0, 128, 0)
BLACK = (0, 0, 0)
# 玩家设置
PLAYER_SIZE = 50
JUMP_POWER = 15
GRAVITY = 0.5
# 地面设置
GROUND_HEIGHT = 50
class Obstacle:
"""障碍物类,包含碰撞体和计分标记"""
def __init__(self, x, y, width, height):
self.rect = pygame.Rect(x, y, width, height)
self.passed = False # 是否已经通过玩家并计分
# 障碍物参数设置
OBSTACLE_WIDTH = 40
OBSTACLE_HEIGHT = 120 # 增加高度确保碰撞
OBSTACLE_SPEED = 5
SPAWN_RATE = 60 # 障碍物生成间隔帧数
# 游戏状态常量
START_SCREEN = 0
PLAYING = 1
GAME_OVER = 2
def init_game():
"""初始化游戏数据"""
global player_x, player_y, player_vel_y, obstacles, score, spawn_timer
player_x = 50
player_y = HEIGHT - PLAYER_SIZE # 玩家初始位置在地面
player_vel_y = 0
obstacles = []
score = 0
spawn_timer = 0
def draw_start_screen():
"""绘制包含游戏说明的开始界面"""
win.fill(WHITE)
# 标题文字
title_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 64)
title_text = title_font.render("跳过障碍", True, BLUE)
title_rect = title_text.get_rect(center=(WIDTH//2, HEIGHT//3))
# 游戏说明
instr_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36)
instructions = [
"游戏规则:",
"按 空格键 跳跃躲避障碍",
"坚持越久得分越高",
"碰到红色障碍物游戏结束",
"按 空格键 开始游戏"
]
y_offset = HEIGHT//2
for text in instructions:
surf = instr_font.render(text, True, BLACK)
rect = surf.get_rect(center=(WIDTH//2, y_offset))
win.blit(surf, rect)
y_offset += 50
win.blit(title_text, title_rect)
pygame.display.update()
def draw_game_over_screen(final_score):
"""绘制游戏结束界面"""
win.fill(WHITE)
over_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 64)
over_text = over_font.render("游戏结束", True, RED)
over_rect = over_text.get_rect(center=(WIDTH//2, HEIGHT//3))
score_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 48)
score_text = score_font.render(f"最终得分: {final_score}", True, BLACK)
score_rect = score_text.get_rect(center=(WIDTH//2, HEIGHT//2))
instr_font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36)
restart_text = instr_font.render("按 空格键 重新开始", True, BLACK)
restart_rect = restart_text.get_rect(center=(WIDTH//2, HEIGHT*2//3))
win.blit(over_text, over_rect)
win.blit(score_text, score_rect)
win.blit(restart_text, restart_rect)
pygame.display.update()
def game_loop():
"""游戏主逻辑循环"""
global player_y, player_vel_y, spawn_timer, score
clock = pygame.time.Clock()
game_state = START_SCREEN
init_game()
font = pygame.font.Font("C:\\Windows\\Fonts\\simsun.ttc", 36)
while True:
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
if game_state == START_SCREEN:
game_state = PLAYING
elif game_state == GAME_OVER:
init_game()
game_state = PLAYING
elif game_state == PLAYING and player_y >= HEIGHT - PLAYER_SIZE: # 确保在地面才能跳跃
player_vel_y = -JUMP_POWER
if game_state == PLAYING:
# 物理模拟
player_vel_y += GRAVITY
player_y += player_vel_y
# 地面碰撞检测
if player_y > HEIGHT - PLAYER_SIZE:
player_y = HEIGHT - PLAYER_SIZE
player_vel_y = 0
# 障碍物生成(每SPAWN_RATE帧生成一个)
spawn_timer += 1
if spawn_timer >= SPAWN_RATE:
# 生成位置调整:底部与地面接触
new_obstacle = Obstacle(
WIDTH, # 初始在屏幕右外侧
HEIGHT - OBSTACLE_HEIGHT, # 直接接触地面
OBSTACLE_WIDTH,
OBSTACLE_HEIGHT
)
obstacles.append(new_obstacle)
spawn_timer = 0
# 移动障碍物并检测通过
player_rect = pygame.Rect(player_x, player_y, PLAYER_SIZE, PLAYER_SIZE)
for obstacle in obstacles[:]:
# 移动障碍物
obstacle.rect.x -= OBSTACLE_SPEED
# 计分检测:障碍物完全通过玩家且未被标记
if obstacle.rect.right < player_rect.left and not obstacle.passed:
score += 1
obstacle.passed = True # 标记为已计分
# 移除移出屏幕的障碍物
if obstacle.rect.right < 0:
obstacles.remove(obstacle)
# 碰撞检测(使用像素完美碰撞检测)
if player_rect.colliderect(obstacle.rect):
game_state = GAME_OVER
# 绘制游戏画面
win.fill(WHITE)
# 绘制地面
pygame.draw.rect(win, GROUND_COLOR, (0, HEIGHT - GROUND_HEIGHT, WIDTH, GROUND_HEIGHT))
# 绘制玩家
pygame.draw.rect(win, BLUE, player_rect)
# 绘制障碍物
for obstacle in obstacles:
pygame.draw.rect(win, RED, obstacle.rect)
# 显示得分
score_text = font.render(f"得分: {score}", True, BLACK)
win.blit(score_text, (10, 10))
pygame.display.update()
elif game_state == START_SCREEN:
draw_start_screen()
elif game_state == GAME_OVER:
draw_game_over_screen(score)
clock.tick(60)
if __name__ == "__main__":
game_loop()
打包发布
PyInstaller 是一个流行的 Python 打包工具,可以将 Python 应用程序及其依赖项打包成单个可执行文件(如 Windows 上的.exe 文件)。PyInstaller 的核心功能是将 Python 脚本及其依赖的模块和资源文件打包成一个独立的可执行文件。
对于非技术用户来说,运行一个独立的可执行文件比安装 Python 环境和依赖库要简单得多。
对于开发者来说,可以将程序打包成一个文件或一个目录,方便分发和部署。
PyInstaller针对Windows、macOS和Linux进行了测试。但是,它不是交叉编译器;要制作Windows应用程序,您可以在Windows上运行PyInstaller,要制作Linux应用程序,您可以在Linux上运行它等。
官方文档 https://pyinstaller.org/en/stable/
关于pyinsatller安装使用可参见:
使用pyinsatller将python程序项目发布为可执行文件(修订版)
https://blog.csdn.net/cnds123/article/details/115254418
我这里将本游戏命名为: 跳过障碍.py ,将之复制到文件夹 “D:\跳过障碍游戏”中。
打开命令行(终端)窗口,并导航到. py文件所在的目录,然后使用以下命令构建您的应用程序:
cd /d D:\跳过障碍游戏
pyinstaller -F -w 跳过障碍.py
-F或--onefile:将 Python 脚本及其所有依赖项打包成一个单独的可执行文件(例如 .exe 文件)。
使用 -w 或 --windowed 选项,你可以确保打包后的程序在运行时不显示控制台窗口,从而提供更干净的用户体验。
OK!