手把手教你用322行Python代碼編寫貪吃蛇游戲
效果圖

貪吃蛇是一個(gè)很常見的小游戲,我們?nèi)绾斡肞ython去實(shí)現(xiàn)呢。
安裝和導(dǎo)入
pip install pygame pip install keyboard pip install pickledb
通過命令提示符安裝所需模塊。(以上非Python代碼)
#導(dǎo)入 import pygame, keyboard, random, threading, time, pickledb
這個(gè)程序用到了pygame作為顯示模塊,keyboard捕獲鍵盤操,pickledb記錄最高紀(jì)錄。
規(guī)則
#顯示規(guī)則
print()
print('方向鍵控制方向')
print('\'esc\'退出')
print('\'alt\'暫停')
print('\'space\'繼續(xù)')
print('每吃掉一個(gè)莓果,蛇身長長一格')
print('撞到蛇身或窗口邊緣即為死亡')
print('死亡后\'esc\'退出,\'enter\'再來一局')初始化
#初始化
pygame.init()
#設(shè)定窗口
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Greedy Snake')執(zhí)行以上代碼就設(shè)定好了貪吃蛇的窗口。
設(shè)定Surface,變量和顯示數(shù)字的坐標(biāo)
#設(shè)定蛇身
body = pygame.Surface((20, 20))
body.fill('yellow')
#設(shè)定莓果
berries = pygame.Surface((20, 20))
berries.fill('red')
#設(shè)定數(shù)字方塊(用于顯示數(shù)字)
block = pygame.Surface((4, 4))#設(shè)定變量
T = 0
db = pickledb.load('Mark.db', False)
HI = db.get('HiMark')
B = False函數(shù)
def keyname(key) :
#鍵盤捕獲
global KEY
KEY = key.name
keyboard.on_press(keyname)用on_press綁定了keyname后,當(dāng)鍵盤按下時(shí)會(huì)執(zhí)行keyname函數(shù)。(key.name是按鍵的名稱)
def snake() :
#顯示蛇身
global path
for xy in path :
screen.blit(body, xy)
def food() :
#顯示食物
global fx, fy
screen.blit(berries, (fx, fy))
def eat() :
#檢測(cè)是否吃掉食物
if (x, y) == (fx, fy) :
return True
else :
return False
def crash() :
#檢測(cè)是否碰撞
if path.count((x, y)) != 0 :
return True
elif x < 0 or x > 480 or y < 0 or y > 480 :
return True
else :
return False
def count() :
#計(jì)時(shí)線程函數(shù)
global T
while True :
if B :
time.sleep(1)
T += 1
def timer() :
#顯示時(shí)間
global T, number
a = T // 100
b = T % 100 // 10
c = T % 10
a = number[a]
b = number[b]
c = number[c]
X, Y = 6, 10
block.fill('white')
for n in (a, b, c) :
for xy in n :
x = X + xy[0] * 4
y = Y + xy[1] * 4
screen.blit(block, (x, y))
X += 32
def mark() :
#顯示分?jǐn)?shù)
global M, number
a = M // 100
b = M % 100 // 10
c = M % 10
a = number[a]
b = number[b]
c = number[c]
X, Y = 395, 10
block.fill('white')
for n in (a, b, c) :
for xy in n :
x = X + xy[0] * 4
y = Y + xy[1] * 4
screen.blit(block, (x, y))
X += 32
def hi() :
#顯示最高紀(jì)錄
global HI, number
a = HI // 100
b = HI % 100 // 10
c = HI % 10
a = number[a]
b = number[b]
c = number[c]
X, Y = 263, 10
block.fill('grey')
for n in (a, b, c) :
for xy in n :
x = X + xy[0] * 4
y = Y + xy[1] * 4
screen.blit(block, (x, y))
X += 32線程
#啟動(dòng)計(jì)時(shí)線程 time_count_thread = threading.Thread(target = count) time_count_thread.start()
線程可以在主線程的運(yùn)行過程中運(yùn)行,起到計(jì)時(shí)的作用。
主要部分
以下就是程序的主要部分,實(shí)現(xiàn)了對(duì)按鍵名稱進(jìn)行判斷、蛇的移動(dòng)、蛇吃掉食物后的生長和判斷死亡。
while True :
#變量初始化
KEY = 'up'
lKEY = KEY
x, y = 240, 240
path = []
path.append((x, y))
fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
while path.count((fx, fy)) != 0 :
fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
T = 0
M = 0
B = True
while True :
time.sleep(0.1)
#檢測(cè)是否按下退出按鈕
for event in pygame.event.get() :
if event.type == pygame.QUIT :
pygame.quit()
exit()
#檢測(cè)鍵盤按鍵
if (KEY == 'up' and lKEY != 'down') or (KEY == 'w' and lKEY != 's') :
y -= 20
lKEY = KEY
elif (KEY == 'down' and lKEY != 'up') or (KEY == 's' and lKEY != 'w') :
y += 20
lKEY = KEY
elif (KEY == 'left' and lKEY != 'right') or (KEY == 'a' and lKEY != 'd') :
x -= 20
lKEY = KEY
elif (KEY == 'right' and lKEY != 'left') or (KEY == 'd' and lKEY != 'a') :
x += 20
lKEY = KEY
elif KEY == 'alt' or KEY == 'right alt' :
B = False
while True :
pygame.event.wait()
if KEY == 'space' :
KEY = lKEY
B = True
break
elif KEY == 'esc' :
pygame.quit()
if M > HI :
HI = M
db.set('HiMark', HI)
db.dump()
exit()
continue
elif KEY == 'esc' :
pygame.quit()
if M > HI :
HI = M
db.set('HiMark', HI)
db.dump()
exit()
else :
KEY = lKEY
continue
#檢測(cè)是否碰撞或吃掉食物
if crash() :
break
if eat() :
M += 1
fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
while path.count((fx, fy)) != 0 :
fx, fy = random.randrange(20, 460, 20), random.randrange(20, 460, 20)
else :
del path[0]
#更新屏幕內(nèi)容
path.append((x, y))
screen.fill('black')
snake()
food()
timer()
mark()
hi()
pygame.display.flip()
#保存最高紀(jì)錄
if M > HI :
HI = M
db.set('HiMark', HI)
db.dump()
B = False
#檢測(cè)是否退出或再來一局
while True :
event = pygame.event.wait()
if event.type == pygame.QUIT :
pygame.quit()
exit()
elif KEY == 'esc' :
pygame.quit()
exit()
elif KEY == 'return' or KEY == 'enter' :
break總結(jié)
如果你將以上所有的代碼按順序編寫在一些,就可以運(yùn)行完整的貪吃蛇了。這些代碼都很簡單,適合初學(xué)者學(xué)習(xí)。
源碼下載
到此這篇關(guān)于用322行Python代碼編寫貪吃蛇游戲的文章就介紹到這了,更多相關(guān)Python編寫貪吃蛇內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python模擬登錄之滑塊驗(yàn)證碼的破解(實(shí)例代碼)
這篇文章主要介紹了Python模擬登錄之滑塊驗(yàn)證碼的破解(實(shí)例代碼),代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
pycharm中django框架連接mysql數(shù)據(jù)庫的方法
這篇文章主要介紹了pycharm中django框架連接mysql數(shù)據(jù)庫的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Python利用sqlacodegen自動(dòng)生成ORM實(shí)體類示例
這篇文章主要介紹了Python利用sqlacodegen自動(dòng)生成ORM實(shí)體類,結(jié)合實(shí)例形式分析了Python sqlacodegen安裝技巧ORM實(shí)體類相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-06-06
將本地Python項(xiàng)目打包成docker鏡像上傳到服務(wù)器并在docker中運(yùn)行
Docker是一個(gè)開源項(xiàng)目,為開發(fā)人員和系統(tǒng)管理員提供了一個(gè)開放平臺(tái),可以將應(yīng)用程序構(gòu)建、打包為一個(gè)輕量級(jí)容器,并在任何地方運(yùn)行,這篇文章主要給大家介紹了關(guān)于將本地Python項(xiàng)目打包成docker鏡像上傳到服務(wù)器并在docker中運(yùn)行的相關(guān)資料,需要的朋友可以參考下2023-12-12
在Python中處理日期和時(shí)間的基本知識(shí)點(diǎn)整理匯總
這篇文章主要介紹了在Python中處理日期和時(shí)間的基本知識(shí)點(diǎn)整理匯總,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05
Pycharm 2to3配置,python2轉(zhuǎn)python3方式
這篇文章主要介紹了Pycharm 2to3配置,python2轉(zhuǎn)python3方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
python3 中文亂碼與默認(rèn)編碼格式設(shè)定方法
今天小編就為大家分享一篇python3 中文亂碼與默認(rèn)編碼格式設(shè)定方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10

