From bcb015660aa4c768e17b59f3019fc2f4241d4e2a Mon Sep 17 00:00:00 2001 From: wszqkzqk Date: Sat, 23 Jul 2022 14:27:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/constants.py | 14 ++++++++++++-- source/state/level.py | 19 +++++++++++++++++-- source/tool.py | 25 ++++++++++++++++++++++--- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/source/constants.py b/source/constants.py index 6f8b044..ea6f666 100755 --- a/source/constants.py +++ b/source/constants.py @@ -1,7 +1,9 @@ -# 冒险模式起始关卡 +# 游戏起始关卡 START_LEVEL_NUM = 1 -# 小游戏模式起始关卡 START_LITTLE_GAME_NUM = 1 +# 游戏模式完成次数 +START_LEVEL_COMPLETIONS = 0 +START_LITTLEGAME_COMPLETIONS = 0 # 游戏速度倍率(调试用) GAME_RATE = 1 @@ -79,6 +81,8 @@ LEVEL_PROGRESS_FLAG = 'LevelProgressFlag' CURRENT_TIME = 'current time' LEVEL_NUM = 'level num' LITTLEGAME_NUM = 'littleGame num' +LEVEL_COMPLETIONS = 'level completions' +LITTLEGAME_COMPLETIONS = 'littleGame completions' # 整个游戏的状态 MAIN_MENU = 'main menu' @@ -643,5 +647,11 @@ SLEEP = 'sleep' CHOOSE = 'choose' PLAY = 'play' +# 记录本地存储文件需要记录哪些内容 +USERDATA_KEYS = { LEVEL_NUM, LITTLEGAME_NUM, + LEVEL_COMPLETIONS, + LITTLEGAME_COMPLETIONS, + } + # 无穷大常量 INF = float("inf") # python传递字符串性能较低,故在这里对inf声明一次,以后仅需调用即可 diff --git a/source/state/level.py b/source/state/level.py index 93de690..433a26c 100644 --- a/source/state/level.py +++ b/source/state/level.py @@ -47,17 +47,26 @@ class Level(tool.State): try: with open(file_path) as f: self.map_data = json.load(f) - except: + except FileNotFoundError: print("成功通关!") if self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: self.game_info[c.LEVEL_NUM] = c.START_LEVEL_NUM + self.game_info[c.LEVEL_COMPLETIONS] += 1 elif self.game_info[c.GAME_MODE] == c.MODE_LITTLEGAME: self.game_info[c.LITTLEGAME_NUM] = c.START_LITTLE_GAME_NUM + self.game_info[c.LITTLEGAME_COMPLETIONS] += 1 self.done = True self.next = c.MAIN_MENU pg.mixer.music.stop() pg.mixer.music.load(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "music", "intro.opus")) pg.mixer.music.play(-1, 0) + with open(os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json")), "w") as f: + userdata = {} + for i in self.game_info: + if i in c.USERDATA_KEYS: + userdata[i] = self.game_info[i] + savedata = json.dumps(userdata, sort_keys=True, indent=4) + f.write(savedata) return # 是否有铲子的信息:无铲子时为0,有铲子时为1,故直接赋值即可 self.hasShovel = self.map_data[c.SHOVEL] @@ -541,7 +550,6 @@ class Level(tool.State): elif self.checkMainMenuClick(mouse_pos): self.done = True self.next = c.MAIN_MENU - #self.persist = {c.CURRENT_TIME:0, c.LEVEL_NUM:c.START_LEVEL_NUM} # 应该不能用c.LEVEL_NUM:c.START_LEVEL_NUM self.persist = {c.CURRENT_TIME:0, c.LEVEL_NUM:self.persist[c.LEVEL_NUM], c.LITTLEGAME_NUM:self.persist[c.LITTLEGAME_NUM]} pg.mixer.music.stop() pg.mixer.music.load(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "music", "intro.opus")) @@ -1418,6 +1426,13 @@ class Level(tool.State): self.done = True # 播放胜利音效 pg.mixer.Sound(os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))) ,"resources", "sound", "win.ogg")).play() + with open(os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json")), "w") as f: + userdata = {} + for i in self.game_info: + if i in c.USERDATA_KEYS: + userdata[i] = self.game_info[i] + savedata = json.dumps(userdata, sort_keys=True, indent=4) + f.write(savedata) elif self.checkLose(): self.next = c.GAME_LOSE self.done = True diff --git a/source/tool.py b/source/tool.py index ee4f277..61e18d4 100755 --- a/source/tool.py +++ b/source/tool.py @@ -42,9 +42,28 @@ class Control(): self.state_dict = {} self.state_name = None self.state = None - self.game_info = {c.CURRENT_TIME:0, - c.LEVEL_NUM:c.START_LEVEL_NUM, - c.LITTLEGAME_NUM:c.START_LITTLE_GAME_NUM} + try: + # 存在存档即导入 + with open(os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json"))) as f: + userdata = json.load(f) + # 导入数据 + self.game_info = {c.CURRENT_TIME:0} # 时间信息需要新建 + self.game_info.update(userdata) + except FileNotFoundError: + # 不存在存档即新建 + userdata = {c.LEVEL_NUM:c.START_LEVEL_NUM, + c.LITTLEGAME_NUM:c.START_LITTLE_GAME_NUM, + c.LEVEL_COMPLETIONS:c.START_LEVEL_COMPLETIONS, + c.LITTLEGAME_COMPLETIONS:c.START_LITTLEGAME_COMPLETIONS + } + if not os.path.exists(os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz"))): + os.makedirs(os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz"))) + with open(os.path.expanduser(os.path.join("~", ".config", "wszqkzqk.dev", "pypvz", "userdata.json")), "w") as f: + savedata = json.dumps(userdata, sort_keys=True, indent=4) + f.write(savedata) + self.game_info = userdata + self.game_info[c.CURRENT_TIME] = 0 # 时间信息需要新建 + def setup_states(self, state_dict, start_state): self.state_dict = state_dict