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容器࿱…...
别再死记硬背了!用这3个真实场景,彻底搞懂Koa中间件的洋葱模型
用三个实战案例拆解Koa中间件的洋葱模型 当你第一次听说Koa的"洋葱模型"时,是不是也和我一样,脑子里浮现出一个奇怪的画面:一个请求像剥洋葱一样,一层层往里钻,然后又一层层往外冒?但真正开始写代…...
TypeScript 快速实战系列:基础入门|TypeScript 核心语法 1 小时吃透(必备基础)
🔥 导读:上一篇我们搞定了TS环境搭建,也搞懂了为什么大模型开发必须学TS。今天这篇,不搞复杂理论,只讲大模型开发中「最常用、最核心」的TS语法——基础类型类型注解,1小时就能吃透,学完就能给大…...
Claude Code源码分析之提示词工程
每天免费领 1亿 Token,白嫖DeepSeek、GLM、MiniMax、Kimi等大模型! 在开发大模型应用的时候,管理系统提示词(System Prompt)往往是个让人头大的工程难题。要是只用简单的字符串拼接,随着活儿越接越多&#…...
2026届最火的五大AI论文工具解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 可采取如下结构化操作指令来降低文本里的人工智能生成特性, 首先,增添…...
手把手教你配置华为存储密码永不过期,告别90天改密烦恼
华为OceanStor存储密码策略深度优化指南:从基础配置到企业级解决方案 每次收到"密码即将过期"的提醒邮件时,存储管理员们都会不约而同地皱起眉头。在华为OceanStor V5系列存储系统的日常运维中,密码策略管理看似是个小问题…...
解锁B站视频离线观看:BilibiliDown下载神器完全指南
解锁B站视频离线观看:BilibiliDown下载神器完全指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/…...
惠普暗影精灵终极控制方案:OmenSuperHub开源工具完全指南
惠普暗影精灵终极控制方案:OmenSuperHub开源工具完全指南 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 厌倦了官方Omen Gaming Hub的臃肿和广…...
别让内存拖后腿!Ascend C算子开发中的内存优化实战(附性能分析工具Profiler使用指南)
昇腾Ascend C算子开发中的内存优化实战:从性能瓶颈到极致加速 在昇腾AI处理器的算子开发过程中,内存操作往往是性能提升的最后一道门槛。许多开发者投入大量精力优化计算逻辑后,却发现性能提升遇到了天花板——这时,内存访问很可能…...
手柄优化与跨平台适配:DS4Windows让PS手柄在PC上焕发新生
手柄优化与跨平台适配:DS4Windows让PS手柄在PC上焕发新生 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 在PC游戏世界中,找到一款得心应手的控制器配置工具往往比…...
GeoServer实战:如何用MBTiles扩展包发布高德/谷歌多层级地图(含WPS扩展配置)
GeoServer高级应用:MBTiles与WPS扩展包深度整合实战指南 引言 在当今地理信息系统(GIS)领域,高效发布多层级地图数据已成为开发者面临的常见挑战。无论是商业地图服务如高德、谷歌地图,还是自定义的矢量切片,都需要一套稳定可靠的…...
