Python實現貪吃蛇一

????????貪吃蛇是一款經典的小游戲,最近嘗試用Python實現它。先做一個基礎版本實現以下目標:

????????1、做一個按鈕,控制游戲開始

????????2、按Q鍵退出游戲

? ? ? ? 3、右上角顯示一個記分牌

? ? ? ? 4、隨機生成一個食物,蛇吃到食物后長度加一,得10分

? ? ? ? 5、蛇碰到邊緣,游戲結束

? ? ? ? 6、蛇碰到自己,游戲結束

? ? ? ? 主流程代碼(gluttonous_snake.py)如下:

import sysimport 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 Scoreboardclass GluttonousSnake:""" 管理游戲資源和行為的類 """def __init__(self):""" 初始化游戲并創建游戲資源 """pygame.init()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# 隱藏鼠標光標pygame.mouse.set_visible(False)self.stats.score = 0self.sb.prep_score()self.settings.snake_direction = 'up'# 清空余下的蛇身self.snakes.clear()# 重新創建蛇身self._create_snakes()def _check_keydown_events(self, event):# 響應按鍵if event.key == pygame.K_RIGHT:if self.settings.snake_direction == 'up' or self.settings.snake_direction == 'down':self.settings.snake_direction = 'right'elif event.key == pygame.K_LEFT:if self.settings.snake_direction == 'up' or self.settings.snake_direction == 'down':self.settings.snake_direction = 'left'elif event.key == pygame.K_UP:if self.settings.snake_direction == 'right' or self.settings.snake_direction == 'left':self.settings.snake_direction = 'up'elif event.key == pygame.K_DOWN:if self.settings.snake_direction == 'right' or self.settings.snake_direction == 'left':self.settings.snake_direction = 'down'elif event.key == pygame.K_q:sys.exit()def _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.stats.game_active = False# 顯示鼠標光標pygame.mouse.set_visible(True)def _check_eat_self(self, snake_head):""" 是否碰到自己 """for snake in self.snakes:if snake.rect.colliderect(snake_head.rect):self.stats.game_active = False# 顯示鼠標光標pygame.mouse.set_visible(True)breakdef _check_eat_food(self):""" 檢測蛇吃到食物 """snake_head = self.snakes[0]food = self.foodif snake_head.rect.colliderect(food.rect):food.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.0self.stats.score += self.settings.food_scoreself.sb.prep_score()return Trueelse:return Falsedef _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:if self.settings.update_count % 500 == 0: #控制游戲速度self._update_snakes()self._check_edges()self.settings.update_count = 0self.settings.update_count += 1self._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()

? ? ? ? 按鈕類(button.py) :

import pygame.fontclass Button:def __init__(self, ai_game, msg):""" 初始化按鈕的屬性 """self.screen = ai_game.screenself.screen_rect = self.screen.get_rect()# 設置按鈕的尺寸和其他屬性self.width, self.height = 100, 50self.button_color = (0, 255, 0)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 48)# 創建按鈕的rect對象,并使其居中self.rect = pygame.Rect(0, 0, self.width, self.height)self.rect.center = self.screen_rect.centerself.rect.y = 100# 按鈕的標簽只需創建一次self._prep_msg(msg)def _prep_msg(self, msg):""" 將msg渲染為圖像,并使其在按鈕上居中 """self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.centerdef draw_button(self):# 繪制一個用顏色填充的按鈕,再繪制文本self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)

? ? ? ? 食物類(food.py):

import pygameclass Food:def __init__(self, ai_game):""" 創建一個蛇身對象 """super().__init__()self.screen = ai_game.screenself.screen_rect = ai_game.screen.get_rect()self.settings = ai_game.settingsself.color = self.settings.food_color# 在(0,0)處創建一個表示食物的矩形,再設置正確的位置self.rect = pygame.Rect(0, 0, self.settings.food_width,self.settings.food_height)# 對于每個食物,都將其放在屏幕底部的中央self.rect.x = self.settings.screen_width / 2self.rect.y = self.settings.screen_height - 100# 在食物的屬性x中存儲小數值self.x = float(self.rect.x)# 存儲用小數點表示的食物位置self.y = float(self.rect.y)def draw_food(self):""" 在屏幕上繪制食物 """pygame.draw.rect(self.screen, self.color, self.rect)

? ? ? ? 游戲狀態(game_stats.py):

class GameStats:""" 跟蹤游戲的統計信息 """def __init__(self, ai_game):""" 初始化統計信息 """self.settings = ai_game.settingsself.reset_stats()# 游戲剛啟動時處于非活動狀態self.game_active = Falsedef reset_stats(self):""" 初始化在游戲運行期間可能變化的統計信息 """self.score = 0

? ? ? ? 游戲設置(settings.py):

class Settings:def __init__(self):""" 初始化游戲的靜態設置 """# 屏幕設置self.screen_width = 800self.screen_height = 600self.bg_color = (230, 230, 230)# 游戲設置self.update_count = 1# 蛇身設置self.snake_width = 20self.snake_height = 20self.snake_color = (0, 230, 0)self.snake_direction = 'up'# 食物設置self.food_width = 20self.food_height = 20self.food_color = (230, 0, 0)self.food_score = 10

? ? ? ? 記分牌(scoreboard.py):

import pygame.font
from pygame.sprite import Groupclass Scoreboard:""" 顯示得分信息的類 """def __init__(self, ai_game):""" 初始化顯示得分涉及的屬性 """self.ai_game = ai_gameself.screen = ai_game.screenself.screen_rect = self.screen.get_rect()self.settings = ai_game.settingsself.stats = ai_game.stats# 顯示得分信息時使用的字體設置self.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 48)# 準備初始得分的圖像self.prep_score()def prep_score(self):""" 將得分轉換為一副渲染的圖像 """round_score = round(self.stats.score, -1)score_str = "{:,}".format(round_score)self.score_image = self.font.render(score_str, True,self.text_color, self.settings.bg_color)# 在屏幕右上角顯示得分self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def show_score(self):""" 在屏幕上顯示得分 """self.screen.blit(self.score_image, self.score_rect)

? ? ? ? 蛇對象(snake.py):

import pygame
from pygame.sprite import Spriteclass Snake(Sprite):def __init__(self, ai_game):""" 創建一個蛇身對象 """super().__init__()self.screen = ai_game.screenself.screen_rect = ai_game.screen.get_rect()self.settings = ai_game.settingsself.color = self.settings.snake_color# 在(0,0)處創建一個表示一段蛇身的矩形,再設置正確的位置self.rect = pygame.Rect(0, 0, self.settings.snake_width,self.settings.snake_height)# 對于每段蛇身,都將其放在屏幕底部的中央self.rect.x = self.screen_rect.width + (self.settings.screen_width / 2)self.rect.y = self.screen_rect.height + (self.settings.screen_height / 2)# 在蛇身的屬性x中存儲小數值self.x = float(self.rect.x)# 存儲用小數點表示的子彈位置self.y = float(self.rect.y)def draw_snake(self):""" 在屏幕上繪制蛇身 """pygame.draw.rect(self.screen, self.color, self.rect)def check_edges(self):""" 如果蛇位于屏幕邊緣,就返回True """screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0 or self.rect.top <= 0 or self.rect.bottom >= screen_rect.bottom:return True

? ? ? ? 運行游戲,下面是初始界面:

?

? ? ? ? 蛇碰到邊緣,游戲結束界面:

? ? ? ? ?蛇碰到自己,游戲結束界面:

? ? ? ? 以上是一個基礎版本的代碼實現,后續將對代碼進行優化并豐富游戲的功能。?

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901166.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《AI大模型應知應會100篇》第13篇:大模型評測標準:如何判斷一個模型的優劣

第13篇&#xff1a;大模型評測標準&#xff1a;如何判斷一個模型的優劣 摘要 近年來&#xff0c;大語言模型&#xff08;LLMs&#xff09;在自然語言處理、代碼生成、多模態任務等領域取得了顯著進展。然而&#xff0c;隨著模型數量和規模的增長&#xff0c;如何科學評估這些模…

工會考試重點內容有哪些:核心考點與備考指南

工會考試重點內容總結&#xff1a;核心考點與備考指南 工會考試主要考察考生對工會法律法規、職能職責、實務操作等內容的掌握程度&#xff0c;適用于企事業單位工會干部、社會化工會工作者等崗位的選拔。本文梳理工會考試的核心考點&#xff0c;幫助考生高效備考。 一、工會…

Verilog學習-1.模塊的結構

module aoi(a,b,c,d,f);/*模塊名為aoi&#xff0c;端口列表a、b、c、d、f*/ input a,b,c,d;/*模塊的輸入端口為a,b,c,d*/ output f;;/*模塊的輸出端口為f*/ wire a,b,c,d,f;/*定義信號的數據類型*/ assign f~((a&b)|(~(c&d)));/*邏輯功能描述*/ endmoduleveirlog hdl 程…

MySQL數據庫備份與恢復詳解

在數據庫管理中&#xff0c;數據的備份與恢復是至關重要的一環。對于MySQL數據庫&#xff0c;定期備份不僅能防止數據丟失&#xff0c;還能在發生故障時快速恢復數據庫。本文將詳細介紹MySQL數據庫的備份與恢復方法&#xff0c;覆蓋所有常用備份和恢復方式&#xff0c;幫助大家…

FFMPEG和opencv的編譯

首先 sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-de…

華為機試—最大最小路

題目 對于給定的無向無根樹&#xff0c;第 i 個節點上有一個權值 wi? 。我們定義一條簡單路徑是好的&#xff0c;當且僅當&#xff1a;路徑上的點的點權最小值小于等于 a &#xff0c;路徑上的點的點權最大值大于等于 b 。 保證給定的 a<b&#xff0c;你需要計算有多少條簡…

spring cloud微服務開發中聲明式服務調用詳解及主流框架/解決方案對比

聲明式服務調用詳解 1. 核心概念 定義&#xff1a;通過配置或注解聲明服務調用邏輯&#xff0c;而非手動編寫客戶端代碼&#xff0c;提升開發效率與可維護性。核心特性&#xff1a; 解耦&#xff1a;調用邏輯與業務代碼分離內置容錯&#xff1a;熔斷、超時、重試等動態發現&am…

基于springboot+vue的秦皇島旅游景點管理系統

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系統展示 用戶登錄 旅游路…

【數據結構】之二叉樹

二叉樹是我們在數據結構中學到的第一個非線性結構&#xff0c;是后續學習更為復雜的樹、圖結構的基礎。本文整理了二叉樹的概念定義、基本操作、遍歷算法、偽代碼與代碼實現以及實例說明&#xff0c;方便大家隨時查找對應。 一、定義與基本術語 二叉樹是一種樹形結構&#xf…

Honeyview:快速瀏覽各類圖像

Honeyview是一款免費、輕量級圖片查看工具?&#xff0c;專為快速瀏覽各類圖像設計&#xff0c;支持Windows系統?。其核心優勢在于?極速加載?與?廣泛格式兼容性?&#xff0c;可替代系統自帶的圖片查看工具&#xff0c;尤其適合需要處理專業圖像&#xff08;如PSD、RAW&…

Streamlit性能優化:緩存與狀態管理實戰

目錄 &#x1f4cc; 核心特性 &#x1f4cc; 運行原理 &#xff08;1&#xff09;全腳本執行 &#xff08;2&#xff09;差異更新 &#x1f4cc; 緩存機制 ?為什么使用緩存&#xff1f; 使用st.cache_data的優化方案 緩存適用場景 使用st.session_state的優化方案 &…

十七、TCP編程

TCP 編程是網絡通信的核心&#xff0c;其 API 圍繞面向連接的特性設計&#xff0c;涵蓋服務端和客戶端的交互流程。以下是基于 ?C 語言的 TCP 編程核心 API 及使用流程的詳細解析&#xff1a; 核心 API 概覽 ?函數?角色?描述socket()通用創建套接字&#xff0c;指定協議族…

將外網下載的 Docker 鏡像拷貝到內網運行

將外網下載的 Docker 鏡像拷貝到內網運行&#xff0c;可以通過以下步驟實現&#xff1a; 一、在有外網訪問權限的機器上操作 下載鏡像 使用docker pull命令下載所需的鏡像。例如&#xff0c;如果你需要下載一個名為nginx的鏡像&#xff0c;可以運行以下命令&#xff1a;docke…

《深入理解生命周期與作用域:以C語言為例》

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入 一、生命周期&#xff1a;變量的存在時間&#xff08;一&#xff09;生命周期的定義&#xff08;二&#xff09;C語言中的生命周期類型&#xff08;三&#…

Hqst的超薄千兆變壓器HM82409S在Unitree宇樹Go2智能機器狗的應用

本期拆解帶來的是宇樹科技推出的Go2智能機器狗&#xff0c;這款機器狗采用狗身體形態&#xff0c;前端設有激光雷達&#xff0c;攝像頭和照明燈。在腿部設有12個鋁合金精密關節電機&#xff0c;并配有足端力傳感器&#xff0c;通過關節運動模擬狗的運動&#xff0c;并可做出多種…

壹起航:15年深耕,引領中國工廠出海新征程

在全球化浪潮洶涌澎湃的當下&#xff0c;中國工廠正以前所未有的熱情和決心&#xff0c;將目光投向廣闊的海外市場。然而&#xff0c;出海之路并非一帆風順&#xff0c;建立品牌、獲取穩定詢盤、降低營銷成本等難題&#xff0c;如同橫亙在企業面前的高山&#xff0c;阻礙著他們…

【差分隱私相關概念】基礎合成定理和高級合成技術簡單關系

差分隱私中的合成定理用于分析多個機制組合時的隱私損失。基礎合成定理和高級合成技術分別在不同場景下提供了隱私預算增長的估計&#xff0c;其關系如下&#xff1a; 基礎合成定理&#xff08;線性增長&#xff09; 機制組合&#xff1a;當k個滿足(ε, δ)-DP的機制按順序組…

【異常處理】Clion IDE中cmake時頭文件找不到 頭文件飄紅

如圖所示是我的clion項目目錄 我自定義的data_structure.h和func_declaration.h在unit_test.c中無法檢索到 cmakelists.txt配置文件如下所示&#xff1a; cmake_minimum_required(VERSION 3.30) project(noc C) #設置頭文件的目錄 include_directories(${CMAKE_SOURCE_DIR}/…

MOS的驅動電流怎么計算?

一、MOS 驅動電流的計算方法 MOS 管在開關時&#xff0c;驅動電路主要是給柵極充放電。柵極電流 不是用來維持電流&#xff0c;而是用來克服電容的充放電需求&#xff0c;尤其是總柵極電荷 Qg。 驅動電流估算公式如下&#xff1a; I_drive Qg f_sw&#xff08;Qg&#xff…

GGML源碼逐行調試(下)

目錄 前言1. 簡述2. 預分配計算圖內存2.1 創建圖內存分配器2.2 構建最壞情況的計算圖2.3 預留計算圖內存 3. 分詞4. 模型推理與生成4.1 模型推理4.2 采樣 結語下載鏈接參考 前言 學習 UP 主 比飛鳥貴重的多_HKL 的 GGML源碼逐行調試 視頻&#xff0c;記錄下個人學習筆記&#x…