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

news2024/11/15 5:34:10

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 = 0
    while 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ5.0.0消息存储<三>_消息转发与恢复机制

目录 一、消息转发 1. ReputMessageService线程初始化 2. 消息转发更新ConsumeQueue 3. 消息转发更新IndexFile 二、恢复机制 1. Broker加载存储文件 2. Broker正常退出的文件恢复 3. Broker异常退出的文件恢复 三、参考资料 一、消息转发 消息消费队列文件、索引文件…

七大设计原则之单一职责原则应用

目录1 单一职责原则介绍2 单一职责原则应用1 单一职责原则介绍 单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个 Class 负责两个职责,一旦发生需求变更,修改其中…

线程池的简单实现:Java线程池初学者必读指南

"作为一名Java开发者,是否曾经遇到过多线程并发的问题?线程数量过多时,会导致资源浪费,应用性能下降,甚至发生线程死锁的情况。那么,有没有一种方法可以有效地管理线程,避免这些问题呢&…

Matlab傅里叶谱方法求解一维波动方程

傅里叶谱方法求解基本偏微分方程—一维波动方程 一维波动方程 对于一根两端固定、没有受到任何外力的弦, 若只研究其中的一段, 在不太长的时间 里, 固定端来不及对这段弦产生影响, 则可以认为固定端是不存在的, 弦的长度为无限大。 这种无界 (−∞<x<∞)(-\infty<x&…

震源机制(Focal Mechanisms)之沙滩球(Bench Ball)

沙滩球包含如下信息&#xff1a; a - 判断断层类型&#xff0c;可根据球的颜色快速判断 b - 判断断层的走向(strike)&#xff0c;倾角(dip) c - 确定滑移角/滑动角(rake) 走向 &#xff0c;倾角&#xff0c;滑移角 如不了解断层的定义&#xff0c;可以先阅读&#xff1a;震…

windows下qt设置网卡ip信息+简单案列(图形化界面设置网卡IP)。

windows设置网卡ip信息的方法 文章目录windows设置网卡ip信息的方法前言一、QProcess修改网卡ip信息1.1 代码实例二、system修改网卡ip信息2.1 代码实例三、qt修改网卡信息案例3.1 设计方法3.2 代码实例3.3 功能测试前言 方法1&#xff1a;QProcess修改网卡ip信息&#xff1b;…

四种方式的MySQL安装

mysql安装常见的方法有四种序号 安装方式 说明1 yum\rpm简单、快速&#xff0c;不能定制参数2二进制 解压&#xff0c;简单配置就可使用 免安装 mysql-a.b.c-linux2.x-x86_64.tar.gz3源码编译 可以定制参数&#xff0c;安装时间长 mysql-a.b.c.tar.gz4源码制成rpm包 把源码制…

Spring boot 实战指南(四):登录认证(OAuth、Cookie、Session、Token)、Spring Security

文章目录一、登录认证方式1.OAuth 认证颁发令牌的四种方式2.Cookie/Session 认证(1)Cookie(2)Session3.Token认证基于JWT的Token认证(spring security)二、Spring boot整合Spring Security(前后端分离)1.快速入门2.认证3.授权参考&#xff1a; 教程 登录认证简介 OAuth 2.0 的一…

Spring项目中用了这种解耦模式,老大对我刮目相看

前言不知道大家在项目中有没有遇到过这样的场景&#xff0c;根据传入的类型&#xff0c;调用接口不同的实现类或者说服务&#xff0c;比如根据文件的类型使用 CSV解析器或者JSON解析器&#xff0c;在调用的客户端一般都是用if else去做判断&#xff0c;比如类型等于JSON&#x…

Python Web开发:用Tornado框架制作一个简易的网站

前言 大家早好、午好、晚好吖 ❤ ~ 今天我们要用Python做Web开发&#xff0c;做一个简单的【表白墙】网站。 众所周知表白墙的功能普遍更多的是发布找人&#xff0c;失物招领&#xff0c;还是一个大家可以跟自己喜欢的人公开表白的平台 Tornado框架简单介绍 在Python当中&am…

SpringMVC笔记【JavaEE】

SpringMVC 1. SpringMVC概念 Spring MVC 是一个Web 框架。Spring MVC 是基于Servlet API构建的。 MVC是 Model&#xff08;模型&#xff09; View&#xff08;视图&#xff09; Controller&#xff08;控制器&#xff09; 的缩写&#xff0c;它是一种设计模式。 视图分为两种&…

2022年山东省中职组“网络安全”赛项比赛任务书正式赛题

2022年山东省中职组“网络安全”赛项 比赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 Nginx安全策略 A-3 日志监控 A-4 中间件服务加固 A-5 本地安全策略…

html的表单标签(form)

目录标题1、表单标签主要有三大类&#xff1a;2、表单标签中常见的属性3、例子代码及结果4、注意&#xff1a;5、表单中特殊的属性表单标签可以用来数据交互&#xff0c;而前面学的六个标签只能发送不能接收。 表单标签的作用就是数据交互1、表单标签主要有三大类&#xff1a; …

搭建本地私有仓库

目录 一、搭建本地私有仓库 1、首先下载registry镜像 2、在daemon.json文件中添加私有镜像仓库地址 3、运行restart容器 4、为镜像打标签 5、上传到私有仓库 6、列出私有仓库的所有镜像 7、列出私有仓库的centos镜像有哪些tag 8、删除原有的centos的镜像&#xff0c;再测试…

双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输(带源码)

Depth2Uart 双目测距------双目相机V1.0&#xff0c;将双目相机采集到任意一点的深度数据进行串口传输 一、项目说明/Overview 所实现的功能&#xff1a;基于Intel Realsense官方提供的SDK&#xff0c;双目深度相机能获取到相机任何一个像素点距离前方障碍物的距离&#xff0…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(三级)答案解析

目录 一、单选题(共25题&#xff0c;共50分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共3题&#xff0c;共30分) 青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;三级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 默认小猫角色…

FlinkCEP - Flink的复杂事件处理

版本说明 本文中以Flink 1.16.1 版本讲解说明 Note:Flink1.16.1版本相较于之前版本增强的within函数&#xff0c; 支持模式序列中相邻事件间的超时定义&#xff0c;以前版本只支持模式序列中第一个事件到最后一个事件之间的最大时间间隔。 快速开始 基于Kafka connecter 流…

C语言速成(有基础)

linux下的 是一种通用的、面向过程式的计算机编程语言 #include <stdio.h> //#include 预处理命令&#xff0c;用来引用头文件&#xff0c; stdio.h 头文件 int main() //开始 {/* 一个注释 */printf("Hello, World! \n");return 0; …

最强大的人工智能chatGPT不会还有人没用过吧,再不用就out了

&#x1f517; 运行环境&#xff1a;chatGPT &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f9…

JUC并发编程 Ⅱ -- 共享模型之管程(上)

文章目录共享带来的问题临界区 Critical Section竞态条件 Race Conditionsynchronized 解决方案synchronized语法解决方案思考面向对象改进方法上的 synchronized线程八锁变量的线程安全分析成员变量和静态变量是否线程安全&#xff1f;局部变量是否线程安全&#xff1f;局部变…