Python编写微信打飞机小游戏(十二)
最后更新于:2022-04-01 14:23:16
在这篇博客里,我们为游戏添加最后一个功能: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)