天天看點

學生學python程式設計---實作貪吃蛇小遊戲+源碼

學生學python程式設計---實作貪吃蛇小遊戲+源碼

      • 前言
    • 主要設計
      • 1、蛇的表示
      • 2、蛇怎麼移動?
      • 3、玩家控制小蛇移動功能的實作
      • 4、如何判定遊戲結束?
    • 應用知識點
      • 1、python知識點
        • 1.1 清單
        • append()在清單未尾增加一個元素
        • del 删除最後一個元素
        • 在指定位置增加元素用insert()
        • 1.2 time 時間子產品
        • 1.3 random子產品
      • 2、pygamezero知識點
        • 2.1 遊戲角色Acto
        • 2.2 輸出中文字型
        • 2.3鍵盤控制
    • 功能截圖
    • 代碼實作
        • 1、蛇的表示
      • 2、蛇的前進移動
      • 3、控制移動方向
      • 4、遊戲失敗
      • 5、食物的随機出現
      • 6、遊戲得分
    • 總結
    • 源碼擷取

前言

這幾年人工智能技術大發展,Python是以幾乎成了第一位的語言。實際上,多年來,它不僅在軟體工程師中得到廣泛使用,也是各行業通用的專家語言,就是說,不管孩子以後做什麼,都可能用得着。準備針對我自己上國小的孩子,每周抽出些時間,通過學習他們感興趣的小遊戲,逐漸把python知識點帶進遊戲的制作過程中,用到哪些知識簡單的解紹一下哪些,以學,以用為主。

本次我們将編寫一個貪吃蛇的遊戲。通過鍵盤上、下、左、右控制小蛇上、下、左、右移動,吃到食物後長度加1;蛇頭碰到自身或視窗邊緣,遊戲失敗。我們首先構造小蛇,實作小蛇向4個方向移動;然後實作遊戲失敗的判斷、吃食物增加長度、得分功能;每段遊戲,增加一個功能,另存一下,容易讓孩子了解學習,同時也可以讓其在每個階段增加他想增加的功能,一舉多得。最後學習函數的定義與使用,并通過進行時間控制變更遊戲難度。

主要設計

1、蛇的表示

遊戲開發本身就會用到很多面向對象的概念,而蛇的身體又是一個天然的“連結清單”結構,太适合用來練習資料結構了。

蛇怎麼表示?我們可以将整個遊戲區域劃分成一個個的小格子,由一組連在一起的小格子組成“蛇”,蛇頭用個蛇頭(圓帶兩個眼睛)表示,蛇身用個圓表示。我們可以用坐标來表示每一個小方格,X 軸和 Y 軸的範圍都是可以設定好的。用一個清單來存放“蛇身”的坐标,那麼一條“蛇”就出來了。

2、蛇怎麼移動?

第一反應就是像蚯蚓蠕動一樣,每一個小方塊向前移動一格,但這樣實作起來很麻煩。想象一下我們玩過的貪吃蛇,每次“蛇”的移動感覺上是整體往前移動了一格,排除掉腦子中“蛇”的“動作”,細想移動前和移動後“蛇”的位置變化,其實除了頭尾,其他部分根本就沒有變。那就簡單了,将下一格的坐标添加到清單開頭,并移除清單的最後一個元素,就相當于蛇向前移動了一格。(由于蛇頭與蛇身是不同的圖檔,還需要把第二張也即原先的蛇并沒有照片換成蛇身照片,要不跑幾步就成一串蛇頭了,你可以試試,把蛇身換蛇頭的那行代碼注釋掉就可看到了。)

3、玩家控制小蛇移動功能的實作

玩家控制小蛇移動功能的實作

玩家控制小蛇移動,在update()函數中實作使用者按上、下、左、右方向鍵,設定direction變量取不同的值,即可實作玩家鍵盤控制小蛇向4個方向移動。即通過一個公共變量direction來實作,當鍵盤按不同的上下左右鍵時修改公共變量direction就達到了玩家控制小蛇方向的問題。

4、如何判定遊戲結束?

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

如果腦子裡想的是“蛇”動的畫面,那真的比較難了,但是放到代碼中,我們的“蛇”是一個清單,那麼隻要判斷下一格的坐标是否已經包含在“蛇”的清單中豈不就可以了?

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

應用知識點

1、python知識點

1.1 清單

遊戲開發本身就會用到很多面向對象的概念,而蛇的身體又是一個天然的“連結清單”結構,太适合用來練習資料結構了。

清單,資料類型list,list是python内置的一種進階資料類型。list是一種有序的集合,基于連結清單實作 在python中應用很廣泛,可以随時添加和删除其中的元素。在此遊戲中用于表是蛇身,由蛇頭,蛇身組成,吃個食物,蛇身增加一段,即應用清單添加一個蛇身圖檔。蛇身的移動,用到了清單的添加與删除功能。len()可以獲得清單長度。用索引來通路list中每一個位置的元素,記得索引是從0開始的,也可以用負數,表示從-1表示清單最後一個。

append()在清單未尾增加一個元素

如:Snake.append(snakebody) # 把蛇身加入清單中

del 删除最後一個元素

del Snake[len(Snake)-1] # 删除舊蛇尾

也可用 del Snake[-1]

在指定位置增加元素用insert()

如:Snake.insert(0, newSnakeHead) # 把新蛇頭加到清單的最前面

1.2 time 時間子產品

屬于Python的時間子產品。基本上,這會增加執行延遲,并且隻會暫停目前線程,而不會暫停整個程式。

Python的time子產品中提供了Python time.sleep()函數。在使用此Python函數之前,您需要使用以下指令導入此子產品:import time

導入此子產品後,即可使用time.sleep()函數。文法如下:

句法:睡眠(秒),如您所見,它需要一個參數,即秒。在執行過程中,這基本上會引起這麼多秒的延遲,此遊戲中應用到sleep(0.2),讓遊戲更新時暫緩0.2秒,通過此參數可以調試蛇的移動速度。

1.3 random子產品

random() 方法傳回随機生成的一個實數,它在[0,1)範圍内

import random

random.random()

#randint函數,傳回指定範圍的一個随機整數,包含上下限

random.randint(0,99)#傳回0~99之間的整數

2、pygamezero知識點

Pygame Zero這個神器,它對PyGame做了很多封裝,避免寫很多枯燥的架構代碼,讓初學者可以更專注于遊戲核心邏輯,容易上手。

2.1 遊戲角色Acto

遊戲角色Actor pgzero中所有以圖檔顯示的元素都是Actor類來定義,如snakebody = Actor(‘snake2’) # 導入蛇身方塊圖檔。也可以了解為Actor是用來代表一個你繪制到螢幕的圖形。

通過把字元串 ‘snake2’ 作為參數傳遞給 Actor 類,Pygame Zero自動加載了外星人精靈,并且圖檔具有位置和大小屬性。snake2是指images檔案夾下snake2.png圖檔。也可以apple = Actor(‘apple’,(200,300)) # 設定圖檔apple的位置。連圖檔帶位置一起指定。

一個免費的png圖檔下載下傳網站:https://kenney.nl/assets/page:3?q=2d

2.2 輸出中文字型

顯示中文 準備:在.py同級目錄下建立fonts檔案夾,并放入支援中文的字型檔案simhei.ttf

if isclose: # 顯示遊戲失敗資訊

screen.draw.text(“遊戲失敗!”, (120, HEIGHT/2-100),

fontsize=100, fontname=‘simhei’, color=‘yellow’)

2.3鍵盤控制

from pgzero.keyboard import keys, Keyboard

可以查詢下原碼,通過keys.w,keyboard.left等進行控制

功能截圖

學生學python程式設計---實作貪吃蛇小遊戲+源碼
學生學python程式設計---實作貪吃蛇小遊戲+源碼

代碼實作

1、蛇的表示

學生學python程式設計---實作貪吃蛇小遊戲+源碼
import pgzrun # 導入遊戲庫
TILE_SIZE = 30 # 小蛇方塊的大小,20×20
WIDTH = 20*TILE_SIZE # 設定視窗的寬度為800
HEIGHT = 20*TILE_SIZE # 設定視窗的高度為600

snkaeHead = Actor('snake1') # 導入蛇頭方塊圖檔
snkaeHead.x = WIDTH/2 # 蛇頭方塊圖檔的x坐标
snkaeHead.y = HEIGHT/2 # 蛇頭方塊圖檔的y坐标

Snake = [] # 存儲蛇的清單
Snake.append(snkaeHead) # 把蛇頭加入清單中
for i in range(4): # 再為蛇添加4段蛇身
    print(i)
    snakebody = Actor('snake2') # 導入蛇身方塊圖檔
    snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方塊圖檔的x坐标
    snakebody.y = Snake[i].y # 蛇身方塊圖檔的y坐标
    Snake.append(snakebody) # 把蛇身加入清單中

def draw(): # 繪制子產品,每幀重複執行
    screen.clear() # 每幀清除螢幕,便于重新繪制
    for snkaebody in Snake: # 繪制蛇
        snkaebody.draw()

pgzrun.go() # 開始執行遊戲
           

2、蛇的前進移動

蛇一直向右移動,直至完全走出螢幕

direction = 'right'
def update(): # 更新子產品,每幀重複操作
    newSnakeHead = Actor('snake1') # 建立新蛇頭的圖檔    
    # 根據direction變量設定新蛇頭的坐标    # 如小蛇向下移動,就在舊蛇頭的下邊
    if direction == 'right': # 小蛇向右移動
        newSnakeHead.x = Snake[0].x + TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'left': # 小蛇向左移動
        newSnakeHead.x = Snake[0].x - TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'up': # 小蛇向上移動
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y - TILE_SIZE
    if direction == 'down': # 小蛇向下移動
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y + TILE_SIZE

    Snake.insert(0, newSnakeHead) # 把新蛇頭加到清單的最前面
    Snake[1].image='snake2'
    del Snake[len(Snake)-1] # 删除舊蛇尾
           

3、控制移動方向

學生學python程式設計---實作貪吃蛇小遊戲+源碼
def update(): # 更新子產品,每幀重複操作
    global direction,isclose
    if keyboard.left: # 如果按下鍵盤向左方向鍵
        direction = 'left' # 小蛇要向左移
    if keyboard.right: # 如果按下鍵盤向右方向鍵
        direction = 'right' # 小蛇要向右移
    if keyboard.up: # 如果按下鍵盤向上方向鍵
        direction = 'up' # 小蛇要向上移
    if keyboard.down: # 如果按下鍵盤向下方向鍵
        direction = 'down' # 小蛇要向下移
           

4、遊戲失敗

學生學python程式設計---實作貪吃蛇小遊戲+源碼
# 當小蛇(新蛇頭)超出邊框時,遊戲失敗
    if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT  or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:
        isclose = True
    def draw(): # 繪制子產品,每幀重複執行
    screen.clear() # 每幀清除螢幕,便于重新繪制
    for snkaebody in Snake: # 繪制蛇
        snkaebody.draw()
    # 顯示中文    準備:在.py同級目錄下建立fonts檔案夾,并放入支援中文的字型檔案simhei.ttf
    if isclose: # 顯示遊戲失敗資訊
        screen.draw.text("遊戲失敗!", (120, HEIGHT/2-100),
                         fontsize=100, fontname='simhei', color='yellow')     
           

5、食物的随機出現

當小蛇頭碰到食物時,不處理,也就是長度+1;青蛙重新在随機位置出現;

if newSnakeHead.x == food.x and newSnakeHead.y == food.y:
        food.x = random.randint(5, 20) * TILE_SIZE
        food.y = random.randint(5, 20) * TILE_SIZE
        score = score + 1  # 得分加1
           

6、遊戲得分

設定公共變量score,當小蛇吃到食物時,score值加1,更新時螢幕顯示出得分,用如下語句。

screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,
                    fontname='simhei', color='white')
           

總結

這次我們主要制作了貪吃蛇遊戲,了解了time子產品的sleep函數、clock子產品的schedule等功能,學習了清單的插入函數、break與continue語句、函數的定義與調用等知識點。讀者可以嘗試在本章代碼的基礎上繼續改進:1.實作得分越來越高,遊戲速度越來越快的效果;2.實作蛇頭、蛇身不同顔色的顯示效果;

源碼擷取

可關注部落客後,私聊部落客免費擷取

需要技術指導,育娃新思考,企業軟體合作等更多服務請聯系部落客

今天是以此模闆持續更新此育兒專欄的第 29 /50個。

可以關注我,點贊我、評論我、收藏我啦。