当前位置: 首页 > 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…...

go 命令行工具整理

这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。 比方说&#x…...

RuntimeError: CUDA out of memory

今天在训练模型的时候突然报了显存不够的问题,然后分析了一下,找到了解决的办法,这里记录一下,方便以后查阅。 注:以下的解决方案是在模型测试而不是模型训练时出现这个报错的! RuntimeError: CUDA out of…...

Kubernetes1.25中Redis集群部署实例

1、概述我们知道在 Kubernetes 容器编排平台中, 我们可以非常方便的进行应用的扩容缩, 同时也能非常方便的进行业务的迭代,本章主要讲解在Kubernetes1.25搭建Redis单实例和Redis集群主从同步的环境流程步骤, 如果是高频访问重要的线上业务我们最好是部署在物理机器上…...

C++11实现计算机网络中的TCP/IP连接(Windows端)

目录引言1、TCP2、IP2.1 IP路由器3、TCP/IP4、TCP/IP协议C11实现参考文献引言 TCP/IP 指传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol)。[1] 在TCP/IP协议簇中主要包含以下内容: TCP (传输控制协议) - 应用程序…...

Spring框架自定义实现IOC基础功能/IDEA如何手动实现IOC功能

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用! 7.4 自定义Spring IOC 创建新模块,结构如图![[Pasted image 20230210173222.png]] 7.4.1 定义bean相关POJO类 7.4.1.1 定义propertyValue类 /** …...

pip离线安装windows版torch

文章目录前言conda创建虚拟环境安装torchtorch官网在线安装离线手动安装测试是否安装成功后记前言 学习的时候遇到几个机器学习相关的项目,由于不同的项目之间用到的依赖库不太一样,于是想利用conda为不同的项目创建不同的环境方便管理和运行&#xff0…...

Redis核心知识点

Redis核心知识点Redis核心知识点大全五种数据类型redis整合SpringBoot序列化问题渐进式扫描慢查询缓存相关问题数据库和缓存谁先更新缓存穿透缓存雪崩缓存击穿实际应用超卖问题分布式锁全局唯一ID充当消息队列Feed流附近商户签到HyperLogLog实现UV统计持久化RDBAOF持久化小结事…...

14. 最长公共前缀

14. 最长公共前缀 一、题目描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: …...

SignalR注册成Windows后台服务,并实现web前端断线重连

注意下文里面的 SignalR 不是 Core 版本,而是 Framework 下的 本文使用的方式是把 SignalR 写在控制台项目里,再用 Topshelf 注册成 Windows 服务 这样做有两点好处 传统 Window 服务项目调试时需要“附加到进程”,开发体验比较差&#xf…...

【前端笔试题二】从一个指定数组中,每次随机取一个数,且不能与上次取数相同,即避免相邻取数重复

前言 本篇文章记录下我在笔试过程中遇到的真实题目,供大家参考。 1、题目 系统给定一个数组,需要我们编写一个函数,该函数每次调用,随机从该数组中获取一个数,且不能与上一次的取数相同。 2、思路解析 数组已经有了…...

个人怎么申请注册商标/seo资料

var utils{}; /*** 获取时区方法* returns {number} 8代表东8 -8西8*/utils.getLocalTime function () {var date new Date();return date.getTimezoneOffset() / -60;};/*** 获取当前时间方法* returns {string}对应格式的当前时间*/utils.getCurrentTime function (st…...

互联网运营培训班哪个好/优化 seo

1、查看firewall服务状态systemctl status firewalld2、查看firewall的状态firewall-cmd --state3、开启、重启、关闭、firewalld.service服务# 开启 service firewalld start # 重启 service firewalld restart # 关闭 service firewalld stop4、查看防火墙规则firewall-cmd -…...

品牌网站建设解决/外贸网站模板

危险函数 mixed eval (string $code) 把字符串作为PHP代码执行bool assert (mixed $assertion [,string $description]) 替代eval函数。相同功能。mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit-1 [,int&$count]])/e修正符使preg_rep…...

网站运行费用一般多少/百度指数行业排行

码云静态网页1 介绍2 搭建2.1 建仓库2.2 开启Gitee Pages功能3 图片3.1 头像参考1 介绍 码云是开源中国社区2013年推出的基于 Git 的代码托管服务,目前已经成为国内最大的代码托管平台,致力于为国内开发者提供优质稳定的托管服务。码云 Pages 是一个免费…...

做网站banner是什么意思/百度指数官网入口

开发的项目多种多样,有时候程序员也会遇到瓶颈不知如何往下操作,今天爱站技术频道小编为大家编写了iOS开发之如何给View添加指定位置的边框线详解,希望对大家有所帮助!示例代码封装一:直接封装成了一个方法/// 边框类型…...

2019年做网站还有前景吗/班级优化大师免费下载学生版

库 database 库 tabale创建 create空 null 非空 not null默认,展示 select之前 firstt 之后 after修改 modify改变 change键 index自动附值 auto_incremen...