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

Python-项目实战--贪吃蛇小游戏-游戏框架搭建(2)

1.游戏框架搭建

  • 介绍pygame开发图像界面游戏的几个要素,并且把贪吃蛇游戏的整体框架搭建完成

  • 本节知识点包括:

  • pygame的初始化和退出

  • 游戏主窗口

  • 游戏循环和游戏时钟

  • 主窗口背景颜色

  • 绘制文本

  • pygame的坐标系

  • 游戏事件监听

  • 绘制图形

  • 定时器事件

1.1pygame的初始化和退出

  • pygame是专为开发电子游戏而设计的跨平台的Python包。而包中又针对不同的开发需求提供有不同的模块,例如:显示模块、字体模块、混音器模块等等。

注意:在这些模块中,有一部分模块是必须要初始化之后,才能够正常使用的,例如:字体模块等。

  • pygame为了程序员更加方便地使用包中的模块,提供有两个方法:initquit,其中:

  • 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.pyGame类中增加start方法

  • 代码如下:

def start(self):"""启动并控制游戏"""while True:pass

game.py的末尾修改代码:

# 游戏逻辑
Game().start() # 创建游戏对象并且启动游戏

1.3.2游戏中的动画实现原理

  • 在一款图形界面的游戏中,通常游戏的画面是不断变化的,也就是我们常说的动画。例如:贪吃蛇的运动、食物的出现与消失以及分数值的变化等等。

  • 那么游戏中的动画效果是怎样实现的呢?跟电影的原理类似,游戏中的动画效果,本质上是快速地在屏幕上绘制图像

  • 电影是将多张静止的电影胶片连续、快速地播放,产生连贯的视觉效果!

  • 一般在电脑上每秒绘制60次,就能够达到非常连续、高品质的动画效果。每次绘制的结果被称为帧Frame

  • 因此,刚刚完成的代码中,无限循环的执行频率(刷新帧率)只要能达到每秒60帧,就能够达到我们预期的动画效果了。但是,实际运行中,这个无限循环的执行频率有多快呢?

  • 调整一下game.pyGame类中的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版&#xff…...

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”,是一项全新的数据库理念&#xff0…...

【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 远程写的原理&#xff1a…...

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容器&#xff1…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...