Skip to content

Commit 113d76c

Browse files
committed
feat:evfs施工中
1 parent a178456 commit 113d76c

File tree

9 files changed

+669
-354
lines changed

9 files changed

+669
-354
lines changed

src/gameSettings.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def __init__(self, mainWindow):
2828
self.unique_identifier = self.game_setting.value('DEFAULT/unique_identifier', None, str)
2929
self.country = self.game_setting.value('DEFAULT/country', None, str)
3030
self.autosave_video = self.game_setting.value('DEFAULT/autosave_video', None, bool)
31+
self.autosave_video_set = self.game_setting.value('DEFAULT/autosave_video_set', None, bool)
3132
self.filter_forever = self.game_setting.value('DEFAULT/filter_forever', None, bool)
3233
self.end_then_flag = self.game_setting.value('DEFAULT/end_then_flag', None, bool)
3334
self.cursor_limit = self.game_setting.value('DEFAULT/cursor_limit', None, bool)
@@ -88,6 +89,7 @@ def setParameter(self):
8889
self.checkBox_auto_replay.setChecked(self.auto_replay >= 0)
8990
self.checkBox_auto_notification.setChecked(self.auto_notification)
9091
self.checkBox_autosave_video.setChecked(self.autosave_video)
92+
self.checkBox_autosave_video_set.setChecked(self.autosave_video_set)
9193
self.checkBox_filter_forever.setChecked(self.filter_forever)
9294
self.lineEdit_constraint.setText(self.board_constraint)
9395
self.spinBox_attempt_times_limit.setValue (self.attempt_times_limit)
@@ -127,6 +129,7 @@ def processParameter(self):
127129
self.unique_identifier = self.lineEdit_unique_label.text()
128130
self.country = self.comboBox_country.currentText()
129131
self.autosave_video = self.checkBox_autosave_video.isChecked()
132+
self.autosave_video_set = self.checkBox_autosave_video_set.isChecked()
130133
self.filter_forever = self.checkBox_filter_forever.isChecked()
131134
self.board_constraint = self.lineEdit_constraint.text()
132135
self.attempt_times_limit = self.spinBox_attempt_times_limit.value()

src/mineSweeperGUI.py

Lines changed: 65 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from country_name import country_name
2525
import metaminesweeper_checksum
2626
from mainWindowGUI import MainWindow
27+
from datetime import datetime
2728

2829

2930
class 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"])

src/minesweeper_master.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,7 @@ def choose_3BV_laymine(laymine):
3232
else:
3333
success_flag = True
3434

35-
constraints = {
36-
"sin": math.sin,
37-
"tan": math.tan,
38-
"cos": math.cos,
39-
"log": math.log,
40-
} # 也许还要加row, column, mine_num, level, mode
35+
constraints = {}
4136
wrapper_b = ms.Board(b)
4237
if "bbbv" in board_constraint:
4338
constraints.update({"bbbv": wrapper_b.bbbv})
@@ -522,11 +517,7 @@ def main():
522517

523518
# print2(enumerateChangeBoard2(board, game_board, [(2, 3), (3, 2), (2, 2)])[0])
524519

525-
constraints = {
526-
"sin": math.sin,
527-
"tan": math.tan,
528-
"cos": math.cos,
529-
} # 也许还要加row, column, mine_num, level, mode
520+
constraints = {}
530521
board_constraint="all([1,2,3])"
531522
if "bbbv" in board_constraint:
532523
constraints.update({"bbbv": 120})

src/superGUI.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ def read_or_create_game_setting(self):
499499
self.unique_identifier = self.game_setting.get_or_set_value("DEFAULT/unique_identifier", "", str)
500500
self.country = self.game_setting.get_or_set_value("DEFAULT/country", "", str)
501501
self.autosave_video = self.game_setting.get_or_set_value("DEFAULT/autosave_video", True, bool)
502+
self.autosave_video_set = self.game_setting.get_or_set_value("DEFAULT/autosave_video_set", True, bool)
502503
self.filter_forever = self.game_setting.get_or_set_value("DEFAULT/filter_forever", False, bool)
503504
self.language = self.game_setting.get_or_set_value("DEFAULT/language", "en_US", str)
504505
self.end_then_flag = self.game_setting.get_or_set_value("DEFAULT/end_then_flag", True, bool)

src/ui/ui_gameSettings.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Ui_Form(object):
1515
def setupUi(self, Form):
1616
Form.setObjectName("Form")
1717
Form.setWindowModality(QtCore.Qt.NonModal)
18-
Form.resize(554, 605)
18+
Form.resize(554, 644)
1919
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
2020
sizePolicy.setHorizontalStretch(0)
2121
sizePolicy.setVerticalStretch(0)
@@ -368,6 +368,15 @@ def setupUi(self, Form):
368368
self.checkBox_autosave_video.setStyleSheet("")
369369
self.checkBox_autosave_video.setObjectName("checkBox_autosave_video")
370370
self.verticalLayout_5.addWidget(self.checkBox_autosave_video)
371+
self.checkBox_autosave_video_set = QtWidgets.QCheckBox(self.frame_4)
372+
self.checkBox_autosave_video_set.setMinimumSize(QtCore.QSize(0, 32))
373+
self.checkBox_autosave_video_set.setMaximumSize(QtCore.QSize(16777215, 32))
374+
font = QtGui.QFont()
375+
font.setFamily("微软雅黑")
376+
font.setPointSize(12)
377+
self.checkBox_autosave_video_set.setFont(font)
378+
self.checkBox_autosave_video_set.setObjectName("checkBox_autosave_video_set")
379+
self.verticalLayout_5.addWidget(self.checkBox_autosave_video_set)
371380
self.checkBox_filter_forever = QtWidgets.QCheckBox(self.frame_4)
372381
self.checkBox_filter_forever.setMinimumSize(QtCore.QSize(0, 32))
373382
font = QtGui.QFont()
@@ -654,6 +663,7 @@ def retranslateUi(self, Form):
654663
self.label_country.setText(_translate("Form", "国家或地区:"))
655664
self.checkBox_autosave_video.setToolTip(_translate("Form", "完成后自动将录像保存到replay文件夹下"))
656665
self.checkBox_autosave_video.setText(_translate("Form", "自动保存录像(推荐)"))
666+
self.checkBox_autosave_video_set.setText(_translate("Form", "自动保存录像集"))
657667
self.checkBox_filter_forever.setToolTip(_translate("Form", "勾选后永远使用筛选法埋雷,否则会适时改用调整法"))
658668
self.checkBox_filter_forever.setText(_translate("Form", "永远使用筛选法埋雷(不推荐)"))
659669
self.checkBox_end_then_flag.setText(_translate("Form", "结束后标雷"))

0 commit comments

Comments
 (0)