Python-项目实战--贪吃蛇小游戏-游戏框架搭建(2)
1.游戏框架搭建
介绍pygame开发图像界面游戏的几个要素,并且把贪吃蛇游戏的整体框架搭建完成
本节知识点包括:
pygame的初始化和退出
游戏主窗口
游戏循环和游戏时钟
主窗口背景颜色
绘制文本
pygame的坐标系
游戏事件监听
绘制图形
定时器事件
1.1pygame的初始化和退出
pygame是专为开发电子游戏而设计的跨平台的Python包。而包中又针对不同的开发需求提供有不同的模块,例如:显示模块、字体模块、混音器模块等等。
注意:在这些模块中,有一部分模块是必须要初始化之后,才能够正常使用的,例如:字体模块等。
pygame为了程序员更加方便地使用包中的模块,提供有两个方法:init 和quit,其中:
init方法可以一次性初始化pygame的所有模块,这样在后续开发中,程序员可以直接使用这些模不必再单独为某一个模块调用对应的初始化方法
quit方法可以取消初始化之前已经初始化过的模块
提示:由于Python解释器在退出之前会释放所有的模块,所以quit方法不是必须要调用的
代码演练
要实现pygame的初始化和退出,需要在game.py模块中实现以下代码:
import pygame    # 导入pygame
from game_items import *  # 导入游戏元素模块中所有类和全局变量if __name__ == '__main__':# 游戏开始时要初始化pygame的模块    pygame.init()# 游戏逻辑# 游戏结束是要释放pygame模块占用的资源pygame.quit()提示:虽然quit方法的调用不是必须的,但是很多程序员在开发程序时,还是习惯按照谁申请、谁释放的原则来编写代码。因此,大家可以在很多pygame的开源代码中看到init和quit成对调用的情况
1.2游戏主窗口
贪吃蛇游戏是一款图形界面游戏, 而所谓的图形界面就是指窗口,所有游戏元素(例如:蛇、食物、得分等)都显示在这个窗口的内部。
pygame的display模块提供的一系列方法可以用于创建游戏窗口以及更新窗口显示内容等操作。
序号  | 方法  | 说明  | 
1  | pygame.display.set_mode()  | 初始化游戏窗口  | 
2  | pygame.display.set_caption()  | 设置窗口标题  | 
3  | pygame.display.update()  | 更新屏幕显示内容  | 
1.2.1创建游戏主窗口
使用set_ mode 方法,可以非常方便地创建一个游戏主窗口
语法格式
set_mode(resolution=(0,0), flags=0, depth=0) -> Surface其中:
参数
resolution 指定屏幕的宽和高的元组,默认创建的窗口大小和屏幕大小一致
flags 参数指定屏幕的附加选项,例如是否全屏等等,默认使用resolution 指定的窗口大小。
depth参数表示颜色的位数,默认自动匹配
●返回
Surface 对象
可以把一个Surface对象被看作是一个油画的画布,我们可以在这个画布上作画,例如:绘制贪吃蛇、绘制食物、绘制分数文字等
所有游戏元素绘制在游戏的主窗口之后,就是用户看到的游戏画面
注意:必须记录set_ mode方法的返回结果!因为后续其他的游戏元素都需要绘制在游戏主窗口上。
1.2.2设置窗口标题
使用set_ caption 方法,可以设置窗口标题
语法格式
set_caption(title, icontitle=None) -> None其中:
参数
title 指定显示在标题栏上的窗口标题
icontitle 在某些操作系统中,可以指定显示在任务栏上的程序标题,默认与title一致
要创建游戏主窗口并设置窗口标题,在game.py中定义Game类,并且实现初始化方法
代码演练
此时的游戏主窗口是一闪而过
class Game(object):"""游戏类"""def __init__(self):self.main_window = pygame.display.set_mode((640, 480))pygame.display.set_caption("贪吃蛇")if __name__ == '__main__':# 游戏开始时要初始化pygame的模块pygame.init()# 游戏逻辑Game()# 游戏结束是要释放pygame模块占用的资源pygame.quit()1.2.3阶段性小节
pygame.display.set_mode((宽, 高)) 方法可以创建游戏主窗口
pygame.display.set_caption((标题字符串)) 可以设置窗口标题
1.3游戏循环和游戏时钟
1.3.1游戏循环
要做到游戏程序启动执行之后,不会立即退出,需要在游戏程序中增加一个游戏循环。所谓游戏循环就是一个无限循环。
可以在game.py的Game类中增加start方法
代码如下:
def start(self):"""启动并控制游戏"""while True:pass在game.py的末尾修改代码:
# 游戏逻辑
Game().start() # 创建游戏对象并且启动游戏1.3.2游戏中的动画实现原理
在一款图形界面的游戏中,通常游戏的画面是不断变化的,也就是我们常说的动画。例如:贪吃蛇的运动、食物的出现与消失以及分数值的变化等等。
那么游戏中的动画效果是怎样实现的呢?跟电影的原理类似,游戏中的动画效果,本质上是快速地在屏幕上绘制图像
电影是将多张静止的电影胶片连续、快速地播放,产生连贯的视觉效果!
一般在电脑上每秒绘制60次,就能够达到非常连续、高品质的动画效果。每次绘制的结果被称为帧Frame
因此,刚刚完成的代码中,无限循环的执行频率(刷新帧率)只要能达到每秒60帧,就能够达到我们预期的动画效果了。但是,实际运行中,这个无限循环的执行频率有多快呢?
调整一下game.py的Game类中的start方法代码,运行观察一下循环体的执行频率
代码如下:
def start(self):"""启动并控制游戏"""i = 0while True:print(i)i += 1
运行程序发现循环体的执行频率非常高!远远超过了我们预期的60帧秒,而且CPU的负荷也比较大。
1.3.3游戏时钟
游戏循环就是一 个无限循环,主要目的是保证游戏不会立即退出
在游戏循环中,利用时钟对象的tick方法可以设置刷新帧率,从而能够
达到连续、高品质的动画效果
减低CPU的负荷
1.4主窗口背景颜色
1.4.1 pygame的颜色定义
pygame的颜色使用的是RGB色彩模式,即通过对红(R)、绿(G)、 蓝(B)三个颜色相互之间的叠加来得到各种各样的颜色。
在pygame中,使用(R, G, B) 格式的元组来定义一个颜色。红(R)、 绿(G)、 蓝(B) 的数值是 0~ 255 之间的一个整数。数值对应颜色的亮级,数值越大亮级就越大。
常用的颜色定义如下:
元组数值  | 颜色  | 
(255, 255, 255)  | 白色  | 
(0, 0, 0)  | 黑色  | 
(255, 0, 0)  | 红色  | 
(0, 255, 0)  | 绿色  | 
(0, 0, 255)  | 蓝色  | 
(255, 255,0)  | 黄色  | 
(255, 128, 0)  | 橘色  | 
(128, 128, 128)  | 灰色  | 
1.4.2定义并绘制窗口背景颜色
在game_ items.py 模块中定义一个主窗口背景颜色的全局常量,代码如下:
import pygame# 全局变量
BACKGROUND_COLOR = (232, 232, 232) # 窗口背景色提示:
Python中没有变量和常量的区别
所谓常量就是定义之后,只允许访问,但是不允许修改
Python中,如果要定义常量,可以使用全大写命名,单词之间使用_分隔
修改game.py的Game类中的start方法,填充窗口颜色并更新显示,代码如下:
def start(self):"""启动并控制游戏"""clock = pygame.time.Clock() # 游戏时钟while True:# 设置窗口背景颜色self.main_window.fill(BACKGROUND_COLOR)# 刷新窗口内容pygame.display.update()# 设置刷新率clock.tick(60)提示:填充了主窗口颜色之后,务必要使用pygame.display.update()方法更新屏幕内容
update方法的作用就是将在游戏主窗口中绘制的最终结果一次性的显示在屏幕上


1.4.3阶段性小结
颜色使用(R, G, B)格式的元组定义
常量命名使用全大写,单词之间使用下划线_分隔
self.main_window.fill(背景颜色) 使用背景颜色填充窗口
要在屏幕上看到最终绘制结果,需要调用 pygame.display.update()方法
内容总结于:https://space.bilibili.com/441640380
相关文章:
Python-项目实战--贪吃蛇小游戏-游戏框架搭建(2)
1.游戏框架搭建介绍pygame开发图像界面游戏的几个要素,并且把贪吃蛇游戏的整体框架搭建完成本节知识点包括:pygame的初始化和退出游戏主窗口游戏循环和游戏时钟主窗口背景颜色绘制文本pygame的坐标系游戏事件监听绘制图形定时器事件1.1pygame的初始化和退…...
JVM基础
JVM基础 1.JVM的位置 JVM是运行在操作系统之上的,它与硬件没有直接的交互 2.JVM体系结构图 这个区域一定不会有垃圾回收 所谓JVM的调优,其实就是在调这个区域,而且99%情况下都在调堆 ! 3.类加载器ClassLoader 先来看看一个类加载到 JVM 的…...
Android 内存优化(基础轮)必看~
本次分享主要分为五个部分内容,第一部分内容是 5W2H 分析内存优化,第二部分内容是内存管理机制,第三部分内容是内存优化 SOP,第四部分内容是 内存优化指导原则, 最后一部分内容是总结与展望。 如果学完内存优化的基础论…...
STM32单片机GSM短信自动存取快递柜
实践制作DIY- GC0104-自动存取快递柜 一、功能说明: 基于STM32单片机设计-自动存取快递柜 二、功能介绍: STM32F103C系列最小系统板0.96寸OLED显示器DY-SV17F串口语音播报模块4*4矩阵键盘GSM短信模块4路舵机(模拟4个柜子) ***…...
力扣(LeetCode)410. 分割数组的最大值(2023.02.12)
给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 示例 1: 输入:nums [7,2,5,10,8], m 2 输出:18 解释: 一共有四种方法…...
管理还原数据
还原数据还原数据是:• 原始的、修改之前的数据副本• 针对更改数据的每个事务处理而捕获• 至少保留到事务处理结束• 用于支持:– 回退操作– 读取一致性查询– Oracle 闪回查询、Oracle 闪回事务处理和 Oracle 闪回表– 从失败的事务处理中进行恢复存…...
c的关键字有那些
编程语言中的关键字 C语言简洁、紧凑,使用方便、灵活。ANSI C标准C语言共有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以像汇编语言一样对位、字节和…...
链表OJ(一)
目录 从尾到头打印链表_牛客题霸_牛客网 160. 相交链表 141. 环形链表 142. 环形链表 II 138. 复制带随机指针的链表 从尾到头打印链表_牛客题霸_牛客网 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。 如输入…...
MySQL第三次作业
1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表,名为工作日期表…...
Python中的类和对象(7)
1.私有变量 在大多数面向对象的编程语言中,都存在着私有变量(private variable)的概念,所谓私有变量,就是指通过某种手段,使得对象中的属性或方法无法被外部所访问。 Python 对于私有变量的实现是引入了一…...
【JVM】7种经典的垃圾收集器
文章目录1. 垃圾收集器概述2. Serial 收集器3. ParNew 收集器4. Paraller Scavenge 收集器5. Serial Old收集器6. Parller Old收集器7. CMS 收集器8. Garbage First 收集器本文参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版ÿ…...
2023/2/12总结
滑动窗口(1)滑动窗口是一种基于双指针的思想,两个指针指向的元素形成一个窗口。一般用于求取数组或字符串的某个子串、子序列、最长最短等最值或者求某个目标值时,并且该问题本身可以通过暴力解决。滑动窗口分为固定窗口和不定窗口…...
Linux之正则表达式
正则表达式是组成“操作”的基本语法,而这些“操作”是应用于Sed和Awk必备的能力。因此只有了解了正则表达式,才能学好Sed和Awk。正则表达式分为基础正则表达式(Regular Expression)与扩展正则表达式(Extended Regular…...
前端高频面试题-HTML和CSS篇(一)
💻 前端高频面试题-HTML和CSS篇(一) 🏠专栏:前端面试题 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向…...
Redis 专题总结
1. 什么是Redis ? 处理:内容缓存,主要用于处理大量数据的高访问负载。Redis是一款高性能的NOSQL系列的非关系型数据库,NoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念࿰…...
【Python百日进阶-Web开发-Vue3】Day515 - Vue+ts后台项目2:登录页面
文章目录 一、创建登录路由1.1 安装 Vue VSCode Snippets插件1.2 处理路径引用的红色波浪线1.3 入口文件 main.ts1.4 主组件 App.vue1.5 路由文件 router/index.ts1.6 首页组件 views/HomeView.vue1.7 登录组件 views/LoginView.vue二、实现登录页面的表单展示2.1 element-plus…...
【博客620】prometheus如何优化远程读写的性能
prometheus如何优化远程读写的性能 场景 为了解决prometheus本地存储带来的单点问题,我们一般在高可用监控架构中会使用远程存储,并通过配置prometheus的remote_write和remote_read来对接 远程写优化:remote_write 远程写的原理:…...
redis可视工具AnotherRedisDesktopManager的使用
redis可视工具AnotherRedisDesktopManager的使用 简介 Another Redis DeskTop Manager 是一个开源项目,提供了以可视化的方式管理 Redis 的功能,可供免费下载安装,也可以在此基础上进行二次开发,主要特点有: 支持 W…...
【idea】idea生产类注释和方法注释
网上有很多类似的文章,但是我在按照他们的文章设置后,出现了一些问题,因此我这边在解决了问题后,总结一篇文章,发出来给大家借鉴一下。在此先说明一下idea的版本,是2020.1.3 设置动态模板,File…...
jenkins +docker+python接口自动化之jenkins容器安装python3(二)
jenkins dockerpython接口自动化之jenkins容器安装python3(二) 目录:导读 前提是在docker下已经配置好jenkins容器了,是将python安装在jenkins容器下的 1、先看你的jenkins是否安装好 2、以root权限进入jenkins容器࿱…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
