Skip to content

Commit dc41d0d

Browse files
committed
fix:截屏计算概率bug、播放录像更稳定
1 parent 231593b commit dc41d0d

3 files changed

Lines changed: 56 additions & 48 deletions

File tree

src/main.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525

2626
# 最高优先级
27-
# 校验校验和模块
2827
# 计时器快捷键切换
2928
# 可信的历史记录
3029
# 选择某些国家报错,布维岛(难复现)
@@ -34,9 +33,7 @@
3433

3534
# 次优先级
3635
# 自定义模式弹窗
37-
# 有概率没扫完就win(难复现)
3836
# 记录pop的读写改到ui后(???)
39-
# 将鼠标速度调成小数倍
4037

4138
# 最低优先级
4239
# 优化判雷引擎

src/mineSweeperGUI.py

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,10 @@ def timeCount(self):
138138
t = self.label.ms_board.time
139139
self.time_10ms = int(t * 100)
140140
self.showTime(self.time_10ms // 100)
141-
since_time_unix_2 = QtCore.QDateTime.currentDateTime().toMSecsSinceEpoch() - self.start_time_unix_2
142-
if abs(t * 1000 - since_time_unix_2) > 10:
141+
since_time_unix_2 = QtCore.QDateTime.currentDateTime().\
142+
ArithmeticErrortoMSecsSinceEpoch() - self.start_time_unix_2
143+
if abs(t * 1000 - since_time_unix_2) > 10 and\
144+
(self.game_state == "playing" or self.game_state == "joking"):
143145
# 防CE作弊
144146
self.gameRestart()
145147

@@ -188,6 +190,7 @@ def ai(self, i, j):
188190
board, flag = mm.enumerateChangeBoard(self.label.ms_board.board,
189191
self.label.ms_board.game_board, [(i, j)])
190192

193+
191194
self.label.ms_board.board = board
192195
return
193196

@@ -433,6 +436,7 @@ def gameStart(self):
433436
# 这里有点乱
434437
if self.game_state == 'display' or self.game_state == 'showdisplay':
435438
self.setBoard_and_start(self.row, self.column, self.mineNum)
439+
self.label.paintPossibility = False
436440
self.label.set_rcp(self.row, self.column, self.pixSize)
437441
self.label.set_rcp(self.row, self.column, self.pixSize)
438442
self.game_state = 'ready'
@@ -446,20 +450,23 @@ def gameStart(self):
446450
# self.mainWindow.setMinimumSize(QtCore.QSize(10, 10))
447451
self.minimumWindow()
448452

453+
# 点击脸时调用,或尺寸不变时重开
449454
def gameRestart(self, e = None): # 画界面,但是不埋雷,改数据而不是重新生成label
450455
if e:
451456
# 点脸周围时,会传入一个e参数
452457
if not (self.MinenumTimeWigdet.width() >= e.localPos().x() >= 0 and 0 <= e.localPos().y() <= self.MinenumTimeWigdet.height()):
453458
return
454-
# 点击脸时调用
459+
# 此时self.label.ms_board是mm.abstract_game_board的实例
455460
if self.game_state == 'display' or self.game_state == 'showdisplay':
456461
self.timer_video.stop()
457462
self.ui_video_control.QWidget.close()
458463
self.label.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
464+
self.label.ms_board.mode = self.gameMode
459465
elif self.game_state == 'study':
460466
self.num_bar_ui.QWidget.close()
461467
self.score_board_manager.visible()
462468
self.label.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
469+
self.label.ms_board.mode = self.gameMode
463470
self.label_info.setText(self.player_designator)
464471
self.game_state = 'ready'
465472
self.enable_screenshot()
@@ -891,23 +898,22 @@ def screenShot(self):
891898
# 连续截屏时
892899
if self.game_state == 'study':
893900
self.num_bar_ui.QWidget.close()
901+
self.game_state = 'study' # 局面进入研究模式
894902

895903
# 主定时器停一下,不停的话需要的修补太多
896904
self.timer_10ms.stop()
897905
self.score_board_manager.invisible()
898906

899-
self.label.ms_board = mm.abstract_game_board()
900-
self.label.ms_board.mouse_state = 1
901-
self.label.ms_board.game_board_state = 1
902-
self.label.ms_board.game_board = ui.board
907+
# self.label.ms_board = mm.abstract_game_board()
908+
# self.label.ms_board.mouse_state = 1
909+
# self.label.ms_board.game_board_state = 1
910+
# self.label.ms_board.game_board = ui.board
903911

904912
# 在局面上画概率,或不画
905-
game_board = self.label.ms_board.game_board
906-
913+
# game_board = ui.board
907914

908-
909-
self.row = len(game_board)
910-
self.column = len(game_board[0])
915+
self.row = len(ui.board)
916+
self.column = len(ui.board[0])
911917

912918
self.num_bar_ui = mine_num_bar.ui_Form(ans[1], self.pixSize * self.row)
913919
self.num_bar_ui.QWidget.barSetMineNum.connect(self.showMineNum)
@@ -924,16 +930,20 @@ def screenShot(self):
924930

925931
# self.setBoard_and_start(len(ui.board), len(ui.board[0]), ans[1][1])
926932
self.setBoard(self.row, self.column, ans[1][1])
933+
934+
self.label.paintPossibility = True
927935
self.label.set_rcp(self.row, self.column, self.pixSize)
936+
937+
self.label.ms_board.game_board = ui.board
938+
self.label.ms_board.mouse_state = 1
939+
self.label.ms_board.game_board_state = 1
928940
self.mineNumShow = ans[1][1]
929941
self.showMineNum(self.mineNumShow)
930-
931-
# ans = ms.cal_possibility_onboard(ui.board, self.mineNumShow)
932942
self.label.boardPossibility = ans[0]
933-
self.label.paintPossibility = True
943+
944+
934945
self.label.update()
935946
# self.label.setMouseTracking(True)
936-
self.game_state = 'study' # 局面进入研究模式
937947

938948
self.minimumWindow()
939949

@@ -1072,6 +1082,7 @@ def action_OpenFile(self, openfile_name = None):
10721082
# 调整窗口
10731083
if (video.row, video.column) != (self.row, self.column):
10741084
self.setBoard(video.row, video.column, video.mine_num)
1085+
self.label.paintPossibility = False
10751086
self.label.set_rcp(self.row, self.column, self.pixSize)
10761087
# self.label.reloadCellPic(self.pixSize)
10771088
self.label.setMinimumSize(QtCore.QSize(self.pixSize*self.column + 8, self.pixSize*self.row + 8))
@@ -1180,6 +1191,7 @@ def set_face(self, face_type):
11801191
pixmap = QPixmap(self.pixmapNum[face_type])
11811192
self.label_2.setPixmap(pixmap)
11821193
self.label_2.setScaledContents(True)
1194+
11831195
def hidden_score_board(self):
11841196
# 按/隐藏计数器,再按显示
11851197
if self.score_board_manager.ui.QWidget.isVisible():

src/ui/mineLabel.py

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ms_toollib as ms
55
from PyQt5.QtCore import QPoint, Qt
66
# from PyQt5.QtSvg import QSvgWidget
7+
import minesweeper_master as mm
78

89

910
class mineLabel(QtWidgets.QLabel):
@@ -18,6 +19,7 @@ class mineLabel(QtWidgets.QLabel):
1819
mousewheelEvent = QtCore.pyqtSignal (int, int, int)
1920
row = 0
2021
column = 0
22+
pixSize = 0
2123

2224
def __init__(self, parent):
2325
super (mineLabel, self).__init__ (parent)
@@ -27,6 +29,7 @@ def __init__(self, parent):
2729
self.mouse.addPolygon(mouse_)
2830
self.setMouseTracking(True)
2931
self.paint_cursor = False # 是否画光标。不仅控制画光标,还代表了是游戏还是播放录像。
32+
self.paintPossibility = False
3033

3134
def setPath(self, r_path):
3235
# 告诉局面控件,相对路径
@@ -48,42 +51,38 @@ def setPath(self, r_path):
4851

4952
def set_rcp(self, row, column, pixSize):
5053
# ui层面,重设一下宽、高、大小
51-
self.pixSize = pixSize
52-
self.paintPossibility = False # 是否打印概率
53-
if (self.row, self.column) != (row, column): # 如果不相等,重新实例化
54+
# self.paintPossibility = False # 是否打印概率
55+
if self.paintPossibility:
56+
self.ms_board = mm.abstract_game_board()
57+
else:
5458
self.row = row
5559
self.column = column
5660
if not hasattr(self, "ms_board"):
57-
self.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
61+
self.ms_board = ms.BaseVideo([[0] * column for _ in range(row)], pixSize)
5862
else:
5963
if isinstance(self.ms_board, ms.BaseVideo):
6064
self.ms_board.reset(row, column, pixSize)
6165
else:
62-
self.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
63-
# print("new board")
64-
# print(self.ms_board.mode)
65-
# if not hasattr(self,'ms_board'):
66-
# self.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
67-
self.boardPossibility = [[0.0] * self.ms_board.column for _ in range(self.ms_board.row)]
68-
69-
# 这里有问题,尺寸不一样也可以reset吗
70-
self.ms_board.reset(self.row, self.column, self.pixSize)
66+
self.ms_board = ms.BaseVideo([[0] * column for _ in range(row)], pixSize)
67+
self.boardPossibility = [[0.0] * column for _ in range(row)]
7168

72-
self.importCellPic(self.pixSize)
73-
self.resize(QtCore.QSize(self.pixSize * self.column + 8, self.pixSize * self.row + 8))
74-
self.current_x = self.row # 鼠标坐标,和高亮的展示有关
75-
self.current_y = self.column
76-
77-
points = [ QPoint(0, 0), # 你猜这个多边形是什么,它就是鼠标
78-
QPoint(0, pixSize),
79-
QPoint(int(0.227 * pixSize), int(0.773 * pixSize)),
80-
QPoint(int(0.359 * pixSize), int(1.125 * pixSize)),
81-
QPoint(int(0.493 * pixSize), int(1.066 * pixSize)),
82-
QPoint(int(0.357 * pixSize), int(0.72 * pixSize)),
83-
QPoint(int(0.666 * pixSize), int(0.72 * pixSize)) ]
84-
mouse_ = QPolygonF(points)
85-
self.mouse = QPainterPath()
86-
self.mouse.addPolygon(mouse_)
69+
if self.pixSize != pixSize:
70+
self.pixSize = pixSize
71+
self.importCellPic(pixSize)
72+
self.resize(QtCore.QSize(pixSize * column + 8, pixSize * row + 8))
73+
self.current_x = self.row # 鼠标坐标,和高亮的展示有关
74+
self.current_y = self.column
75+
76+
points = [ QPoint(0, 0), # 你猜这个多边形是什么,它就是鼠标
77+
QPoint(0, pixSize),
78+
QPoint(int(0.227 * pixSize), int(0.773 * pixSize)),
79+
QPoint(int(0.359 * pixSize), int(1.125 * pixSize)),
80+
QPoint(int(0.493 * pixSize), int(1.066 * pixSize)),
81+
QPoint(int(0.357 * pixSize), int(0.72 * pixSize)),
82+
QPoint(int(0.666 * pixSize), int(0.72 * pixSize)) ]
83+
mouse_ = QPolygonF(points)
84+
self.mouse = QPainterPath()
85+
self.mouse.addPolygon(mouse_)
8786

8887
def mousePressEvent(self, e):
8988
# 重载一下鼠标点击事件
@@ -189,7 +188,7 @@ def paintEvent(self, event):
189188

190189
# 画高亮
191190
if (game_board_state == 2 or game_board_state == 1 or game_board_state == 5) and\
192-
not self.paintPossibility and current_x < self.row and current_y < self.column:
191+
current_x < self.row and current_y < self.column:
193192
if mouse_state == 5 or mouse_state == 6:
194193
for r in range(max(current_x - 1, 0), min(current_x + 2, self.row)):
195194
for c in range(max(current_y - 1, 0), min(current_y + 2, self.column)):

0 commit comments

Comments
 (0)