Python-项目实战--贪吃蛇小游戏-贪吃蛇功能实现(4)

news/2024/3/28 20:53:06/文章来源:https://blog.csdn.net/aaaccc444/article/details/129064205

5.贪吃蛇功能的实现

  • 在这一小节,我们就以完成的游戏框架为基础,加入贪吃蛇的功能,完成整个游戏的开发

  • 本小节的知识重点包括:

  • 贪吃蛇类的设计

  • 定义贪吃蛇类

  • 添加蛇身体

  • 绘制和移动身体

  • 改变贪吃蛇的方向

  • 贪吃蛇吃食物

  • 贪吃蛇的死亡

5.1贪吃蛇类的设计

我们首先来明确一下在贪吃蛇类中应该封装哪些属性和方法, 这些内容的确定,会为后续的开发做好准备和铺垫。

按照贪吃蛇的游戏规则描述:

  • 贪吃蛇初始出现在游戏窗口的左上角位置,体长共有3节

  • 贪吃蛇初始沿屏幕水平方向,向右侧运动,每隔0.5秒移动一节身体

  • 使用键盘的方向键(↑、 ↓、←、→)可以改变蛇头的运动方向

  • 当蛇头与食物相遇时,代表蛇吃到了食物,游戏分数增加10分

5.1.1属性设计

  • 运动方向属性

要描述贪吃蛇的运动方向,我们可以使用pygame预置的方向键常量,分别是:

  • pygame.K_UP上

  • pygame.K_DWON下

  • pygame.K_LEFT左

  • pygame.K_RIGHT右

提示:在后续监听键盘按键事件以及修改蛇的运动方向时,还会使用到这些常量

  • 时间间隔属性

在初始状态时,贪吃蛇是每隔0.5秒移动一节身体的,而随着吃到的食物增加,这个时间间隔会不断缩小。因此我们还需要考虑使用一个属性来记录这个时间间隔

  • 身体列表属性

如果把贪吃蛇的每节身体看成屏幕上的一个小格子,那么我们就可以使用一个Rect对象,来表示贪吃蛇的一节身体。这样,要记录整个身体,只需要定义一个body _list的列表属性,用来记录从蛇头到蛇尾的每一身体的Rect对象即可。

  • 游戏得分属性

每一轮新游戏开始之后,游戏中只有一条贪吃蛇, 并且只有在这条蛇吃到食物之后,游戏分数才会增加,一旦贪吃蛇在运动过程中,蛇头撞到了窗口的边缘或者身体的其他部位,则判定为死亡。而再次开启新一轮游戏后,游戏分数会归零重新计算。

因此,我们可以定义一个游戏分数的属性,用来记录当前这条贪吃蛇对象的累计得分。

5.1.2方法设计

  • 重置贪食蛇属性

按照游戏规则描述--每一 轮游戏结束后,用户按下空格键会开启新一轮游戏。这就意味着,开启新一轮游戏需要把贪吃蛇对象的属性设置为初始值。我们可以定义1个reset_snake的方法,专门负责来重设贪吃蛇的属性值。

  • 添加身体

除了在初始化贪吃蛇时,我们要在水平向右的方向(蛇的初始运动方向)上增加三节身体之外,在游戏过程中,如果贪吃蛇再吃到食物,身体长度同样也要增加。

因此,我们可以定义1个add_node方法,专门负责向贪吃蛇的身体列表中增加一节身体。

  • 绘制身体和更新位置

为了方便游戏循环中的代码调用,我们可以定义2个方法来负责绘制身体和更新位置:

  • draw方法负责在游戏窗口中绘制贪吃蛇的身体

  • update方法负责移动蛇的身体

  • 改变蛇的方向

按照游戏规则描述--使用键盘的方向键 (↑、↓、←、→) 可以改变蛇头的运动方向。为了方便游戏循环中的代码调用,我们可以定义1个change_dir 方法,专门负责根据用户按键改变蛇的运动方向。

  • 判断死亡和吃到食物

为了方便游戏循环中的代码调用,我们可以定义2个方法来负责判断蛇的死亡和是否吃到食物

  • is_dead方法返回是否死亡

  • has_eat方法返回是否吃到指定的食物

5.1.3贪吃蛇的类图

综上所述,我们可以得到贪吃蛇的类图如下:

5.2定义贪吃蛇类

在这一小节,我们先做一些准备工作,其中包括:

  • 定义贪吃蛇类并准备reset_snake方法

  • 使用贪吃蛇的分数属性调整游戏中的得分显示

5.2.1定义贪吃蛇类

  • 首先,在game_items.py中定义Snake类,并且实现初始化方法reset_snake方法,代码如下:

class Snake(object):"""蛇类"""def __init__(self):"""初始化蛇的数据"""self.dir = pygame.K_RIGHTself.time_interval = 500  # 运动时间间隔self.score = 0  # 游戏得分self.color = (64, 64, 64)  # 身体颜色 - 深灰色body_list = []  # 身体列表def reset_snake(self):"""重置蛇的数据"""self.dir = pygame.K_RIGHTself.time_interval = 500self.score = 0self.body_list = []
  • 然后,在game.py中的Game类中添加reset_game方法

def reset_game(self):"""重置游戏参数"""self.score = 0self.is_game_over = Falseself.is_pause = False# 重置蛇的数据self.snake.reset_snake()# 重置食物位置self.food.random_rect()
  • 接着,修改game.py中的Game类中的绘制得分代码。得分是贪吃蛇的分数

# 绘制得分
self.score_label.draw(self.main_window, "DeFen: %d" % self.snake.score)# 绘制暂停、游戏结束的标签
if self.is_game_over:self.tip_label.draw(self.main_window, "Youxi Jiesu anKonggeJian KaiQi xinyouxi")
elif self.is_pause:self.tip_label.draw(self.main_window, "Youxi Zanting KonggejianJixu...")
else:self.snake.score += 1# 绘制食物
self.food.draw(self.main_window)

5.3添加蛇身体

添加蛇身体也就是add_ node这个方法是贪吃蛇游戏中非常关键的一个方法!

按照之前的分析,我们已经知道,在游戏中要添加一节身体一共有两种情况:

  • 初始化贪吃蛇时,在屏幕的左上角,沿水平向右方向,依次添加3节身体

  • 在游戏过程中,吃到食物后,同样需要增加1节身体

我们先看一下如下示意图,分析一下在吃到食物后,增加身体的处理方式

观察上图不难发现,当吃到食物时,我们只需要在蛇头的前方位置,也就是沿着蛇当前的运动方向偏移一个小格子,再增加一节身体作为蛇头就可以了。

这种处理方式最大的好处是:增加身体和向前移动可以一步到位!而不需要先在蛇尾添加一节身体,再向前依次移动每一节蛇的身体

接下来,再看一下添加蛇身体的流程图,进一步确认一下添加蛇身体的处理方式

接下来,按照流程图,来实现一下在game_items.py的Snake类中添加add_node方法,代码如下:

def add_node(self):"""添加一节身体"""# 生成新的矩形对象if self.body_list:# 已经有身体了head = self.body_list[0].copy()else:# 还没有身体head = pygame.Rect(-CELL_SIZE, 0, CELL_SIZE, CELL_SIZE)# 根据移动方向,把新生成的头部放到恰当的位置if self.dir == pygame.K_RIGHT:head.x += CELL_SIZEelif self.dir == pygame.K_LEFT:head.x -= CELL_SIZEelif self.dir == pygame.K_UP:head.y -= CELL_SIZEelif self.dir == pygame.K_DOWN:head.y += CELL_SIZE# 把新生成头部放到列表的最前面self.body_list.insert(0, head)

5.4绘制和移动身体

在这一小节,要完成两个任务:

  • 利用draw模块提供的方法绘制蛇的身体

  • 利用定时器事件实现蛇的移动

5.4.1绘制身体

  • game_items.py的Snake类中定义draw方法,并实现如下代码:

def draw(self,window):"""绘制蛇的每一节身体"""for idx, rect in enumerate(self.body_list):pygame.draw.rect(window, self.color, rect.inflate(-2, -2), idx==0)
  • 在game.py的Game类的游戏循环中,让蛇对象调用draw方法,代码如下:

# 绘制食物
self.food.draw(self.main_window)# 绘制贪吃蛇
self.snake.draw(self.main_window)# 刷新窗口内容
pygame.display.update()

未完待续

内容总结于:https://space.bilibili.com/441640380

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java -cp 错误:找不到或无法加载主类

java -cp 错误:找不到或无法加载主类 1.问题场景 在一个项目开发中,我需要写一个 windows的bat脚本,需要在里面 调用 SpringBoot项目生成的jar包,我在调用 classes下面的 jar时 通过 调用 jar包 去调用 jar包中的某个 .java类 …

吃鸡用什么蓝牙耳机效果好?手游吃鸡公认最好的几款蓝牙耳机

蓝牙耳机的作用很多,几乎每个人都需要一副很棒的耳机在通勤或锻炼途中使用,并且玩游戏也少不了它,手游近几年十分的流行,下面整理了几款性能不错的蓝牙耳机。 第一款:南卡小音舱蓝牙耳机 蓝牙版本:5.3 发…

树莓派CM4基础设置

安装系统1.1 软件和硬件准备硬件:CM4(4GB DDR32GB EMMC 板载WIFI和蓝牙)CM4-to-Pi4-Adapter软件:Raspberry Pi或者 Win32DiskImagerRaspberry Pi下载链接:点击直接下载Win32DiskImager下载链接:链接&#x…

JSP 在线学习管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 在线学习管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为SQLServer2008&#x…

第09章_MySQL子查询

第09章_子查询 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了…

2023年你应该关注的JavaScript趋势

本文翻译者系360 奇舞团前端开发工程师原文标题:Top JavaScript (JS) Trends You Should Follow in 2023原文作者:yevheniia原文地址:https://www.codica.com/blog/top-javascript-trends/#top-java-script-frameworks-and-libraries-to-watc…

【python】考前复习,python基础语法知识点整理

文章目录1.常量与表达式2.变量和数据类型创建变量数据类型动态类型数据类型的转换3.注释4.字符串字符串的定义方式字符串的拼接字符串的格式化①字符串格式化的精度控制字符串的格式化②对表达式进行格式化5.从控制台输入(input)6.运算符算术运算符赋值运算符布尔类型和比较运算…

顶象APP加固的“蜜罐”技术有什么作用

目录 蜜罐有很多应用模式 蜜罐技术让App加固攻守兼备 顶象端加固的三大功能 为了捕获猎物,猎人会在设置鲜活的诱饵。被诱惑的猎物去吃诱饵时,就会坠入猎人布置好的陷阱,然后被猎人擒获,这是狩猎中常用的一种手段。在业务安全防…

【华为OD机试真题】用 C++ 实现 - 最小施肥机能效

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

关于《How to Learn to Code Get a Developer Job in 2023》的经验学习

1. Who is This Book For ? for Anyone who is considering a career in software development. 2. Can Anyone Learn to Code? Any sufficiently motivated person can learn to code. 3.Executive Summary Learning to code is hard.Getting a job as a software devel…

jupyter的安装步骤

1.安装python文件 首先去官网python去下载python的安装包,点击donwload,选择合适的系统。这里我是windown系统,点击进去,如图找到有installer的去下载。不建议下载最新版本的,会有兼容问题。 2.安装python 点击第二个选项是自己配…

JavaScript 进阶--charater3

文章目录前言一、编程思想1.1 面向过程介绍1.2 面向对象编程 (oop)对比二、构造函数三、原型3.1原型3.2 constructor 属性3.3 对象原型3.4 原型继承3.5 原型链总结前言 🆑学习目标 理解面向对象思想,掌握函数原型对象运用面向对象封装继承特点&#xf…

Docker之路(5.Docker镜像学习、镜像加载原理、镜像分层原理、通过commit提交镜像)

1.镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内客, 包活代码、运行时、库、环境变量和配置文件。 所有的应用,直接打包docker镜像&…

UE4 手把手教你做插件(4)做一个可以拖入场景的小方块插件

0,前言 学习一下如何编写一个有actor的插件,能够将它拖入场景里面。 1,创建插件 (1)创建一个空白插件 添加之后vs里面就会多出一个目录: (2)给插件添加一个actor 创建完actor之后&am…

ubuntu本地访问nas

需求 本地磁盘空间太小,本地网络里有个nas,希望将nas作为数据盘挂载到本地使用。 方法1 基于sftp访问nas 首先nas设置时要打开sftp访问功能。 然后用ubuntu桌面访问服务器的功能登录sftp,类似如下指令 sftp://user192.168.0.100 ubuntu下…

DevData Talks | 对谈谷歌云 DORA 布道师,像谷歌一样度量 DevOps 表现

本期 DevData Talks 我们请到来自 Google Cloud 谷歌云的 DORA 研究团队的嘉宾 Nathen Harvey与 Apache DevLake、CNCF DevStream 的海外社区负责人 Maxim 进行对谈。如果您关注 DevOps 的话,也许对这个团队有所耳闻。 DORA 的全称是 DevOps Research and Assessme…

【运动控制】CNC三轴小线段路径规划

CNC三轴小线段路径规划 文章目录CNC三轴小线段路径规划一、项目说明二、具体实现1、速度规划2、小线段插补3、运动学逆解刀轴插补点4、差分处理得到实际的速度和加速度5、加速度滑动平均6、实现的效果如图所示三、Reference写在前面,本文是作为一个练手小项目的总结…

论文浅尝 | Deep Reinforcement Learning for Entity Alignment

笔记整理:陈鹏,天津大学硕士链接:https://aclanthology.org/2022.findings-acl.217.pdf动机实体对齐(Entity Alignment)的基本目标在于发现两个知识图谱间指向同一现实对象的实体对,以便将不同知识图谱连接起来&#x…

Interview系列 - 06 Java | ArrayList底层源码分析 | 遍历集合时如何删除集合中的元素

文章目录1. 底层源码分析01. 属性02. 构造方法03. 在数组的末尾添加元素 add(E e)04. 在数组的指定位置添加元素 add(int index, E element)05. 替换指定位置的元素 set(int index, E element)06. 获取指定索引位置处的元素 get(int index)07. 删除指定位置的元素 remove(int i…

华为OD机试真题 用 C++ 实现 - 众数和中位数 | 多看题,提高通过率

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…