顯示分數 - 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()
將產生的文字畫布繪製到遊戲視窗畫布上。
執行遊戲
一個基本的貪食蛇遊戲就完成了~