前言
打脸了,忘记了这部分,还以为自己的外星人项目已经结束了。
这部分主要是讲如何使用json文件保存我们的等级、得分、最高分等等的游戏数据。
之前有一个写如何保存最高分的博客,这次我们进行了一些改进。
逻辑:
- 用户点击’q’或者关闭窗口时,我们将此时的stats数据(主要是得分、等级、剩余飞船数等)以及设置中的部分数据(飞船、外星人的移动速度,这些和等级有关)写入json文件。
- 在点击play按钮后我们采用另外一个选项框来让用户进行选择,可以读取json文件的数据继续游戏,也可以重新开始。
json文件格式
整个文件是用花括号包起来的,和py的字典差不多,不过key只能用双引号包起来(py中字典的key单双引号都行)
运行生成的json文件:
当然还有其他的格式,比如这个vscode生成的json文件:
字典中的value有列表,列表的元素还是字典……
注意最里层的也是双引号
写入json
首先找到需要写入的位置,"q"按钮和关闭窗口,都在我们的事件函数部分。
写入的话,我们直接采用w方法(各种方法的功能、区别讲解看上面的博客),因为之前的文件已经不需要再使用了。
首先我们需要导入json包:
import json
写入的方法为dump(内容,文件变量)
with open('./alien/memory.json',"w") as m:
memory = {
"high_score":stats.high_score,
"ships_left":stats.ships_left,
"score":stats.score,
"level":stats.level,
"big_bullet":stats.big_bullet,
"alien_speed_factor":ai_settings.alien_speed_factor,
"ship_speed_factor":ai_settings.ship_speed_factor,
"bullet_speed_factor":ai_settings.bullet_speed_factor,
"alien_points":ai_settings.alien_points
}
json.dump(memory,m)
可能看到了那个奇奇怪怪的文件路径,这个我也在上面的博客中提到过,因为我们希望能在模块同一层中显示,所以才选择了这样的路径。
在两处的sys.exit之前添加:
开始逻辑
状态
在前言中,我简单讲了一下我想要的效果,点击play,进入下一个选项,然后就可以开始游戏。
也就是之前的双阶段游戏(点击play和没点击)被我分成了三部分,第一部分点击play按钮,第二部分为是否(我叫yon模块),第三部分是游戏开始。
所以我将game_stats中的game_activate改为了0。
没错,剩下的两个状态就是1和2。
这部分的想法主要是因为之前写过数逻的状态机,所以采用了类似的方法
。
新按钮模块
因为之前的按钮模块已经成了一个体系,不方便继续修改,我就自己又添加了一个模块,用来显示选项,长这样:(好叭已经听到有人骂它丑了)
模块叫做yon.py(yes or not)
import pygame.font
class YON():
def __init__(self,screen):
self.screen = screen
self.screen_rect = screen.get_rect()
self.text_color = (255,255,255)
self.font = pygame.font.SysFont(