Python隨身聽-源碼分析-經典小遊戲


週六了,讓我們一起讀點代碼放鬆一下吧!

今天要給大家看的代碼是一段遊戲的代碼,貪喫蛇。

遊戲動圖:

image

源碼

建議先仔細閱讀一下,然後再往後看 DE8UG 對源碼的分析。

from turtle import *
from random import randrange
from freegames import square, vector

food = vector(0, 0)
snake = [vector(10, 0)]
aim = vector(0, -10)

def change(x, y):
    "Change snake direction."
    aim.x = x
    aim.y = y

def inside(head):
    "Return True if head inside boundaries."
    return -200 < head.x < 190 and -200 < head.y < 190

def move():
    "Move snake forward one segment."
    head = snake[-1].copy()
    head.move(aim)

    if not inside(head) or head in snake:
        square(head.x, head.y, 9, 'red')
        update()
        return

    snake.append(head)

    if head == food:
        print('Snake:', len(snake))
        food.x = randrange(-15, 15) * 10
        food.y = randrange(-15, 15) * 10
    else:
        snake.pop(0)

    clear()

    for body in snake:
        square(body.x, body.y, 9, 'black')

    square(food.x, food.y, 9, 'green')
    update()
    ontimer(move, 100)

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
onkey(lambda: change(10, 0), 'Right')
onkey(lambda: change(-10, 0), 'Left')
onkey(lambda: change(0, 10), 'Up')
onkey(lambda: change(0, -10), 'Down')
move()
done()

運行

複製上述代碼到一個 py 爲後綴的文件,命名 snake.py.

在文件所在目錄打開控制檯:運行pip install freegames,然後運行python snake.py

分析

這個遊戲代碼是一個第三方庫 freegames 的一部分。從最上面導入依賴部分可以看出,主要是依賴於 turtle 這個庫。

from turtle import *的最後是個*,表示導入了 turtle 裏面所有東西,一般是不建議導入太多內容的,一是可能加載太多沒用的代碼,二是可能出現同名的類或函數。目前這只是個小遊戲,後面也用到不少 turtle 裏面的函數,所以這麼寫勉強可以接受。

往下看,整個代碼用到很多函數,只要是 import 沒有明確導入的,以及非本 python 文件寫的函數,其實都是這個*帶來的 turtle 內部函數了。如果你不知道神馬意思,記得我我課程裏介紹過超全的在線文檔嗎?https://devdocs.io,你只需要搜一下turtle就可以看到相關解釋了。

導入依賴部分還導入了 freegames 庫裏面一些工具類和函數:from freegames import square, vector,看單詞就可以知道一個畫框框,表示蛇以及食物。一個是個向量,用來表示座標。

接下來是向量表示的食物 food,向量列表表示的蛇 snake,以及表示移動目標的 aim。

貪喫蛇,顧名思義是一個貪喫的蛇,當然要四處遊動,且添加一些限制。所以有了函數 change,inside 和 move。分別表示根據箭頭移動,判斷是座標是否合法,以及移動。

最複雜的是移動函數。這裏的邏輯流程爲:取到蛇頭,走一個位置 aim,判斷座標是否合法,不合法標紅並退出,合法繼續往後走。給蛇追加新的蛇頭座標,這時候需要判斷是否喫到食物,即座標相同,相同則繪製新蛇頭,否則彈出剛剛追加的座標。接下來用 clear 清理屏幕,繪製整條蛇和新的食物。更新一下,然後 ontimer 定時繼續移動的操作。

最後一大段代碼主要是設置繪圖環境,添加鍵盤的移動響應。在 onkey 函數裏用了 lambda 函數綁定了最上面的 change 函數,修改不同方向移動後的 aim 座標。

接下來就是啓動遊戲,開始玩了 😊

ok,這就是本週六的源碼分析了,祝你閱讀愉快。
目前在 Python 隨身聽的微信欄目裏,已經從週一到週日安排了:技術精選,基礎學習,Python 練習,項目連載,難點問答,源碼分析,DE8UG 雜談這些欄目,歡迎圍觀。有任何想法建議疑問歡迎留言,明天見~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章