Python实现贪吃蛇三

        上篇文章Python实现贪吃蛇一,实现了一个贪吃蛇的基础版本。后面第二篇文章Python实现贪吃蛇二修改了一些不足,但最近发现还有两点需要优化:

        1、生成食物的时候有概率和记分牌重合

        2、游戏缺少暂停功能

        先看生成食物的时候有概率和记分牌重合的问题。在游戏过程中,有时吃掉一个食物后,发现“没有”生成新的食物。实际上是食物生成的位置和记分牌重合了,被挡住了。这种情况很影响游戏体验,并且尝试去吃掉记分牌下面的食物时很容易撞墙。针对上面问题,在生成新的食物的时候,增加是否与记分牌重合的校验,如果重合,重新生成食物,直到符合要求。修改后的代码片段如下:

    def _check_food(self):""" 检查新生成的食物是否不与蛇身及记分牌重合 """food = self.foodfood.rect.x = round(random.randrange(20, self.settings.screen_width - self.settings.snake_width * 2) / 20.0) * 20.0food.rect.y = round(random.randrange(20, self.settings.screen_height - self.settings.snake_height * 2) / 20.0) * 20.0for snake in self.snakes:if snake.rect.colliderect(food.rect) or self.sb.score_rect.colliderect(food.rect):return Falsereturn True

        再看游戏暂停功能。 有时正在游戏过程中,尤其是得分比较高的时候,有事需要离开,这时候没有游戏暂停功能的话,只能结束游戏,体验不太好。如何增加暂停功能,思路其实比较简单:在游戏状态类里增加一个游戏暂停状态的属性,当按下“空格”键的时候,将这个属性值取反。同时游戏主循环里增加游戏暂停状态的判断,如果是暂停状态游戏不再刷新,如果不是暂停状态,游戏正常刷新。这样,就实现了游戏暂停功能。相关代码片段:

class GameStats:""" 跟踪游戏的统计信息 """def __init__(self, ai_game):""" 初始化统计信息 """self.settings = ai_game.settingsself.reset_stats()# 游戏刚启动时处于非活动状态self.game_active = False# 游戏暂停状态self.game_pause = Falsedef reset_stats(self):""" 初始化在游戏运行期间可能变化的统计信息 """self.score = 0def run_game(self):""" 开始游戏的主循环 """while True:self._check_events()if self.stats.game_active and not self.stats.game_pause:if self.settings.update_count > 500: #控制游戏速度self._update_snakes()self._check_edges()self.settings.update_count = 0self.settings.update_count += self.settings.game_speedself._update_screen()

        修改后主程序类(gluttonous_snake.py)的完整代码:

import sys
import timeimport pygame
import randomfrom settings import Settings
from snake import Snake
from game_stats import GameStats
from button import Button
from food import Food
from scoreboard import Scoreboard
from game_sound import GameSoundclass GluttonousSnake:""" 管理游戏资源和行为的类 """def __init__(self):""" 初始化游戏并创建游戏资源 """pygame.init()# 初始化音频混合器pygame.mixer.init()# 初始化游戏声音self.snake_eat_food_sound = GameSound('snake_eat_food.mp3')self.snake_game_over_sound = GameSound('snake_game_over.mp3')self.background_sound = GameSound('snake_background_sound.mp3')self.cheer_sound = GameSound('snake_cheer_sound.mp3')self.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("贪吃蛇")# 创建一个用于存储游戏统计信息的实例self.stats = GameStats(self)# 创建记分牌self.sb = Scoreboard(self)self.food = Food(self)self.snakes = []self._create_snakes()# 创建Play按钮self.play_button = Button(self, "Play")def _create_snakes(self):""" 初始化创建长度为3的蛇 """for snake_number in range(3):self._create_snake(snake_number)def _create_snake(self, snake_number):""" 创建一段蛇身 """snake = Snake(self)self.screen_rect = self.screen.get_rect()snake.x = self.settings.screen_width / 2snake.y = self.settings.screen_height / 2 + snake_number * self.settings.snake_heightsnake.rect.x = snake.xsnake.rect.y = snake.yself.snakes.append(snake)def _check_events(self):# 监视键盘和鼠标的事件for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()self._check_play_button(mouse_pos)def _check_play_button(self, mouse_pos):""" 在玩家单击Play按钮时开始新游戏 """button_clicked = self.play_button.rect.collidepoint(mouse_pos)if button_clicked and not self.stats.game_active:# 重置游戏设置self.stats.game_active = True# 播放背景音乐self.background_sound.play(0)# 隐藏鼠标光标pygame.mouse.set_visible(False)self.stats.score = 0self.sb.prep_score()self.settings.snake_direction = 'up'self.settings.update_count = 0self.settings.game_speed = 1# 清空余下的蛇身self.snakes.clear()# 重新创建蛇身self._create_snakes()def _check_keydown_events(self, event):# 响应按键if event.key == pygame.K_RIGHT:if self.settings.snake_direction == 'right':self._change_speed(1)elif self.settings.snake_direction == 'left':self._change_speed(-1)else:self.settings.snake_direction = 'right'elif event.key == pygame.K_LEFT:if self.settings.snake_direction == 'left':self._change_speed(1)elif self.settings.snake_direction == 'right':self._change_speed(-1)else:self.settings.snake_direction = 'left'elif event.key == pygame.K_UP:if self.settings.snake_direction == 'up':self._change_speed(1)elif self.settings.snake_direction == 'down':self._change_speed(-1)else:self.settings.snake_direction = 'up'elif event.key == pygame.K_DOWN:if self.settings.snake_direction == 'down':self._change_speed(1)elif self.settings.snake_direction == 'up':self._change_speed(-1)else:self.settings.snake_direction = 'down'elif event.key == pygame.K_SPACE:self.stats.game_pause = not self.stats.game_pauseelif event.key == pygame.K_q:sys.exit()def _change_speed(self, add):# 改变蛇的移动速度if (self.settings.game_speed + add) > 0:self.settings.game_speed += adddef _update_snakes(self):""" 更新蛇 """snake_head = self.snakes[0]self._create_snake_head(snake_head.rect.x, snake_head.rect.y)""" 检查是否吃到食物 """eat_food = self._check_eat_food()if not eat_food:self.snakes.pop()def _check_edges(self):""" 蛇碰到边缘时采取相应的措施 """snake_head = self.snakes[0]if snake_head.check_edges():self._game_over()def _check_eat_self(self, snake_head):""" 是否碰到自己 """for snake in self.snakes:if snake.rect.colliderect(snake_head.rect):self._game_over()breakdef _game_over(self):# 播放音乐self.snake_game_over_sound.play(1)self.stats.game_active = False# 显示鼠标光标pygame.mouse.set_visible(True)def _check_eat_food(self):""" 检测蛇吃到食物 """snake_head = self.snakes[0]food = self.foodif snake_head.rect.colliderect(food.rect):self.stats.score += self.settings.food_score# 播放声音if self.stats.score % 100 == 0:self.cheer_sound.play(1)else:self.snake_eat_food_sound.play(1)self.sb.prep_score()self._update_food()return Trueelse:return Falsedef _update_food(self):""" 更新食物 """while True:if self._check_food():returndef _check_food(self):""" 检查新生成的食物是否不与蛇身及记分牌重合 """food = self.foodfood.rect.x = round(random.randrange(20, self.settings.screen_width - self.settings.snake_width * 2) / 20.0) * 20.0food.rect.y = round(random.randrange(20, self.settings.screen_height - self.settings.snake_height * 2) / 20.0) * 20.0for snake in self.snakes:if snake.rect.colliderect(food.rect) or self.sb.score_rect.colliderect(food.rect):return Falsereturn Truedef _create_snake_head(self, x, y):""" 创建蛇头 """snake = Snake(self)if self.settings.snake_direction == 'up':snake.x = xsnake.y = y - self.settings.snake_heightelif self.settings.snake_direction == 'down':snake.x = xsnake.y = y + self.settings.snake_heightelif self.settings.snake_direction == 'right':snake.x = x + self.settings.snake_widthsnake.y = yelif self.settings.snake_direction == 'left':snake.x = x - self.settings.snake_widthsnake.y = ysnake.rect.x = snake.xsnake.rect.y = snake.yself._check_eat_self(snake)self.snakes.insert(0, snake)def run_game(self):""" 开始游戏的主循环 """while True:self._check_events()if self.stats.game_active and not self.stats.game_pause:if self.settings.update_count > 500: #控制游戏速度self._update_snakes()self._check_edges()self.settings.update_count = 0self.settings.update_count += self.settings.game_speedself._update_screen()def _update_screen(self):# 每次循环时都会重绘屏幕self.screen.fill(self.settings.bg_color)self.food.draw_food()for snake in self.snakes:snake.draw_snake()# 如果游戏处于非活动状态,就绘制Play按钮if not self.stats.game_active:self.play_button.draw_button()# 显示得分self.sb.show_score()# 让最近绘制的屏幕可见pygame.display.flip()if __name__ == '__main__':# 创建实例并运行游戏ai = GluttonousSnake()ai.run_game()

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

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

相关文章

LSTM概述

一、LSTM的背景与动机 1.1 为什么需要LSTM? 在深度学习中,普通的神经网络(如全连接网络或卷积神经网络)在处理序列数据时表现不佳,因为它们无法捕捉数据中的时间依赖关系。循环神经网络(RNN)被设计来处理序列数据,通过隐藏状态在时间步之间传递信息。然而,传统RNN存…

DDS信号发生器设计

一、基本概述 1.1 DDS简介 DDS信号发生器即直接数字频率合成(Direct Digital Frequency Synthesis,简称DDS)是一种利用数字技术生成信号的方法。它通过数字信号处理技术,将数字信号转换为模拟信号,从而生成高质量的正…

生成式AI:如何用大模型呼叫系统提升销售转化率?

生成式AI技术正以惊人的速度重塑商业版图。从智能助手到自动化营销,从数据分析到客户洞察,生成式AI正在颠覆传统商业模式,云蝠智能以大模型、智能体为核心技术,致力于为百万企业提供语音互动智能体平台与解决方案,为企业在销售转化…

OOP丨《Java编程思想》阅读笔记Chapter 6 : 访问权限控制

《Java编程思想》Chapter 6 : 访问权限控制 1. 前言 1.1. 访问权限控制的等级1.2. package关键字的引入 2. 包:库单元 2.1. 代码组织2.2. 包名的创建 3. Java访问权限修饰词 3.1. 包访问权限3.2. public: 接口访问权限3.3. private: 你无法访问3.4. protected: 继承…

reconic 天空 模型

目录 推理代码: EnvLight 代码: 推理代码: sky_model self.models["Sky"]outputs["rgb_sky"] sky_model(image_info)outputs["rgb_sky_blend"] outputs["rgb_sky"] * (1.0 - outputs["opa…

从服务器多线程批量下载文件到本地

1、客户端安装 aria2 下载地址:aria2 解压文件,然后将文件目录添加到系统环境变量Path中,然后打开cmd,输入:aria2c 文件地址,就可以下载文件了 2、服务端配置nginx文件服务器 server {listen 8080…

C++ | 可变模板参数

1. 为什么需要可变模板参数? 在C11之前,若想实现一个接受任意数量参数的函数,只能依赖va_list等C风格可变参数,但这种方式类型不安全且难以调试。例如printf函数: printf("%d %f %s", 10, 3.14, "hel…

【机器学习】每日一讲-朴素贝叶斯公式

文章目录 **一、朴素贝叶斯公式详解****1. 贝叶斯定理基础****2. 从贝叶斯定理到分类任务****3. 特征独立性假设****4. 条件概率的估计** **二、在AI领域的作用****1. 文本分类与自然语言处理(NLP)****2. 推荐系统****3. 医疗与生物信息学****4. 实时监控…

AI Agents系列之AI代理的类型

在本文中,我们将探讨不同类型的 AI 代理,包括它们的实现、实际应用、优势和局限性。从简单反射代理到多代理系统,我们将了解这些模型如何推动自动化、决策制定和智能问题解决。 文章目录 1. AI代理的类型1.1 简单反射代理1.1.1 实现**1.1.2 优势****1.1.3 局限性**1.2 基于…

C# --- IEnumerable 和 IEnumerator

C# --- IEnumerable 和 IEnumerator IEnumerableIEnumeratorIEnumerable 和 IEnumerator 的作用手动实现 IEnumerableIEnumerable vs. IQueryable为什么有了ienumerator还需要ienumerable IEnumerable 在C#中,IEnumerable 是一个核心接口,用于表示一个可…

镜舟科技助力某大型电网企业破解数据架构升级难题,打造国产化湖仓标杆

在 “十四五” 规划全面推进国产化替代的背景下,某大型电网企业联合镜舟科技与腾讯云,基于全球领先的开源分析型数据库 StarRocks 及腾讯 TBDS 大数据平台,构建电力行业国产化湖仓一体架构。该项目实现 PB 级电力数据的统一管理,为…

Spark-SQL核心编程3

数据加载与保存 通用方式: SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet 数据加载方法: spark.read.lo…

使用HTML + CSS + JS,编写一个台球追分计分器

目录 一.代码 二.效果展示 三.该计分器的优点 一.代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

LLM小白自学笔记:1.两种指令微调

一、LoRA 简单来说&#xff0c;LoRA不直接调整个大模型的全部参数&#xff08;那样太费资源&#xff09;&#xff0c;而是在模型的某些层&#xff08;通常是注意力层&#xff09;加个“旁路”——两个小的矩阵&#xff08;低秩矩阵&#xff09;。训练时只更新这俩小矩阵&#x…

2026《数据结构》考研复习笔记一(C++基础知识)

C基础知识复习 一、数据类型二、修饰符和运算符三、Lambda函数和表达式四、数学函数五、字符串六、结构体 一、数据类型 1.1基本类型 基本类型 描述 字节&#xff08;位数&#xff09; 范围 char 字符类型&#xff0c;存储ASCLL字符 1&#xff08;8位&#xff09; -128…

基于骨骼识别的危险动作报警分析系统

基于骨骼识别的危险动作报警分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】基于骨骼识别算法的实时危险行为预警方案 【技术栈】 ①&#xff1a;系统环境&#xff1a;Windows 10/11、macOS Ventura、Ubuntu 20.04 ②&#x…

【双指针】四数之和(medium)

四数之和&#xff08;medium&#xff09; 题⽬描述&#xff1a;解法&#xff08;排序 双指针&#xff09;算法思路&#xff1a; C 算法代码&#xff1a;Java 算法代码&#xff1a; 题⽬链接&#xff1a;18. 四数之和 题⽬描述&#xff1a; 给你⼀个由 n 个整数组成的数组 num…

Flask+Influxdb+grafna构建电脑性能实时监控系统

Influx下载地址&#xff0c;这里下载了以下版本influxdb-1.8.5_windows_amd64.zip 运行前需要先启动Influx数据库&#xff1a; 管理员方式运行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf&#xff0c;以influxdb.conf配置文件启动数…

如何在Keil中配置国民技术N32G系列MCU开发环境

如何在Keil及Jlink中搭建国民技术N32G系列MCU开发环境 根据自己的MCU型号&#xff08;我这里的型号是N32G452REL7&#xff09;访问国民技术官网&#xff0c;依次从N32G通用MCU-技术资源-固件和软件-软件开发套件&#xff0c;获取对应MCU型号的SDK&#xff0c;也可点击这里从网盘…

微软承认Win11出现极端错误,只能强制关机或重装系统

最近&#xff0c;不少使用 Windows 11 的用户反映&#xff0c;在系统更新后&#xff0c;“Windows Hello”突然失效&#xff0c;原本便捷的人脸识别和PIN登录功能统统无法使用。更糟的是&#xff0c;有人在重置系统后直接被挡在系统门外&#xff0c;这让人不禁发问&#xff1a;…