用python和Pygame库实现“跳过障碍”游戏
用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 = 50class 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 = 2def init_game():"""初始化游戏数据"""global player_x, player_y, player_vel_y, obstacles, score, spawn_timerplayer_x = 50player_y = HEIGHT - PLAYER_SIZE # 玩家初始位置在地面player_vel_y = 0obstacles = []score = 0spawn_timer = 0def 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//2for 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 += 50win.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, scoreclock = pygame.time.Clock()game_state = START_SCREENinit_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 = PLAYINGelif game_state == GAME_OVER:init_game()game_state = PLAYINGelif game_state == PLAYING and player_y >= HEIGHT - PLAYER_SIZE: # 确保在地面才能跳跃player_vel_y = -JUMP_POWERif game_state == PLAYING:# 物理模拟player_vel_y += GRAVITYplayer_y += player_vel_y# 地面碰撞检测if player_y > HEIGHT - PLAYER_SIZE:player_y = HEIGHT - PLAYER_SIZEplayer_vel_y = 0# 障碍物生成(每SPAWN_RATE帧生成一个)spawn_timer += 1if 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 += 1obstacle.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!