Python 遊戲 貪吃蛇

2021-09-24 07:43:39 字數 2682 閱讀 7161

貪吃蛇是個非常簡單的遊戲,適合練手。先來看一下我的遊戲截圖:

玩法介紹:回車鍵:開始遊戲 空格鍵:暫停 / 繼續 ↑↓←→方向鍵 或 wsad 鍵:控制移動方向。

食物分紅、綠、藍三種,分別對應 10 分、20 分、30 分,每吃乙個食物增加對應分值,每增加 100 分速度加快一級,沒有設定關卡,我玩到 1100 分,速度太快了,然後就 game over 了。

貪吃蛇這個遊戲很簡單,螢幕上隨機出現乙個點,表示「食物」,上下左右控制「蛇」的移動,吃到「食物」以後「蛇」的身體加長,「蛇」碰到邊框或自己的身體,則遊戲結束。

我們先來分析一下,要寫出這個遊戲來需要注意哪些點。

1、蛇怎麼表示

我們可以將整個遊戲區域劃分成乙個個的小格仔,由一組連在一起的小格仔組成「蛇」,我們可以用不同的顏色來表示,如上圖中,我以深色表示背景,淺色表示「蛇」。

我們可以用座標來表示每乙個小方格,x 軸和 y 軸的範圍都是可以設定好的。用乙個列表來存放「蛇身」的座標,那麼一條「蛇」就出來了,最後只要顯示的時候以不同的顏色表示即可。

2、蛇怎麼移動?

第一反應就是像蚯蚓蠕動一樣,每乙個小方塊向前移動一格,但這樣實現起來很麻煩。一開始就是被這裡卡住了。

想象一下我們玩過的貪吃蛇,每次「蛇」的移動感覺上是整體往前移動了一格,排除掉腦子中「蛇」的「動作」,細想移動前和移動後「蛇」的位置變化,其實除了頭尾,其他部分根本就沒有變。那就簡單了,將下一格的座標新增到列表開頭,並移除列表的最後乙個元素,就相當於蛇向前移動了一格。

3、如何判定遊戲結束?

「蛇」移動超出了遊戲區的範圍或者碰到了自己就算輸了,軸座標的範圍是事先定好的,超出範圍很容易判斷。那麼如何判斷碰到自己呢?

如果腦子裡想的是「蛇」動的畫面,那真的比較難了,但是放到**中,我們的「蛇」是乙個列表,那麼只要判斷下一格的座標是否已經包含在「蛇」的列表中豈不就可以了?

理清了這些問題,我們就可以開始編碼了。

由於程式中要頻繁的對「蛇」進行頭尾的新增和刪除操作,為了效能更好那麼一點,我們用deque代替列表。

首先需要初始化「蛇」,「蛇」的初始長度為 3,位置位於左上角。

# 遊戲區域的座標範圍

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

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

snake = deque()

def_init_snake

(): snake.clear()

複製**

建立「食物」,在螢幕內隨機選取乙個點作為「食物」,但是要保證「食物」不在「蛇」身上。

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

複製**

「蛇」的移動可以有 4 個方向,用乙個元組來表示移動的方向,每次按下方向鍵,給賦對應的值

# 方向

pos = (1, 0)

for event in pygame.event.get():

if event.type == quit:

sys.exit()

elif event.type == keydown:

if event.key in (k_w, k_up):

# 這個判斷是為了防止蛇向上移時按了向下鍵,導致直接 game over

if pos[1]:

pos = (0, -1)

elif event.key in (k_s, k_down):

if pos[1]:

pos = (0, 1)

elif event.key in (k_a, k_left):

if pos[0]:

pos = (-1, 0)

elif event.key in (k_d, k_right):

if pos[0]:

pos = (1, 0)

複製**

而「蛇」的移動就可以表示為:

next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])

if next_s == food:

# 吃到了食物

food = create_food(snake)

else:

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:

snake.pop()

else:

game_over = true

複製**

Python 貪吃蛇遊戲

coding utf 8 引入turtle庫,製作snake,food的動畫 from turtle import 引入random庫,使food隨機出現 from random import randrange 引入freegames庫,這個庫中封裝了許多元素 我們可以使用正方形元素表示food,...

貪吃蛇遊戲

貪吃蛇遊戲 結構化程式設計 c語言程式設計 重要的的是結構化的程式設計思想 include include include include include include define field width 300 就做20個格仔的 define field height 300 define f...

貪吃蛇遊戲

include include include include include 使用當前時間做種子 enum dir 列舉型別enum dir 圍牆 class fencef 定義物件 畫框框 void fence initfence 顯示框框 void fence outputf int snak...