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

学习 Python 之 Pygame 开发坦克大战(一)

学习 Python 之 Pygame 开发坦克大战(一)

  • Pygame
    • 什么是Pygame?
    • 初识pygame
      • 1. 使用pygame创建窗口
      • 2. 设置窗口背景颜色
      • 3. 获取窗口中的事件
      • 4. 在窗口中展示图片
        • (1). pygame中的直角坐标系
        • (2). 展示图片
        • (3). 给部分区域设置颜色
      • 5. 在窗口中显示文字
      • 6. 播放音乐

Pygame

什么是Pygame?

Pygame是一组Python用于编写视频游戏的模块。Pygame在优秀的SDL库上添加了功能。可以让我们使用python语言创建功能齐全的游戏和多媒体程序,并且Pygame是高度可移植的,几乎可以在所有平台和操作系统上运行。

初识pygame

官方文档

函数名称作用返回值
pygame.display.init()初始化展示模块None
pygame.display.set_mode(size = (0, 0))初始化窗口(窗口就是一个Surface对象)Surface
pygame.display.set_caption(title, icontitle = None)设置窗口标题和图标None
pygame.Surface.fill(color, rect = None)用纯色填充表面Surface对象None
pygame.Color(b, g, r)创建用于颜色表示的Pygame对象Color
pygame.display.update()更新屏幕None
pygame.event.get()获取事件队列Eventlist
pygame.image.load(filename)从文件加载图片(图片跟窗口一样,也是Surface对象)Surface
pygame.Surface.get_rect()获取Surface对象的rect属性Rect
pygame.Surface.blit(source, dest, area = None)在一个Surface对象上显示另一个Surface对象Rect
pygame.font.init()初始化字体模块None
pygame.font.SysFont(name, size, bold = False, italic = False)从系统字体创建字体对象Font
pygame.font.render(text, antialias, color, background = None)创建一个带有指定字体的Surface对象Surface
pygame.mixer.init()初始化混合器模块None
pygame.mixer.Sound(filename)从文件创建声音对象Sound
pygame.mixer.Sound.play(loops = 0, maxtime = 0)播放音乐,loops参数控制播放次数,播放次数为loops + 1次。默认为0,表示声音不会重复,只播放一次。如果loops为-1,声音将无限循环Channel
pygame.mixer.Sound.stop()声音停止播放None
pygame.mixer.Sound.set_volume(value)设置音量None

1. 使用pygame创建窗口

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Tank Battle')

创建结果
在这里插入图片描述

2. 设置窗口背景颜色

# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)# 更新窗口
pygame.display.update()

完整代码

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Tank Battle')# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)# 更新窗口
pygame.display.update()

在这里插入图片描述
不要忘记更新窗口,否则不会显示颜色的

3. 获取窗口中的事件

def getWindowEvent():for event in pygame.event.get():# 点击窗口右上角的关闭触发的事件if event.type == pygame.QUIT:sys.exit()# 鼠标按下事件elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posprint('鼠标按下, 鼠标位置({x}, {y})'.format(x = x, y = y))# 鼠标抬起事件elif event.type == pygame.MOUSEBUTTONUP:print('鼠标抬起')# 键盘按键按下事件elif event.type == pygame.KEYDOWN:print('键盘按键按下')# 具体键盘事件触发if event.key == pygame.K_j:print('按下键盘 j 键')# 键盘按键抬起事件elif event.type == pygame.KEYUP:print('键盘按键抬起')

完整代码

import pygame
import sysdef getWindowEvent():for event in pygame.event.get():# 点击窗口右上角的关闭触发的事件if event.type == pygame.QUIT:sys.exit()# 鼠标按下事件elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posprint('鼠标按下, 鼠标位置({x}, {y})'.format(x = x, y = y))# 鼠标抬起事件elif event.type == pygame.MOUSEBUTTONUP:print('鼠标抬起')# 键盘按键按下事件elif event.type == pygame.KEYDOWN:print('键盘按键按下')# 具体键盘事件触发if event.key == pygame.K_j:print('按下键盘 j 键')# 键盘按键抬起事件elif event.type == pygame.KEYUP:print('键盘按键抬起')# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Tank Battle')# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)while 1:# 获取键盘事件getWindowEvent()# 更新窗口pygame.display.update()

运行后按下鼠标左键,键盘j键,键盘s键

在这里插入图片描述

系统的事件都具有一组成员属性。下面是事件类型及其特定属性的列表图(图片来源链接)
在这里插入图片描述

4. 在窗口中展示图片

(1). pygame中的直角坐标系

在这里插入图片描述

(2). 展示图片

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Tank Battle')# 设置图片路径
path = './picture.jpg'
# 加载图片
image = pygame.image.load(path)
# 获取直角坐标
rect = image.get_rect()
# 设置图片的位置,在(0,0)处加载图片
rect.left = 0
rect.top = 0
# 在窗口显示
window.blit(image, rect)# 更新窗口
pygame.display.update()

运行结果(图片太大了,超过了窗口的尺寸)
在这里插入图片描述

(3). 给部分区域设置颜色

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Tank Battle')# 设置窗口背景颜色
blue = 255
green = 0
red = 255
BACKGROUND_COLOR = pygame.Color(blue, green, red)
window.fill(BACKGROUND_COLOR)# 给部分区域设置颜色
rect = pygame.Rect(400, 400, 50, 50)
REGION_COLOR = pygame.Color(50, 50, 150)
window.fill(REGION_COLOR, rect)# 更新窗口
pygame.display.update()

在这里插入图片描述

5. 在窗口中显示文字

import pygame# 初始化展示模块
pygame.display.init()
# 设置窗口大小
SCREEN_WIDTH = 1100
SCREEN_HEIGHT = 600
size = (SCREEN_WIDTH, SCREEN_HEIGHT)
# 初始化窗口
window = pygame.display.set_mode(size)
# 设置窗口标题
pygame.display.set_caption('Tank Battle')# 设置文字内容
text = 'Hello Pygame'# 初始化字体
pygame.font.init()
# 设置文字字体和大小
fontSize = 16
font = pygame.font.SysFont('georgia', fontSize)
# 加载文字并设置颜色
fontColor = pygame.Color(255, 255, 255)
fontObject = font.render(text, True, fontColor)
# 设置展示位置
position = (50, 50)
# 展示文字
window.blit(fontObject, position)# 更新窗口
pygame.display.update()

运行结果
在这里插入图片描述

6. 播放音乐

import pygame# 初始化混合器模块
pygame.mixer.init()
# 加载音乐
sound = pygame.mixer.Sound('./star.wav')
# 播放音乐
sound.play()

相关文章:

学习 Python 之 Pygame 开发坦克大战(一)

学习 Python 之 Pygame 开发坦克大战(一)Pygame什么是Pygame?初识pygame1. 使用pygame创建窗口2. 设置窗口背景颜色3. 获取窗口中的事件4. 在窗口中展示图片(1). pygame中的直角坐标系(2). 展示图片(3). 给部分区域设置颜色5. 在窗口中显示文字6. 播放音…...

2.5|iot冯|方元-嵌入式linux系统开发入门|2.13+2.18

一、 Linux 指令操作题(共5题(共 20 分,每小题 4分)与系统工作、系统状态、工作目录、文件、目录、打包压缩与搜索等主题相关。1.文件1.1文件属性1.2文件类型属性字段的第1个字符表示文件类型,后9个字符中,…...

一起Talk Android吧(第四百九十六回:自定义View实例二:环形进度条)

文章目录 知识回顾实现思路实现方法示例代码各位看官们大家好,上一回中咱们说的例子是"如何使用Java版MQTT客户端",这一回中咱们说的例子是"自定义View实例二:环形进度条"。闲话休提,言归正转,让我们一起Talk Android吧! 知识回顾 看官们,我们又回…...

上传图片尺寸校验

使用方法 ● Image ● URL ● onload代码: async validImageSize(file, imgWidth, imgHeight) {const img new Image()img.src URL.createObjectURL(file)const { w, h } await new Promise((resolve, reject) > {img.onload () > {const { width: w, he…...

【Python】缺失值处理和拉格朗日插值法(含源代码实现)

目录:缺失值处理和拉格朗日插值法一、前言二、理论知识三、代码实现一、前言 对于含有缺失值的数据集,如果通过删除小部分记录达到既定的目标,那么删除含有缺失值的记录的方法是最有效的。然而,这种方法也有很多问题,…...

SpringCloudAlibaba-Sentinel

一、介绍官网&#xff1a;https://github.com/alibaba/Sentinel/下载jar包,启动,访问http://localhost:8080/创建module添加如下依赖<!--SpringCloud ailibaba sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring…...

【程序化天空盒】过程记录02:云扰动 边缘光 消散效果

写在前面 写在前面唉&#xff0c;最近筋疲力竭&#xff0c;课题组的东西一堆没做&#xff0c;才刚刚开始带着思考准备练习作品&#xff0c;从去年5月份开始到现在真得学了快一年了&#xff0c;转行学其他的真的好累&#xff0c;&#xff0c;不过还是加油&#xff01; 下面是做…...

链表OJ(三) 反转链表合集

目录 反转链表 反转链表 II 链表中的节点每k个一组翻转 描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤n≤10000≤…...

SQLSERVER2019安装步骤过程

第一步官网下载SQLSERVER软件包 目前官网只能下载最新版本2022版本。 通过迅雷下载网址 SQL Server 2019 Enterprise (x64) - DVD (Chinese-Simplified)企业版 ed2k://|file|cn_sql_server_2019_enterprise_x64_dvd_2bfe815a.iso|1632086016|58C258FF0F1D006DD3C1F5F17AF3E…...

Java模块化概述

3 模块化 3.1 模块化概述 Java语言随着这些年的发展已经成为了一]影响深远的编程语言&#xff0c;无数平台,系统都采用Java语言编写。但是&#xff0c;伴随着发展&#xff0c;Java也越来越庞大&#xff0c;逐渐发展成为-门“臃肿” 的语言。而且&#xff0c;无论是运行个大型的…...

Connext DDSPersistence Service持久性服务(2)

可选数据库组件及兼容性当Persistence Service配置为PERSISTENT模式时,您可以选择将主题数据存储在文件中还是存储在外部关系数据库中。 唯一支持的外部数据库是MySQL。 当PersistenceService在PERSISTENT模式下使用时,您可以将其配置为将DDS样本存储到关系数据库中,例如MyS…...

MongoDB

MongoDB 应用场景 ​ 在传统数据库&#xff08;Mysql&#xff09;&#xff0c;在数据操作的 **High performance 对数据库高并发读写的需求、Hugu Storage 对海量数据的高效率存储和访问的需求、High Scalability && High Availability 对数据库高扩展和高可用性的需…...

python 迭代器生成器

目录 一、可迭代对象 1.1 判断是否为可迭代对象 二、迭代器 2.1 判断对象是否是一个迭代器 2.2 手写一个迭代器 2.3 迭代器应用场景 三、生成器 3.1 生成器介绍 3.2 使用yield 关键字 生成器&#xff0c;来实现迭代器 3.3 生成器&#xff08;yield关键字&#xff09;…...

Iceberg基于Spark MergeInto语法实现数据的增量写入

SPARK SQL 基本语法 示例SQL如下 MERGE INTO target_table t USING source_table s ON s.id t.id //这里是JOIN的关联条件 WHEN MATCHED AND s.opType delete THEN DELETE // WHEN条件是对当前行进行打标的匹配条件 WHEN MATCHED AND s.opType update THEN…...

JavaScript Array(数组) 对象

JavaScript 中的 Array&#xff08;数组&#xff09;对象是一种用来存储一系列值的容器&#xff0c;它可以包含任意类型的数据&#xff0c;包括数字、字符串、对象等等。通过使用数组对象&#xff0c;我们可以轻松地组织和处理数据&#xff0c;以及进行各种操作&#xff0c;比如…...

Debian如何更换apt源

中科大 deb https://mirrors.ustc.edu.cn/debian/ stretch main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-updates main non-free contrib deb https://mirrors.ustc.edu.cn/debian/ stretch-backports main non-free contrib deb-src https://mirr…...

Connext DDSPersistence Service持久性服务

DDS持久性服务,它保存了DDS数据样本,以便即使发布应用程序已经终止,也可以稍后将其发送到加入系统的订阅应用程序。 简介Persistence Service是一个Connext DDS应用程序,它将DDS数据样本保存到临时或永久存储中,因此即使发布应用程序已经终止,也可以稍后将其交付给加入系…...

自抗扰控制ADRC之微分器TD

目录 前言 1 全程快速微分器 1.1仿真分析 1.2仿真模型 1.3仿真结果 1.4结论 2 Levant微分器 2.1仿真分析 2.2仿真模型 2.3仿真结果 3.总结 前言 工程上信号的微分是难以得到的&#xff0c;所以本文采用微分器实现带有噪声的信号及其微分信号提取&#xff0c;从而实现…...

链表学习之复制含随机指针的链表

链表解题技巧 额外的数据结构&#xff08;哈希表&#xff09;&#xff1b;快慢指针&#xff1b;虚拟头节点&#xff1b; 复制含随机指针的链表 该链表节点的结构如下&#xff1a; class ListRandomNode { public:ListRandomNode() : val(0), next(nullptr), random(nullptr…...

【人脸检测】Yolov5Face:优秀的one-stage人脸检测算法

论文题目&#xff1a;《YOLO5Face: Why Reinventing a Face Detector》 论文地址&#xff1a;https://arxiv.org/pdf/2105.12931.pdf 代码地址&#xff1a;https://github.com/deepcam-cn/yolov5-face 1.简介 近年来&#xff0c;CNN在人脸检测方面已经得到广泛的应用。但是许多…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...