首頁 > 軟體

手把手教你用322行Python程式碼編寫貪吃蛇遊戲

2023-02-06 06:01:32

效果圖

貪吃蛇是一個很常見的小遊戲,我們如何用Python去實現呢。

安裝和匯入 

pip install pygame
pip install keyboard
pip install pickledb

通過命令提示字元安裝所需模組。(以上非Python程式碼)

#匯入
import pygame, keyboard, random, threading, time, pickledb

這個程式用到了pygame作為顯示模組,keyboard捕獲鍵盤操,pickledb記錄最高紀錄。

規則

#顯示規則
print()
print('方向鍵控制方向')
print(''esc'退出')
print(''alt'暫停')
print(''space'繼續')
print('每吃掉一個莓果,蛇身長長一格')
print('撞到蛇身或視窗邊緣即為死亡')
print('死亡後'esc'退出,'enter'再來一局')

初始化

#初始化
pygame.init()
 
#設定視窗
screen = pygame.display.set_mode((500, 500))
pygame.display.set_caption('Greedy Snake')

 執行以上程式碼就設定好了貪吃蛇的視窗。

設定Surface,變數和顯示數位的座標 

#設定蛇身
body = pygame.Surface((20, 20))
body.fill('yellow')
 
#設定莓果
berries = pygame.Surface((20, 20))
berries.fill('red')
 
#設定數位方塊(用於顯示數位)
block = pygame.Surface((4, 4))
#設定變數
T = 0
db = pickledb.load('Mark.db', False)
HI = db.get('HiMark')
B = False

函數

def keyname(key) :
    #鍵盤捕獲
    global KEY
    KEY = key.name
keyboard.on_press(keyname)

用on_press繫結了keyname後,當鍵盤按下時會執行keyname函數。(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() :
    #檢測是否吃掉食物
    if (x, y) == (fx, fy) :
        return True
    else :
        return False
 
def crash() :
    #檢測是否碰撞
    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() :
    #計時執行緒函數
    global T
    while True :
        if B :
            time.sleep(1)
            T += 1
 
def timer() :
    #顯示時間
    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() :
    #顯示分數
    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() :
    #顯示最高紀錄
    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

執行緒 

#啟動計時執行緒
time_count_thread = threading.Thread(target = count)
time_count_thread.start()

 執行緒可以在主執行緒的執行過程中執行,起到計時的作用。

主要部分

以下就是程式的主要部分,實現了對按鍵名稱進行判斷、蛇的移動、蛇吃掉食物後的生長和判斷死亡。

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)
 
        #檢測是否按下退出按鈕
        for event in pygame.event.get() :
            if event.type == pygame.QUIT :
                pygame.quit()
                exit()
        
        #檢測鍵盤按鍵
        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
 
        #檢測是否碰撞或吃掉食物
        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]
        
        #更新螢幕內容
        path.append((x, y))
        screen.fill('black')
        snake()
        food()
        timer()
        mark()
        hi()
        pygame.display.flip()
 
    #儲存最高紀錄
    if M > HI :
        HI = M
        db.set('HiMark', HI)
        db.dump()
    
    B = False
 
    #檢測是否退出或再來一局
    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

總結

如果你將以上所有的程式碼按順序編寫在一些,就可以執行完整的貪吃蛇了。這些程式碼都很簡單,適合初學者學習。

原始碼下載 

GitHub原始碼

到此這篇關於用322行Python程式碼編寫貪吃蛇遊戲的文章就介紹到這了,更多相關Python編寫貪吃蛇內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com