用 Python 製作乙個 貪吃蛇

2022-06-26 13:09:11 字數 4507 閱讀 8913

今天呢,將分享乙個關於 遊戲製作的小案例;僅用不到 200 行**實現乙個貪吃蛇遊戲,作為 python遊戲 系列的第一篇文章,先看一下程式效果

關於程式具體實現部分,請看下文

工具庫程式中用到的 python 庫有:

sys

pygame

time

collection

time

random

其中核心庫為pygame

實現細節

貪吃蛇 具體實現部分,大致分為三個模組來介紹:遊戲初始化、遊戲執行(蛇移動、吃掉食物)、遊戲結束

1,遊戲初始化

首先,需對遊戲中的蛇、食物、遊戲邊界、各元素顏色屬性、得分記錄、速度記錄等進行初始化,初始的視窗大小設為(600,480),通過寬度為 1 的黑線將遊戲視窗分為數個小方格(每個小方格大小為(20,20))

screen_width = 600 # 螢幕長

screen_height = 480 #螢幕寬

size = 20 # 小方格大小

line_width = 1 #網格線寬度;

#遊戲區域的座標範圍

scope_x = (0,screen_width//size-1)

scope_y = (0,screen_height//size-1)

#食物分值及顏色

food_style_list = [(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))]

light = (100,100,100)

dark = (200,200,200) #蛇的顏色

black = (0,0,0) #網格線顏色,黑色

red = (200,30,30) # 紅色,game over 字型顏色

bgcolor = (40,40,60) #背景色

初始化的大小佔連續3個小方格;食物佔 1個小方格、初始時食物隨機放置在視窗內某一座標處(當然需要排除蛇身區域外)

# 初始化蛇

def init_snake():

snake = deque()

return snake

# 建立食物

def create_food(snake):

food_x = random.randint(scope_x[0],scope_x[1])

food_y = random.randint(scope_y[0],scope_y[1])

while (food_x,food_y) in snake:

# 食物出現在蛇身上,重新生成

food_x = random.randint(scope_x[0],scope_x[1])

food_y = random.randint(scope_y[0],scope_y[1])

return food_x,food_y

2,遊戲得分

當遊戲開始時需給與 **蛇 ** 運動方向設定為乙個初始引數 ,這裡以二維元組形式儲存,賦值給變數 p,共分為四種情況:

配合鍵盤事件響應,當使用者按下 上(w)、下(s)、左(a)、右(d)鍵時,程式會執行相應操作

for event in pygame.event.get():#事件重新整理

if event.type == quit:

sys.exit()#退出

elif event.type == keydown:

if event.key == k_return:

if game_over:

start = true

game_over = false

b =true

snake = init_snake()

food = create_food(snake)

food_style = get_food_style()

pos = (1,0)#方向

score = 0

last_move_time = time.time()#上次移動時間

elif event.key == k_space:

if not game_over:

pause = not pause

elif event.key in(k_w,k_up):

#判斷防止蛇向上移動時按了向下鍵,導致game over

if b and not pos[1]:

pos = (0,-1)

b = false

elif event.key in (k_s,k_down):

if b and not pos[1]:

pos =(0,1)

b = false

elif event.key in (k_a,k_left):

if b and not pos[0]:

pos = (-1,0)

b =false

elif event.key in (k_d,k_right):

if b and not pos[0]:

pos =(1,0)

b = false

蛇身移動程式將所佔所有小方格座標依次儲存在乙個佇列中,移動一次,佇列完成一次進出操作:隊尾刪除乙個元素,對列頭部插入蛇頭所在的新方格座標;

if(scope_x[0]<= next_s[0]<= scope_x[1] and scope_y[0]<= next_s[1]<= scope_y[1] and next_s not in snake):

# 下個座標在範圍內

#依次進出元素

吃到食物

每吃到一次食物,蛇身多增加乙個小方格區域,其佇列插入乙個新元素、長度加一,

next_s = (snake[0][0] + pos[0],snake[0][1] +pos[1])#蛇移動

if next_s == food:#吃到了食物

speed = orispeed - 0.03*(score//100) # 更新速度

food = create_food(snake)

food_style = get_food_style()

3,遊戲結束

遊戲終止的邊界條件為兩類

1,移動區域超出視窗邊界;

2,蛇頭碰到蛇身;

程式中用 布林變數 game_over來標識遊戲是否結束(true或者false),每次重新整理頁面之前預設為 false,當遊戲正常執行未發生以上兩類事件時設為true 遊戲執行,否則遊戲結束

if game_over:#遊戲結束

if start:

print_text(screen,font2,(screen_width-fwidth)//2,(screen_height-fheight)//2,'game over',red)

pygame.display.update()#重新整理頁面

為了提高遊戲體驗,程式中用 score 變數表示得分,speed 來表示移動速度,得分每增加100 更新一次移

動速度,隨著時間推移遊戲難度也不斷加大

score += food_style[0]

speed = orispeed - 0.03*(score//100) # 更新速度

小結

本次製作的這個貪吃蛇只是具備了一些基本功能,目前還有很大的改善空間,比如借助 pygame 的 mixer 模組在遊戲中一些特定事件處加入一些觸發音效,遊戲開始時增加乙個初始化頁面等;總的來說,這個小遊戲只適合學習不適合玩耍,想玩耍的話建議移步王者榮耀等高階遊戲區

原始碼獲取

一 貪吃蛇的製作

對於貪吃蛇 很多人都不陌生 但作為學程式設計的學生 如何在學完c語言後寫出一款控制台貪吃蛇呢?1首先,我們要明確要定義的標頭檔案 include include include windows程式設計標頭檔案 include include 控制台輸入輸出標頭檔案 include2其次,無論是遊戲還...

用MFC寫了個貪吃蛇

這幾天看侯sir的 深入淺出mfc 看完了覺得如果就這麼放下可能效果不好,就做了個貪吃蛇,本來打算做另乙個東西呢,結果發現現在知識儲備還不夠,還得看看書,再說吧!貪吃蛇實現得比較簡單,sdi,單執行緒,沒用位圖,因為我沒搞明白怎麼編輯和使用位圖,而且在網上看到乙個也沒用點陣圖的貪吃蛇範例,很好看,就...

c語言寫了乙個貪吃蛇

很簡單的 可能存在一些bug 大牛不要嘲笑 include stdafx.h include include head.h include include int x 1,y 1,m 0 m為蛇的長度 n為食物個數 int nx 1,ny 1,n 0 int chengji 0 void 遊戲開始 ...