2424from country_name import country_name
2525import metaminesweeper_checksum
2626from mainWindowGUI import MainWindow
27+ from datetime import datetime
2728
2829
2930class MineSweeperGUI (superGUI .Ui_MainWindow ):
@@ -211,29 +212,33 @@ def game_state(self):
211212 @game_state .setter
212213 def game_state (self , game_state : str ):
213214 # print(self._game_state, " -> " ,game_state)
214- if self ._game_state in ("playing" , "show" , "joking" ) and \
215- game_state not in ("playing" , "show" , "joking" ):
216- self .timer_10ms .stop ()
217- self .unlimit_cursor ()
218- elif self ._game_state in ("display" , "showdisplay" ) and \
219- game_state not in ("display" , "showdisplay" ):
220- self .timer_video .stop ()
221- self .ui_video_control .QWidget .close ()
222- self .label .paint_cursor = False
223- self .set_country_flag ()
224- self .score_board_manager .with_namespace ({
225- "checksum_ok" : "--" ,
226- "is_official" : "--" ,
227- "is_fair" : "--" ,
228- "mode" : self .gameMode ,
229- "row" : self .row ,
230- "column" : self .column ,
231- "minenum" : self .minenum ,
232- })
233- self .score_board_manager .show (self .label .ms_board , index_type = 1 )
234-
235- elif self ._game_state == 'study' :
236- self .num_bar_ui .QWidget .close ()
215+ match self ._game_state :
216+ case "playing" | "joking" :
217+ if game_state not in ("playing" , "show" , "joking" ):
218+ self .timer_10ms .stop ()
219+ self .unlimit_cursor ()
220+ case "show" :
221+ if game_state not in ("playing" , "show" , "joking" ):
222+ self .timer_10ms .stop ()
223+ self .unlimit_cursor ()
224+ case "display" | "showdisplay" :
225+ if game_state not in ("display" , "showdisplay" ):
226+ self .timer_video .stop ()
227+ self .ui_video_control .QWidget .close ()
228+ self .label .paint_cursor = False
229+ self .set_country_flag ()
230+ self .score_board_manager .with_namespace ({
231+ "checksum_ok" : "--" ,
232+ "is_official" : "--" ,
233+ "is_fair" : "--" ,
234+ "mode" : self .gameMode ,
235+ "row" : self .row ,
236+ "column" : self .column ,
237+ "minenum" : self .minenum ,
238+ })
239+ self .score_board_manager .show (self .label .ms_board , index_type = 1 )
240+ case "study" :
241+ self .num_bar_ui .QWidget .close ()
237242 self ._game_state = game_state
238243
239244
@@ -709,7 +714,6 @@ def gameRestart(self, e=None): # 画界面,但是不埋雷,改数据而不
709714 # self.label.setMouseTracking(False) # 鼠标未按下时,组织移动事件回调
710715
711716 # 游戏结束画残局,改状态
712-
713717 def gameFinished (self ):
714718 if self .label .ms_board .game_board_state == 3 and self .end_then_flag :
715719 self .label .ms_board .win_then_flag_all_mine ()
@@ -722,11 +726,15 @@ def gameFinished(self):
722726 self .score_board_manager .with_namespace ({
723727 "is_official" : self .is_official (),
724728 "is_fair" : self .is_fair (),
725- "row" : self .row ,
726- "column" : self .column ,
727- "minenum" : self .minenum ,
729+ # "row": self.row,
730+ # "column": self.column,
731+ # "minenum": self.minenum,
728732 })
729- self .score_board_manager .show (self .label .ms_board , index_type = 2 )
733+ self .label .ms_board .analyse_for_features (["high_risk_guess" , "jump_judge" ,
734+ "needless_guess" ,"mouse_trace" ,
735+ "vision_transfer" , "survive_poss" ])
736+
737+ self .score_board_manager .show (self .label .ms_board , index_type = 3 )
730738 self .enable_screenshot ()
731739 self .unlimit_cursor ()
732740
@@ -745,7 +753,7 @@ def gameWin(self): # 成功后改脸和状态变量,停时间
745753 if self .autosave_video and self .checksum_module_ok ():
746754 self .dump_evf_file_data ()
747755 self .save_evf_file ()
748-
756+
749757 self .gameFinished ()
750758
751759 # 尝试弹窗,没有破纪录则不弹
@@ -760,7 +768,6 @@ def checksum_module_ok(self):
760768 # '590028493bb58a25ffc76e2e2ad490df839a1f449435c35789d3119ca69e5d4f'
761769
762770 # 搜集数据,生成evf文件的二进制数据,但是不保存
763-
764771 def dump_evf_file_data (self ):
765772 if isinstance (self .label .ms_board , ms .BaseVideo ):
766773 self .label .ms_board .use_question = False # 禁用问号是共识
@@ -801,7 +808,6 @@ def dump_evf_file_data(self):
801808 # 将evf数据存成evf文件
802809 # 调试的时候不会自动存录像,见checksum_module_ok
803810 # 菜单保存的回调。以及游戏结束自动保存。
804-
805811 def save_evf_file (self ):
806812 if not os .path .exists (self .replay_path ):
807813 os .mkdir (self .replay_path )
@@ -833,6 +839,19 @@ def save_evf_file(self):
833839 file_name += "_fake"
834840
835841 self .label .ms_board .save_to_evf_file (file_name )
842+
843+ # 保存evfs文件。先保存后一个文件,再删除前一个文件。
844+ def save_evfs_file (self ):
845+ now = datetime .now ()
846+ date_str = now .strftime ("%Y%m%d" )
847+ file_name = self .replay_path + '\\ ' + self .label .ms_board .player_identifier + \
848+ "_" + date_str + "_" + str (self .evfs .len ())
849+ self .evfs .save_evfs_file (file_name )
850+ try :
851+ os .remove (self .old_evfs_filename )
852+ except Exception as e :
853+ ...
854+ self .old_evfs_filename = file_name
836855
837856 def gameFailed (self ): # 失败后改脸和状态变量
838857 self .timer_10ms .stop ()
@@ -1013,6 +1032,12 @@ def try_record_pop(self):
10131032 ui .label_16 .setText (mode_text )
10141033 ui .Dialog .show ()
10151034 ui .Dialog .exec_ ()
1035+
1036+
1037+ # 根据条件是否满足,尝试追加evfs文件
1038+ def try_append_evfs (self ):
1039+ ...
1040+
10161041
10171042 def showMineNum (self , n ):
10181043 # 显示剩余雷数,雷数大于等于0,小于等于999,整数
@@ -1198,6 +1223,7 @@ def action_NEvent(self):
11981223 self .country = ui .country
11991224 self .set_country_flag ()
12001225 self .autosave_video = ui .autosave_video
1226+ self .autosave_video_set = ui .autosave_video_set
12011227 self .filter_forever = ui .filter_forever
12021228
12031229 self .board_constraint = ui .board_constraint
@@ -1220,7 +1246,7 @@ def action_NEvent(self):
12201246 self .predefinedBoardPara [0 ]['gamemode' ] = ui .gameMode
12211247
12221248 self .score_board_manager .with_namespace ({
1223- "race_identifier" : ui .race_identifier ,
1249+ # "race_identifier": ui.race_identifier,
12241250 "mode" : self .gameMode ,
12251251 # "row": self.row,
12261252 # "column": self.column,
@@ -1352,6 +1378,8 @@ def screenShot(self):
13521378 self .label .boardProbability = ans [0 ]
13531379
13541380 self .label .update ()
1381+ self .evfs = ms .Evfs ()
1382+ self .old_evfs_filename = ""
13551383 # self.label.setMouseTracking(True)
13561384
13571385 self .minimumWindow ()
@@ -1421,18 +1449,16 @@ def mineKeyReleaseEvent(self, keyName):
14211449 if self .game_state == 'show' :
14221450 self .game_state = 'joking'
14231451 self .label .paintProbability = False
1424- # self.label.setMouseTracking(False)
14251452 self .label_info .setText (self .player_identifier )
14261453 self .label .update ()
14271454 elif self .game_state == 'display' :
14281455 self .game_state = 'showdisplay'
14291456 self .label .paintProbability = True
1430- # self.label.setMouseTracking(True)
14311457 self .label .update ()
14321458 elif self .game_state == 'showdisplay' :
14331459 self .game_state = 'display'
14341460 self .label .paintProbability = False
1435- # self.label.setMouseTracking(False )
1461+ self .label_info . setText ( self . player_identifier )
14361462 self .label .update ()
14371463
14381464 def refreshSettingsDefault (self ):
@@ -1451,7 +1477,7 @@ def action_OpenFile(self, openfile_name=None):
14511477 if not openfile_name :
14521478 openfile_name = QFileDialog .\
14531479 getOpenFileName (self .mainWindow , '打开文件' , str (self .setting_path / 'replay' ),
1454- 'All(*.avf *.evf *.rmv *.mvf);;Arbiter video(*.avf);;Metasweeper video(*.evf);;Vienna MineSweeper video(*.rmv);;Minesweeper Clone 0.97(*.mvf)' )
1480+ 'All(*.avf *.evf *.rmv *.mvf *.evfs );;Arbiter video(*.avf);;Metasweeper video(*.evf);;Vienna MineSweeper video(*.rmv);;Minesweeper Clone 0.97(*.mvf);;Metasweeper video set(*.evfs )' )
14551481 openfile_name = openfile_name [0 ]
14561482 # 实例化
14571483 if not openfile_name :
@@ -1464,10 +1490,11 @@ def action_OpenFile(self, openfile_name=None):
14641490 elif openfile_name [- 3 :] == "rmv" :
14651491 video = ms .RmvVideo (openfile_name )
14661492 elif openfile_name [- 3 :] == "evf" :
1467- # evf版本过时以后会引发异常
14681493 video = ms .EvfVideo (openfile_name )
14691494 elif openfile_name [- 3 :] == "mvf" :
14701495 video = ms .MvfVideo (openfile_name )
1496+ elif openfile_name [- 3 :] == "evfs" :
1497+ video = ms .Evfs (openfile_name )
14711498 else :
14721499 return
14731500 except :
@@ -1498,7 +1525,7 @@ def play_video(self, video):
14981525 "mode" : video .mode ,
14991526 "row" : video .row ,
15001527 "column" : video .column ,
1501- "minenum" : video .minenum ,
1528+ "minenum" : video .mine_num ,
15021529 })
15031530 video .analyse_for_features (["high_risk_guess" , "jump_judge" , "needless_guess" ,
15041531 "mouse_trace" , "vision_transfer" , "survive_poss" ])
0 commit comments