顯示分數 - LanKuDot/MLGame GitHub Wiki

本章節將在遊戲中加入顯示分數的功能。

計分

當蛇吃到食物時,就可以得到分數。而在 gamecore.py 中會判斷蛇是否吃到食物,因此在這邊紀錄分數。在 Scene 類別中加入屬性 score 來記錄分數。在 update() 中當蛇吃到食物時,會得到一分:

class Scene:
    def __init__(self):
        ...

        self.score = 0

    def update(self, action):
        ...

        if self._snake.head_pos = self._food.pos:
            self.score += 1
            ...

        ...

而當場景重置時,也要把分數歸零。

    def reset(self):
        self.score = 0
        ...

在終端機顯示分數

當遊戲結束時,輸出總得分訊息到終端機上,告知玩家得了多少分。更新 snake.py,在遊戲結束時,輸出分數:

if __name__ == "__main__":
    ...
    while is_running:
        ...

        if game_status == "GAME_OVER":
            print("Score: {}".format(scene.score))
            scene.reset()

增加畫布空間

接著在遊戲的畫布下方增加一個空間用來顯示分數在畫面上。修改 snake.py 中建立視窗畫布的程式碼,讓畫布多 25 像素的空間:

    screen = pygame.display.set_mode(
        (Scene.area_rect.width, Scene.area_rect.height + 25))

另外要讓多出來的空間的背景顏色與遊戲區域有差別,否則下方的遊戲邊界會看不出來:

    while is_running:
        ...

        # Draw the scene
        screen.fill((50, 50, 50))
        screen.fill((0, 0, 0), Scene.area_rect)
        scene.draw_gameobjects(screen)
        pygame.display.flip()

這邊先在畫布填上灰色,再用 Scene.area_rect 來指定在遊戲區域填上黑色,藉此區隔兩個區域。pygame.surface.fill() 的第二個參數是一個可選的參數,傳入一個 rect,用來指定要填滿的區域的大小與位置。

繪製分數文字

利用 pygame.font 將分數文字繪製到畫布上。

建立文字

先在 snake.py 中,在設置完視窗畫布後完後建立文字物件:

if __name__ == "__main__":
    ...

    # Initialize font module
    pygame.font.init()
    font = pygame.font.Font(None, 22)
    font_pos = (1, Scene.area_rect.height + 5)

    clock = pygame.time.Clock()
    ...

建立一個 Font 物件存到 font 中,第一個參數指定字型,如果字型指定為 None 則使用 pygame 預設的字型,而第二個參數指定文字大小為 22 像素高。要注意的是,實際輸出的文字不一定會是 22 像素高,像是等等要輸出的「Score」只有 16 像素高,可以用 pygame.font.Font.size() 來查看要輸出的文字會佔多大的空間。

fons_pos 用來指定文字繪製到畫布上的位置,用一個 tuple 來表示 xy 座標,可以依照喜好調整位置,這裡指定從距離左邊界 1 像素、距離遊戲區域 5 像素的位置開始畫。

繪製分數

接著在繪製遊戲畫面後,也繪製分數:

        ...
        scene.draw_gameobjects(screen)

        # Draw score
        font_surface = font.render(
            "Score: {}".format(scene.score), True, (255, 255, 255))
        screen.blit(font_surface, font_pos)

        pygame.display.flip()

先使用 pygame.font.Font.render() 來產生一個含有指定文字的畫布(surface),三個參數依序為:文字內容、反鋸齒、文字顏色。再利用 pygame.Surface.blit() 將產生的文字畫布繪製到遊戲視窗畫布上。

執行遊戲

一個基本的貪食蛇遊戲就完成了~

Imgur