用python和Pygame库实现“跳过障碍”游戏

news2025/3/14 2:02:20

用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!

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

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

相关文章

SqlServer数据库报错紧急或可疑无法访问的修复过程,亲测有效。

当 SQL Server 数据库被标记为 SUSPECT 状态时&#xff0c;表示数据库可能由于事务日志损坏、数据文件丢失或其他严重问题而无法正常启动。以下是一个详细的恢复步骤&#xff0c;基于搜索结果中的信息和常见的最佳实践&#xff1a; 恢复步骤 1. 确认数据库状态 将database-n…

【python-uiautomator2】手机上的ATX应用界面报错问题处理:无法提供服务,非am instrument启动

目录 一、前期准备 1.1 插入设备 1.2 安装atx-agent 二、解决报错&#xff1a;无法提供服务&#xff0c;非am instrument启动 2.1 出现报错 2.2 尝试解决 2.3 最终解决 三、开启ATX的悬浮窗权限 一、前期准备 1.1 插入设备 本地插入待执行设备&#xff0c;待执行设备…

子母钟系统,京准电子科技助力高考精准计时

子母钟系统&#xff0c;京准电子科技助力高考精准计时 子母钟系统&#xff0c;京准电子科技助力高考精准计时 【摘要】子母钟系统又叫网络时钟系统是校园网络中一个重要的精准计时系统&#xff0c;随着网络的普及&#xff0c;许多校园都建了自己的校园专网&#xff0c;使用的…

深度解析:主流大模型与智能体框架能力对比及实战指南

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。https://www.captainbed.cn/north 文章目录 一、技术演进全景图二、主流大模型能力矩阵1. 闭源模型对比2. 开源模型对比 三、智能体框架深…

Linux中的基本指令(下)

目录 mv指令 more指令 less指令 head指令 tail 指令 继续理解文件 重定向和追加重定向操作 理解管道 find指令 whereis 指令 bc指令 uname ‒r指令 grep 指令 关机 扩展命令 zip/unzip 指令 tar指令 关于rzsz 系统间的文件互传 接上&#xff01; mv指令 m…

第十七:go 反射

fmt.printf("%T"&#xff0c;obj) // 打印 reflect 的类型 fmt.Printf("%T", obj) // *reflect.rtype //打印的是一个指针类型 reflect包 在Go语言中反射的相关功能由内置的reflect包提供&#xff0c;任意接口值在反射中都可以理解为由reflect.Type和…

【RabbitMQ】Spring Boot 结合 RabbitMQ 完成应用间的通信

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 Spring 框架与 RabbitMQ 的整合主要通过 Spring AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;模块实现&#xff0c;提供了便捷的消息队列开发能力。 引…

Pytorch系列教程:可视化Pytorch模型训练过程

深度学习和理解训练过程中的学习和进步机制对于优化性能、诊断欠拟合或过拟合等问题至关重要。将训练过程可视化的过程为学习的动态提供了有价值的见解&#xff0c;使我们能够做出合理的决策。训练进度必须可视化的两种方法是&#xff1a;使用Matplotlib和Tensor Board。在本文…

electron+vue+webview内嵌网页并注入js

vue内嵌网页可以使用iframe实现内嵌网页&#xff0c;但是只能通过postMessage间接通信&#xff0c;在electron环境下&#xff0c;vue可以直接使用webview来内嵌网页&#xff0c;支持 executeJavaScript、postMessage、send 等丰富的通信机制。 使用 webview的优势 性能更佳&…

利用OpenResty拦截SQL注入

需求 客户的一个老项目被相关部门检测不安全&#xff0c;报告为sql注入。不想改代码&#xff0c;改项目&#xff0c;所以想到利用nginx去做一些数据校验拦截。也就是前端传一些用于sql注入的非法字符或者数据库的关键字这些&#xff0c;都给拦截掉&#xff0c;从而实现拦截sql…

CAD文件转换为STL

AutoCAD与STL格式简介 AutoCAD软件是由美国欧特克有限公司&#xff08;Autodesk&#xff09;出品的一款自动计算机辅助设计软件&#xff0c;可以用于绘制二维制图和基本三维设计&#xff0c;通过它无需懂得编程&#xff0c;即可自动制图&#xff0c;因此它在全球广泛使用&…

QT:串口上位机

创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…

win32汇编环境,网络编程入门之二

;运行效果 ;win32汇编环境,网络编程入门之二 ;本教程在前一教程的基础上&#xff0c;研究一下如何得到服务器的返回的信息 ;正常的逻辑是连接上了&#xff0c;然后我发送什么&#xff0c;它返回什么&#xff0c;但是这有一个很尴尬的问题。 ;就是如何表现出来。因为网络可能有延…

【认识OpenThread协议】

OpenThread 是一种基于 IPv6 、IEEE 802.15.4 标准的低功耗无线 Mesh 网络协议&#xff0c;主要用于智能家居、物联网设备等场景。它的设计目标是实现设备之间的高效通信、低功耗运行和高可靠性。 OpenThread官方文档 ① 特性 低功耗: 适合电池供电的设备。 Mesh 网络: 支持多…

字节跳动 —— 建筑物组合(滑动窗口+溢出问题)

原题描述&#xff1a; 题目精炼&#xff1a; 给定N个建筑物的位置和一个距离D&#xff0c;选取3个建筑物作为埋伏点&#xff0c;找出所有可能的建筑物组合&#xff0c;使得每组中的建筑物之间的最大距离不超过D。最后&#xff0c;输出不同埋伏方案的数量并对99997867取模。 识…

开源数字人模型Heygem

一、Heygem是什么 Heygem 是硅基智能推出的开源数字人模型&#xff0c;专为 Windows 系统设计。基于先进的AI技术&#xff0c;仅需1秒视频或1张照片&#xff0c;能在30秒内完成数字人形象和声音克隆&#xff0c;在60秒内合成4K超高清视频。Heygem支持多语言输出、多表情动作&a…

Linux远程工具SecureCRT下载安装和使用

SecureCRT下载安装和使用 SecureCRT是一款功能强大的终端仿真软件&#xff0c;它支持SSH、Telnet等多种协议&#xff0c;可以连接和管理基于Unix和Windows的远程主机和网络设备。SecureCRT提供了语法高亮、多标签页管理、会话管理、脚本编辑等便捷功能&#xff0c;安全性高、操…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

【网络协议详解】——QOS技术(学习笔记)

目录 QoS简介 QoS产生的背景 QoS服务模型 基于DiffServ模型的QoS组成 MQC简介 MQC三要素 MQC配置流程 优先级映射配置(DiffServ域模式) 优先级映射概述 优先级映射原理描述 优先级映射 PHB行为 流量监管、流量整形和接口限速简介 流量监管 流量整形 接口限速…

Spring学习笔记:工厂模式与反射机制实现解耦

1.什么是Spring? spring是一个开源轻量级的java开发应用框架&#xff0c;可以简化企业级应用开发 轻量级 1.轻量级(对于运行环境没有额外要求) 2.代码移植性高(不需要实现额外接口) JavaEE的解决方案 Spring更像是一种解决方案&#xff0c;对于控制层&#xff0c;它有Spring…