当前位置: 首页 > news >正文

Python小游戏24——小恐龙躲避游戏

 

首先,你需要安装Pygame库。如果你还没有安装,可以通过以下命令安装:

 

【bash】

 pip install pygame

 

 

 

  • 【python】代码

 import pygame

import random

 

# 初始化Pygame

pygame.init()

 

# 设置屏幕尺寸

screen_width = 800

screen_height = 600

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

pygame.display.set_caption("恐龙躲避游戏")

 

# 颜色定义

WHITE = (255, 255, 255)

BLACK = (0, 0, 0)

GREEN = (0, 255, 0)

RED = (255, 0, 0)

 

# 恐龙类

class Dino:

    def __init__(self):

        self.image = pygame.image.load("dino.png").convert_alpha() # 加载恐龙图片,请确保图片在同一目录下

        self.rect = self.image.get_rect()

        self.rect.x = 50

        self.rect.y = screen_height - self.rect.height - 50

        self.speed = 5

 

    def move(self):

        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT] and self.rect.x > 0:

            self.rect.x -= self.speed

        if keys[pygame.K_RIGHT] and self.rect.x < screen_width - self.rect.width:

            self.rect.x += self.speed

 

    def draw(self, screen):

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

 

# 障碍物类

class Obstacle:

    def __init__(self):

        self.image = pygame.image.load("obstacle.png").convert_alpha() # 加载障碍物图片,请确保图片在同一目录下

        self.rect = self.image.get_rect()

        self.rect.x = random.randint(0, screen_width - self.rect.width)

        self.rect.y = -self.rect.height

        self.speed = 3

 

    def move(self):

        self.rect.y += self.speed

 

    def draw(self, screen):

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

 

# 游戏主循环

def main():

    clock = pygame.time.Clock()

    dino = Dino()

    obstacles = [Obstacle() for _ in range(5)] # 初始化5个障碍物

 

    running = True

    while running:

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = False

 

        # 更新恐龙和障碍物位置

        dino.move()

        for obstacle in obstacles:

            obstacle.move()

            # 检查碰撞

            if dino.rect.colliderect(obstacle.rect):

                print("游戏结束!")

                running = False

 

        # 如果障碍物移出屏幕,则重新生成

        for i, obstacle in enumerate(obstacles):

            if obstacle.rect.y > screen_height:

                obstacles[i] = Obstacle()

 

        # 绘制背景(这里使用白色作为背景)

        screen.fill(WHITE)

 

        # 绘制恐龙和障碍物

        dino.draw(screen)

        for obstacle in obstacles:

            obstacle.draw(screen)

 

        # 更新屏幕

        pygame.display.flip()

 

        # 控制帧率

        clock.tick(30)

 

    pygame.quit()

 

if __name__ == "__main__":

    main()

 

  • 注意事项:

 

1. 你需要准备两张图片:dino.png(恐龙图片)和obstacle.png(障碍物图片),并将它们放在与代码相同的目录中。

 

2. 代码中使用了简单的碰撞检测逻辑。如果恐龙与障碍物碰撞,游戏将结束。

 

3. 你可以根据需要调整恐龙的速度、障碍物的速度、数量等参数。

  • 涉及代码知识点总结

一、游戏初始化与配置

 

1. Pygame模块初始化:

 

    • 使用pygame.init()初始化所有Pygame模块,这是在使用任何其他Pygame功能之前必须做的。

 

2. 游戏窗口创建:

 

    • 使用pygame.display.set_mode(cfg.SCREENSIZE)根据配置文件cfg中指定的尺寸创建一个窗口,所有游戏图形都将在这个窗口中绘制。

 

3. 游戏窗口标题设置:

 

    • 使用pygame.display.set_caption()设置游戏窗口的标题,该标题显示在窗口顶部。

 

4. 音效加载:

 

    • 遍历cfg.AUDIO_PATHS字典,该字典包含游戏中使用的音效文件的名称和文件路径。

 

    • 使用pygame.mixer.Sound加载音效文件到sounds字典中,以便在游戏过程中轻松访问和播放音效。

 

二、游戏元素定义与实现

 

1. 游戏元素类定义:

 

    • 定义小恐龙、路面、云、飞龙、仙人掌等游戏元素类,每个类都继承自pygame.sprite.Sprite。

 

    • 在每个类中定义__init__方法用于初始化游戏元素,包括加载图片、设置初始位置等。

 

    • 定义update方法用于更新游戏元素的状态,如位置变化等。

 

    • 定义draw方法用于将游戏元素绘制到屏幕上。

 

2. 障碍物移动与生成:

 

    • 使用计时器控制障碍物的生成频率和移动速度。

 

    • 在游戏循环中不断更新障碍物的位置,当障碍物到达屏幕左端时,将其位置重置到右端以循环出现。

 

3. 小恐龙跳跃与碰撞检测:

 

    • 监听键盘事件,当按下空格键时触发小恐龙跳跃动作。

 

    • 通过数学计算判断小恐龙的跳跃轨迹,包括起跳、上升、下降和落地等阶段。

 

    • 使用pygame.sprite.spritecollide或rect.collidepoint()等方法进行碰撞检测,判断小恐龙是否与障碍物发生碰撞。

 

三、游戏逻辑与循环

 

1. 游戏主循环:

 

    • 游戏主循环是游戏运行的核心,它不断监听并响应键盘和鼠标事件,更新游戏元素的状态,并绘制游戏画面。

 

    • 在每一轮游戏循环中,首先更新所有游戏元素的状态(如障碍物移动、小恐龙跳跃等),然后进行碰撞检测,并根据检测结果更新游戏得分或结束游戏。

 

2. 得分机制:

 

    • 定义一个得分变量用于记录游戏过程中的得分。

 

    • 当小恐龙成功躲避障碍物时,增加得分。

 

    • 在游戏结束界面显示最终得分。

 

3. 游戏结束与重新开始:

 

    • 当小恐龙与障碍物发生碰撞时,游戏结束。

 

    • 在游戏结束界面显示“Game Over”等提示信息,并提供重新开始或退出游戏的选项。

 

四、游戏优化与美化

 

1. 帧率控制:

 

    • 使用pygame.time.Clock()创建一个时钟对象,用于限制游戏的帧率,确保游戏的运行速度保持在一定的范围内。

 

2. 游戏画面美化:

 

    • 使用pygame.font模块加载字体并绘制文本信息,如游戏标题、得分等。

 

    • 使用pygame.draw模块绘制简单的图形元素,如背景、边框等。

 

    • 加载并使用游戏元素图片,使游戏画面更加生动和美观。

 

3. 音效与背景音乐:

 

    • 在游戏过程中播放背景音乐和音效,增强游戏的沉浸感和趣味性。

相关文章:

Python小游戏24——小恐龙躲避游戏

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以通过以下命令安装&#xff1a; 【bash】 pip install pygame 【python】代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen …...

Python 的多态笔记

Python的多态实际是通过instance 实现的 class Person:def __init__(self, name,age):self.name nameself.age agedef feed_pet(self,pet):#isinastance(obj,类)-->判断obj,是不是这个类的对象&#xff0c;或者判断obj是不是该类的子类的对象if isinstance(pet, Pet):sel…...

go module使用

go module介绍 go module是go官⽅⾃带的go依赖管理库,在1.13版本正式推荐使⽤ go module可以将某个项⽬(⽂件夹)下的所有依赖整理成⼀个 go.mod ⽂件,⾥⾯写⼊了依赖的版本等 使⽤ go module之后我们可不⽤将代码放置在src下了 使⽤ go module 管理依赖后会在项⽬根⽬录下⽣成…...

c ++零基础可视化——数组

c 零基础可视化 数组 一些知识&#xff1a; 关于给数组赋值&#xff0c;一个函数为memset&#xff0c;其在cplusplus.com中的描述如下&#xff1a; void * memset ( void * ptr, int value, size_t num );Sets the first num bytes of the block of memory pointed by ptr to…...

CVE-2024-2961漏洞的简单学习

简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞&#xff0c;实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响&#xff1…...

计算机组成原理笔记----基础篇

计算机系统硬件软件 软件 ├── 系统软件 │ ├── 操作系统 │ └── 工具软件 └── 应用软件├── 办公软件├── 媒体软件└── 浏览器软件硬件 ├── 计算机硬件 │ ├── 中央处理器&#xff08;CPU&#xff09; │ ├── 存储设备 │ │ ├── …...

TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?

首先ThreadLocal是什么就不介绍了&#xff01;这篇是讲讲里面的东西。 再简单说一下强引用和弱引用&#xff0c;举个例子&#xff0c;我们平常new出来的对象就是强引用的&#xff0c;在栈中有强引用&#xff0c;所以在gc的时候&#xff0c;堆中的实例对象不会被清除掉。 弱引…...

AI在电商平台中的创新应用:提升销售效率与用户体验的数字化转型

1. 引言 AI技术在电商平台的应用已不仅仅停留在基础的数据分析和自动化推荐上。随着人工智能的迅速发展&#xff0c;越来越多的电商平台开始将AI技术深度融合到用户体验、定价策略、供应链优化、客户服务等核心业务中&#xff0c;从而显著提升运营效率和用户满意度。在这篇文章…...

CTF-RE 从0到N:RC4

RC4加密算法简介 RC4是由Ron Rivest于1987年设计的一种流加密算法。它通过伪随机数生成器生成密钥流&#xff0c;并将该密钥流与明文进行异或运算来完成加密和解密。 RC4的加密流程 RC4主要包含两个阶段&#xff1a; 密钥调度算法 (Key Scheduling Algorithm, KSA)&#xff…...

HbuilderX 插件开发-模板创建

实现思路 使用HbuilderX 打开某个文档时右键点击的时候获取当前打开的文档内容使用 API 替换为自己的模板 示例 package.json {"id": "SL-HbuilderX-Tool","name": "SL-HbuilderX-Tool","description": "快速创建h…...

打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…...

YOLO-SLD: An Attention Mechanism-ImprovedYOLO for License Plate Detection

摘要 车辆牌照检测在智能交通系统中发挥着关键作用。检测汽车、卡车和面包车等的牌照对于执法、监控和收费站操作非常有用。如何快速准确地检测牌照对牌照识别至关重要。然而&#xff0c;在现实世界复杂捕捉场景中&#xff0c;光照条件不均匀或牌照拍摄角度的倾斜会发生剧烈变…...

ArcGIS的汉字(亚洲文本)垂直标注

01 需求说明 实现ArcGIS的汉字&#xff08;亚洲文本的垂直标注&#xff09;。 启用 Maplex 标注引擎。 在标注 工具条上单击标注管理器按钮 。 选中要进行标注的图层旁边的复选框。 选择图层下方的标注分类。 单击符号。 选中 CJK 字符方向复选框。 仅当字体有垂直的文本度…...

【面试题】

1.UART 和 IIC 的区别 UART (Universal Asynchronous Receiver-Transmitter) 用途&#xff1a;用于异步串行通信。信号线&#xff1a;通常需要两根线&#xff08;TX 和 RX&#xff09;&#xff0c;有时还需一根地线。通信方式&#xff1a;点对点。数据传输&#xff1a;单向或…...

Leetcode 寻找峰值

为了实现时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)&#xff0c;可以使用二分查找法&#xff1a; 解题思路&#xff1a; 峰值的特性是&#xff1a;当前元素大于左右相邻元素。使用二分法&#xff1a; 如果 nums[mid] > nums[mid 1]&#xff0c;说明峰值在左侧或当前…...

探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力

概述 心理健康是公共卫生最重要的领域之一。根据美国国家精神卫生研究所&#xff08;NIMH&#xff09;的数据&#xff0c;到 2021 年&#xff0c;22.8% 的美国成年人将患上某种形式的精神疾病。在全球范围内&#xff0c;精神疾病占非致命性疾病负担的 30%&#xff0c;并被世界…...

Infisical开源密钥管理平台实战指南

1. 引言 在现代软件开发中,安全地管理环境变量和敏感信息已成为一个关键挑战。Infisical作为一个开源的密钥管理平台,为这一问题提供了强大而灵活的解决方案。本指南将深入探讨Infisical的功能,并通过实际操作步骤,帮助读者全面了解和使用这个工具。 2. Infisical概述 I…...

AI大模型:重塑软件开发流程与模式

人工智能技术的飞速发展&#xff0c;尤其是AI大模型的兴起&#xff0c;正以前所未有的速度和深度影响着各行各业&#xff0c;其中软件开发领域尤为显著。AI大模型&#xff0c;如GPT系列、BERT、Claude等通过其强大的自然语言处理能力、代码理解和生成能力&#xff0c;正在从根本…...

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…...

基于Java Springboot图书借阅系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...