在這篇博客里,我們為游戲添加最后一個功能:GameOver畫面的繪制。
在當我方飛機的三條命全部掛掉之后,程序會進入結束程序,我們的設計時當程序結束時顯示用戶的目前得分以及歷史最高分,僅此而已。
1、加載圖片資源
在這里我們特意重做了一個游戲結束的畫面,其實就是在背景圖片上加了一些文字而已,首先在main()函數中加載它:
~~~
gameover_image = pygame.image.load("image/game_over.png") # 游戲結束背景圖片
gameover_rect = gameover_image.get_rect()
~~~
2、保存并顯示歷史最高分
程序要求能夠保存用戶所得到的歷史最高分,這就要求程序在每一次結束前,都需要將用戶的得分保存在磁盤上。首先我們在程序目錄下新建一個文本文件“score_record.txt”來保存用戶的得分,注意在新建完文本文件時我們需要在文件中輸入一個數字“0”并保存,代表當前用戶得分為零分,否則的話當程序第一次運行讀取這個文件的話將會因為文件內容為空而讀取失敗,當然我們完全可以在程序中添加判斷語句來避免這種情況,這里我們就采用一個投機取巧的方法,在創建文本文件時直接先給它一個零值。
接下來當我方小飛機生命用盡時,程序會進入到“elif life_num == 0:”的循環分支中,之前這里只是用一個“pass”語句一帶而過,這里開始擴充這部分代碼。首先,繪制結束畫面并關閉所有的音效以及定時器:
~~~
screen.blit(gameover_image, gameover_rect)
pygame.mixer.music.stop() # 關閉背景音樂
pygame.mixer.stop() # 關閉所有音效
pygame.time.set_timer(supply_timer, 0) # 關閉補給機制
~~~
接下來的工作就是讀入“score_record.txt”文件中保留的用戶歷史最高分數,并和當前的用戶得分進行比較,如果當前用戶得分高于歷史最高分,則將文本文件中保留的歷史最高分替換掉:
~~~
with open("score_record.txt", "r") as f:
record_score = int(f.read())
if score > record_score: # 如果玩家得分大于歷史最高分,則將當前分數存檔
with open("score_record.txt", "w") as f:
f.write(str(score))
~~~
這里涉及到最簡單的Python讀取文件的操作,不懂得地方大家可以從網上查閱相關資料,這里就不再贅述。替換完成后,將歷史最高分和當前最高分顯示在結束畫面上,字體仍借用之前的分數字體“score_font”對象即可:
~~~
record_score_text = score_font.render("%d" % record_score, True, color_white)
screen.blit(record_score_text, (150, 25))
game_over_score_text = score_font.render("%d" % score, True, color_white)
screen.blit(game_over_score_text, (180, 370))
~~~
這里兩個字體的擺放位置時根據背景圖片上的文字而定的,運行程序,一切正常。
3、最后一個BUG
其實程序到這里已經完全能夠運行了,但這里仍然有一個不太完美的地方:就是當GameOver后,程序會不停的循環執行life_num = 0部分的代碼,這就導致程序會不停的打開和關閉txt文件,這完全是沒有必要的,只需在程序結束時check一次txt文件中的內容就夠了,為此我們在主函數中設置一個標志位用來表示當前文件的打開狀態:
~~~
flag_recorded = False # 是否已經打開記錄文件標志位
~~~
然后在打開文件后,將其置為true,并且在打開文件前對其進行判斷:
~~~
elif life_num == 0: # 生命值為零,繪制游戲結束畫面
# 關閉補給機制及音效
if not flag_recorded: # 讀取歷史最高分
flag_recorded = True
# 如果玩家得分大于歷史最高分,則將當前分數存檔
~~~
ok,運行程序,一切正常,我們的打飛機游戲至此已經全部編寫完成,由于博客所講的代碼比較零散,稍后我會上傳一份完整的、添加詳細注釋的代碼,這是我的第一個Python程序,歡迎大家指正,謝謝。
[完整代碼](http://download.csdn.net/detail/u013088062/9280087)