Python 的 Pygame 库来开发一个游戏
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("飞机大战")# 加载图片
player_img = pygame.image.load("player.png").convert_alpha()
enemy_img = pygame.image.load("enemy.png").convert_alpha()
bullet_img = pygame.image.load("bullet.png").convert_alpha()
background_img = pygame.image.load("background.png").convert()# 定义颜色
white = (255, 255, 255)# 定义玩家类
class Player(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image = player_imgself.rect = self.image.get_rect()self.rect.centerx = screen_width // 2self.rect.bottom = screen_height - 10self.speed = 5def update(self):keys = pygame.key.get_pressed()if keys[pygame.K_LEFT]:self.rect.x -= self.speedif keys[pygame.K_RIGHT]:self.rect.x += self.speedif keys[pygame.K_UP]:self.rect.y -= self.speedif keys[pygame.K_DOWN]:self.rect.y += self.speed# 保持玩家在屏幕内self.rect.left = max(0, self.rect.left)self.rect.right = min(screen_width, self.rect.right)self.rect.top = max(0, self.rect.top)self.rect.bottom = min(screen_height, self.rect.bottom)def shoot(self):bullet = Bullet(self.rect.centerx, self.rect.top)bullets.add(bullet)# 定义子弹类
class Bullet(pygame.sprite.Sprite):def __init__(self, x, y):super().__init__()self.image = bullet_imgself.rect = self.image.get_rect()self.rect.centerx = xself.rect.bottom = yself.speed = 10def update(self):self.rect.y -= self.speed# 删除超出屏幕的子弹if self.rect.top < 0:self.kill()# 定义敌人类
class Enemy(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image = enemy_imgself.rect = self.image.get_rect()self.rect.x = random.randint(0, screen_width - self.rect.width)self.rect.y = random.randint(-100, -50)self.speed = random.randint(1, 3)def update(self):self.rect.y += self.speed# 删除超出屏幕的敌人if self.rect.top > screen_height:self.kill()# 创建游戏精灵组
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
bullets = pygame.sprite.Group()
enemies = pygame.sprite.Group()# 游戏循环
running = True
clock = pygame.time.Clock()
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:player.shoot()# 更新游戏逻辑all_sprites.update()enemies.update()# 检查碰撞hits = pygame.sprite.groupcollide(enemies, bullets, True, True)# 添加敌人if len(enemies) < 5:new_enemy = Enemy()enemies.add(new_enemy)all_sprites.add(new_enemy)# 渲染游戏画面screen.blit(background_img, (0, 0))all_sprites.draw(screen)bullets.draw(screen)enemies.draw(screen)# 更新屏幕pygame.display.flip()# 控制游戏帧率clock.tick(60)# 退出 Pygame
pygame.quit()
使用说明:
- 创建游戏素材:
- 创建名为
player.png、enemy.png、bullet.png和background.png的图像文件。
- 创建名为
- 将代码保存为
game.py: 将代码保存为名为game.py的文件。 - 运行游戏: 打开终端或命令提示符,导航到代码保存的目录,并运行命令
python game.py。
游戏玩法:
- 使用方向键控制飞机移动。
- 按空格键发射子弹。
- 躲避敌机。
- 消灭敌机获得分数。
注意:
- 确保已安装 Pygame 库。如果没有安装,请运行
pip install pygame进行安装。 - 将代码中的图片文件名替换为实际文件名。
- 可以根据需要调整游戏参数,例如敌机速度、数量等。
相关文章:
Python 的 Pygame 库来开发一个游戏
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("飞机大战")# 加载图片 player_img pyga…...
diffusion model 学习笔记
条件引导的 diffusion 对于无条件的DDPM 而言 p ( x t ∣ x 0 ) ∼ N ( α t ˉ x 0 , 1 − α t ˉ ⋅ I ) p(x_t | x_0) \sim \mathcal{N}( \sqrt{\bar{\alpha_t}} x_0, 1-\bar{\alpha_t} \cdot \mathrm{I} ) p(xt∣x0)∼N(αtˉ x0,1−αtˉ⋅I) 可以得到…...
【C++题解】1967. 输出字符的ascii码
欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1967. 输出字符的ascii码 类型:字符串、字符型 题目描述: 从键盘读入一个字符,请计算并输出该字符的 ascii 码。 比如:字符 ‘A’ …...
Java入门9——类和对象+this+构造方法
终于终于,我们开启了Java的大门!类和对象才是Java梦开始的地方,让我们一起来学习吧! 一、类和对象 通常来讲,一个Java文件里面写一个类,那么类是什么呢? 类,字面意思,就…...
Django目录结构最佳实践
Django项目目录结构 项目目录结构配置文件引用修改创建自定义子应用方法修改自定义注册目录从apps目录开始 项目目录结构 └── backend # 后端项目目录(项目名称)├── __init__.py├── logs # 项目日志目录├── manage.py #…...
npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
报错场景: 使用npm run dev命令启动项目,报错 PS D:\vuecode\ying-mei> npm run dev > ying-mei0.0.0 dev > vite vite 不是内部或外部命令,也不是可运行的程序 或批处理文件。 原因: 缺失依赖,因为新建的项…...
后端:Spring、Spring Boot-实例化Bean依赖注入(DI)
文章目录 1. 实例化Bean2. 使用FactoryBean3. 依赖注入(DI)3.1 AutoWired 属性注入(查找顺序:先类型,后名字)3.2 AutoWired 在构造函数&参数上的使用3.3 Inject和Resource 进行依赖注入3.4 Value 进行注入 1. 实例化Bean 默认使用无参构造函数&…...
C++ 数据结构 静态顺序表、动态顺序表。
静态顺序表(Static Array List)是一种线性数据结构,通常用数组实现。它具有固定的大小,并在编译时分配内存。以下是静态顺序表的一些基本概念和实现示例。 静态顺序表基本概念 固定大小:静态顺序表的大小在创建时定义…...
QML旋转选择器组件Tumbler
1. 介绍 Tumbler是一个用于创建旋转选择器的组件。它提供了一种直观的方式来让用户从一组选项中进行选择,类似于转盘式数字密码锁。网上找的类似网图如下: 在QML里,这种组件一共有两个版本,分别在QtQuick.Extras 1.4(旧)和QtQuic…...
在工作中常用到的 Linux 命令总结
引言 我之前找工作面试的时候。几乎每次面试几乎都会问到 Linux 常用命令,会问一些命令的应用场景。目的是考察我们是否在实际开发中经常用、用得熟练。今天我就来系统地总结一下开发过程中最常用的 Linux 命令,算是一个复习总结。 基本操作 文件管理…...
反射、枚举和lambda表达式
文章目录 一、反射1.1 什么是反射1.2 反射相关的类1.3 示例获取Class对象通过反射去创建对象调用带两个参数且私有的构造方法获取私有属性反射私有方法 二、枚举2.1 什么是枚举以及其优缺点2.2 如何使用枚举组织常量的基本方法枚举类的其他方法示例枚举能否通过反射拿到实例对象…...
Stable Diffusion Web UI 1.9.4常用插件扩展-WD14-tagger
Stable Diffusion Web UI 1.9.4 运行在 WSL 中的 Docker 容器中 tagger 插件的作用是,上传一张图片,反推这张图片可能的提示词。 使用场景就是,想要得到类似的图片内容时使用。 WD14-tagger 安装 Stable Diffusion WebUI WD14-tagger GitH…...
java 第19天 Lambda、jdk8.0新方法、Optional
一.Lambda表达式 前提是:参数是函数式接口才可以书写Lambda表达式 函数式接口条件: 1.接口 2.只有一个抽象方法 lambda表达式又称为匿名函数,允许匿名函数以参数的形式传入方法,简化代码 lambda表达式分为两部分()->{} …...
江协科技STM32学习- P31 I2C通信协议
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
6、liunx目录的功能
一、目录简介 Linux主要树结构目录包括:/、/root、/home、/usr、/bin、/tmp、/sbin、/proc、/boot 【Linux系统中常见目录功能如下】 / 根目录;/bin 存放必要的命令;(普通用户) /boot 存放内核以及启动所需的文件&…...
挑战Java面试题复习第5天,无人扶我青云志
挑战第 5 天 java反射List Set Map 区别Object 常用方法 java反射 定义: 运行时动态获取类信息和调用方法的特性。 应用场景: JDBC数据库连接。框架如Hibernate和Struts等。 实现方式: 通过四种方法获取Class对象: Class.fo…...
大规模语言模型:从理论到实践(1)
1、绪论 大规模语言模型(Large Language Models,LLM)是由包含数百亿以上参数的深度神经网络构建的语言模型,采用自监督学习方法通过大量无标注文本进行训练。自2018年以来,多个公司和研究机构相继发布了多种模型&#…...
C#如何锁定和解除鼠标及键盘BlockInput
在C#中,"BlockInput"通常指的是一个功能或方法,用于阻止或暂停用户输入一段时间。这在某些特定的应用场景下非常有用,比如在游戏中防止玩家连续快速点击导致游戏逻辑错误,或者在UI应用中防止用户在某个操作正在进行时进…...
Stable Diffusion 3.5发布:图像生成新纪元,多模态AI的突破!
在人工智能的图像生成领域,我们刚刚迎来了一位新的明星——Stable Diffusion 3.5。这是一款由多模态扩散Transformer(MMDiT)驱动的文本到图像模型,它在图像质量、字体处理、复杂提示理解以及资源效率方面都实现了显著提升。今天&a…...
MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题
1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10: 这个语句的意思是,从查询结果中跳过前100000条记录,然后返回接下来的10条记录。这通常用于分页查询中,当你需要跳过大量的记录以获取后续的记录时。例如,如果你…...
告别HAL库:用GD32标准库为RT-Thread打造轻量级驱动(以F4系列为例)
告别HAL库:用GD32标准库为RT-Thread打造轻量级驱动(以F4系列为例) 在嵌入式开发领域,HAL库因其跨平台兼容性和易用性广受欢迎,但对于追求极致性能和精简代码的开发者而言,标准库往往能带来更直接的硬件控制…...
告别黑盒预测:用TFT模型的可解释性,看清电力负荷预测的‘为什么’
电力负荷预测的透明革命:如何用TFT模型打开时间序列黑箱 当电网调度员面对突如其来的负荷波动时,传统深度学习模型往往只能给出一个冷冰冰的预测数字,却无法解释"为什么会有这样的变化"。这种黑箱特性让关键决策充满不确定性——温…...
第 12 篇:W55RP20-EVB-Pico MicroPython 实战:MQTT 协议基础通信验证
本文为 WIZnet W55RP20 芯片 MicroPython教程第 12 篇,基于官方最新固件编写,代码均经过实际验证,可直接烧录运行。 版权声明:本文为 WIZnet 官方原创技术文章,转载请注明出处。 前言 上一篇实战教程,我们…...
项目介绍 基于java+vue的校园舆情监测与预警系统设计与实现(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢
基于javavue的校园舆情监测与预警系统设计与实现的详细项目实例 请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解) 校园舆情监测与预警系统…...
浏览器指纹JS逆向全解析:Canvas、WebGL与Audio指纹绕过
在当前的反爬虫与风控体系中,浏览器指纹技术已成为识别自动化工具的核心手段。传统的UserAgent、IP地址等信息早已不足为凭,而基于Canvas、WebGL、AudioContext等API生成的“渲染层指纹”,因其高度依赖硬件和系统环境,具备极强的唯…...
CMOS概率计算芯片设计与工程实践
1. CMOS概率计算芯片的核心设计理念概率计算作为一种新兴的计算范式,正在突破传统冯诺依曼架构的局限。我们团队开发的这款440节点CMOS芯片,其核心创新点在于将物理启发的随机性与标准CMOS工艺完美结合。不同于传统计算机的确定性计算方式,每…...
泉州某卫浴GEO优化实战:四标融合+场景化方法论,从搜索不可见到AI优先引用
我们在服务制造业企业的过程中发现一个根本性变化:过去大家关心“怎么让用户搜到我”,现在AI直接生成答案,企业真正的挑战变成了“怎么让AI准确信任我、优先引用我”。传统SEO在AI的“黑箱”面前越来越失效,企业必须重新建立一套可…...
无人机巡检避坑指南:用YOLOv5n做罂粟识别,这些光照和遮挡问题怎么解决?
无人机巡检实战:YOLOv5n在复杂环境下的罂粟识别优化策略 清晨的露珠还挂在叶片上,无人机已经盘旋在田野上空。对于从事智能巡检的工程师来说,这样的场景再熟悉不过——但随之而来的挑战也令人头疼:强烈的晨光让部分区域过曝&#…...
ContextMenuManager:5分钟掌握Windows右键菜单管理的终极免费方案
ContextMenuManager:5分钟掌握Windows右键菜单管理的终极免费方案 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否厌倦了每次右键点击文件时&a…...
CircuitPython嵌入式开发实战:内存管理、BLE通信与异步编程优化
1. 项目概述:CircuitPython开发中的核心挑战与应对思路 在嵌入式硬件开发领域,CircuitPython以其对Python语法的友好支持,极大地降低了硬件编程的门槛。然而,从桌面环境转向资源极度受限的微控制器(MCU)世界…...
