寫在前面
本期內(nèi)容
- 基于pygame的AI版貪吃蛇小游戲
所需環(huán)境
- python
- pycharm或anaconda
- pygame
下載地址
- https://download.csdn.net/download/m0_68111267/88789665
需求分析
本游戲使用Pygame模塊開發(fā),不需要玩家操縱貪吃蛇,貪吃蛇會自動吃掉屏幕上隨機(jī)出現(xiàn)的食物,每吃一個食物貪吃蛇長度增加一節(jié)。如果貪吃蛇撞到屏幕邊緣或自己的身體,則游戲結(jié)束。游戲界面包括游戲區(qū)域和得分顯示區(qū)域。
程序設(shè)計(jì)
import pygame
import sys
from random import randint
# 蛇運(yùn)動的場地長寬
HEIGHT = 25
WIDTH = 25
SCREEN_X = HEIGHT * 25
SCREEN_Y = WIDTH * 25
FIELD_SIZE = HEIGHT * WIDTH
# 蛇頭總是位于snake數(shù)組的第一個元素
HEAD = 0
# 用來代表不同東西的數(shù)字,由于矩陣上每個格子會處理成到達(dá)食物的路徑長度,
# 因此這三個變量間需要有足夠大的間隔(>HEIGHT*WIDTH)
FOOD = 0
UNDEFINED = (HEIGHT + 1) * (WIDTH + 1)
SNAKE = 2 * UNDEFINED
# 由于snake是一維數(shù)組,所以對應(yīng)元素直接加上以下值就表示向四個方向移動
LEFT = -1
RIGHT = 1
UP = -WIDTH
DOWN = WIDTH
# 錯誤碼
ERR = -1111
# 用一維數(shù)組來表示二維的東西
# board表示蛇運(yùn)動的矩形場地
# 初始化蛇頭在(1,1)的地方,第0行,HEIGHT行,第0列,WIDTH列為圍墻,不可用
# 初始蛇長度為1
board = [0] * FIELD_SIZE
snake = [0] * (FIELD_SIZE + 1)
snake[HEAD] = 1 * WIDTH + 1
snake_size = 1
……(完整代碼請下載后查看)
程序分析
這段代碼是一個基于Python和pygame庫實(shí)現(xiàn)的貪吃蛇游戲的核心邏輯部分。游戲在一個25x25大小的網(wǎng)格上進(jìn)行,其中每個格子都有一個對應(yīng)的索引值,用于表示蛇的位置、食物位置以及地圖上的可達(dá)性。
首先,定義了一些全局變量,如游戲區(qū)域尺寸(HEIGHT, WIDTH)、屏幕尺寸(SCREEN_X, SCREEN_Y)、場地大?。‵IELD_SIZE)以及方向常量LEFT, RIGHT, UP, DOWN等。蛇和臨時蛇的位置信息分別存儲在一維數(shù)組snake和tmpsnake中,初始時蛇長度為1,位于(1,1)的位置。同時設(shè)置了食物food的初始位置,并且定義了FOOD、UNDEFINED和SNAKE三個特殊的數(shù)值,用來在二維矩陣board中區(qū)分食物、未探索區(qū)域及蛇體。
游戲中包含多個關(guān)鍵函數(shù):
-
is_cell_free(idx, psize, psnake)
:檢查給定索引idx處的單元格是否為空,即不被蛇身覆蓋。 -
is_move_possible(idx, move)
:判斷蛇能否向給定方向move移動。 -
board_reset(psnake, psize, pboard)
:重置地圖狀態(tài),將蛇體和食物標(biāo)記出來,并將其他空地設(shè)置為可到達(dá)的未知距離。 -
board_refresh(pfood, psnake, pboard)
:采用廣度優(yōu)先搜索算法更新地圖中的路徑長度,計(jì)算從每個非蛇體單元格到食物的最短距離。 -
choose_shortest_safe_move(psnake, pboard)
和choose_longest_safe_move(psnake, pboard)
:根據(jù)當(dāng)前地圖數(shù)據(jù),選擇距離食物最近或最遠(yuǎn)的安全移動方向。 -
is_tail_inside()
和follow_tail()
:通過虛擬操作判斷蛇頭是否可以朝蛇尾方向移動以避免死路,并找到這個方向。 -
any_possible_move()
:當(dāng)無明確安全方向時,隨機(jī)選擇一個可行的方向。 -
shift_array(arr, size)
:移動數(shù)組元素,模擬蛇的身體沿指定方向移動。 -
new_food()
:生成新的食物位置,確保不在蛇體內(nèi)。 -
make_move(pbest_move)
:執(zhí)行實(shí)際的蛇移動操作,包括增加蛇長、更新蛇頭位置、調(diào)整蛇身以及處理吃到食物的情況。 -
virtual_shortest_move()
:進(jìn)行一次虛擬移動,嘗試尋找最短路徑吃到食物并更新虛擬地圖狀態(tài)。 -
find_safe_way()
:結(jié)合虛擬運(yùn)行結(jié)果判斷蛇與食物間的路徑情況,并確定安全的下一步移動方向。
主循環(huán)中,程序不斷檢測用戶輸入事件(如退出或按下空格鍵重新開始),并依據(jù)上述函數(shù)計(jì)算出最佳移動方向,然后更新蛇的位置。如果蛇碰到自身或其他不可移動區(qū)域,則游戲結(jié)束,顯示“YOU DEAD!”提示,并告知玩家按空格鍵重新開始。同時,實(shí)時顯示當(dāng)前分?jǐn)?shù)(score)。
最后,main()
函數(shù)包含了游戲的初始化、事件處理、畫面渲染和游戲邏輯更新等內(nèi)容,構(gòu)成了整個貪吃蛇游戲的核心框架。
運(yùn)行結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-830065.html
系列文章
序號 | 目錄 | 直達(dá)鏈接 |
---|---|---|
1 | 入門實(shí)戰(zhàn)丨基于Tkinter的簡易計(jì)算器 | https://want595.blog.csdn.net/article/details/131731173 |
2 | 入門實(shí)戰(zhàn)丨基于Tkinter的生日管理系統(tǒng) | https://want595.blog.csdn.net/article/details/131731380 |
3 | 數(shù)據(jù)庫實(shí)戰(zhàn)丨基于Tkinter+MySQL的學(xué)生成績管理系統(tǒng) | https://want595.blog.csdn.net/article/details/130992721 |
4 | 數(shù)據(jù)庫實(shí)戰(zhàn)丨基于Tkinter+MySQL的梅西生涯數(shù)據(jù)管理系統(tǒng) | https://want595.blog.csdn.net/article/details/130995564 |
5 | Web實(shí)戰(zhàn)丨基于Django與Bootstrap的在線計(jì)算器 | https://want595.blog.csdn.net/article/details/134424381 |
6 | Web實(shí)戰(zhàn)丨基于django+html+css的在線購物商城 | https://want595.blog.csdn.net/article/details/135466052 |
7 | Web實(shí)戰(zhàn)丨基于django+html+css+js的電子商務(wù)網(wǎng)站 | https://want595.blog.csdn.net/article/details/135506809 |
8 | Web實(shí)戰(zhàn)丨基于Django與HTML的用戶登錄驗(yàn)證系統(tǒng) | https://want595.blog.csdn.net/article/details/135513413 |
9 | Web實(shí)戰(zhàn)丨基于django+html+css+js的學(xué)院門戶網(wǎng)站 | https://want595.blog.csdn.net/article/details/135511066 |
10 | Web實(shí)戰(zhàn)丨基于Django與HTML的新聞發(fā)布系統(tǒng) | https://want595.blog.csdn.net/article/details/135519824 |
11 | Web實(shí)戰(zhàn)丨基于django+html+css+js的在線博客網(wǎng)站 | https://want595.blog.csdn.net/article/details/135536765 |
12 | …… |
寫在后面
我是一只有趣的兔子,感謝你的喜歡!文章來源地址http://www.zghlxwxcb.cn/news/detail-830065.html
到了這里,關(guān)于游戲開發(fā)丨基于Pygame的AI版貪吃蛇小游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!