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.pswp.cn/web/76035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76035.shtml
英文地址,請注明出處:http://en.pswp.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;…