Skip to content

Commit

Permalink
fix:截屏计算概率bug、播放录像更稳定
Browse files Browse the repository at this point in the history
  • Loading branch information
eee555 committed Jul 21, 2024
1 parent a482152 commit f77dd7b
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 48 deletions.
3 changes: 0 additions & 3 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@


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

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

# 最低优先级
# 优化判雷引擎
Expand Down
44 changes: 28 additions & 16 deletions src/mineSweeperGUI.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,10 @@ def timeCount(self):
t = self.label.ms_board.time
self.time_10ms = int(t * 100)
self.showTime(self.time_10ms // 100)
since_time_unix_2 = QtCore.QDateTime.currentDateTime().toMSecsSinceEpoch() - self.start_time_unix_2
if abs(t * 1000 - since_time_unix_2) > 10:
since_time_unix_2 = QtCore.QDateTime.currentDateTime().\
ArithmeticErrortoMSecsSinceEpoch() - self.start_time_unix_2
if abs(t * 1000 - since_time_unix_2) > 10 and\
(self.game_state == "playing" or self.game_state == "joking"):
# 防CE作弊
self.gameRestart()

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


self.label.ms_board.board = board
return

Expand Down Expand Up @@ -433,6 +436,7 @@ def gameStart(self):
# 这里有点乱
if self.game_state == 'display' or self.game_state == 'showdisplay':
self.setBoard_and_start(self.row, self.column, self.mineNum)
self.label.paintPossibility = False
self.label.set_rcp(self.row, self.column, self.pixSize)
self.label.set_rcp(self.row, self.column, self.pixSize)
self.game_state = 'ready'
Expand All @@ -446,20 +450,23 @@ def gameStart(self):
# self.mainWindow.setMinimumSize(QtCore.QSize(10, 10))
self.minimumWindow()

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

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

self.label.ms_board = mm.abstract_game_board()
self.label.ms_board.mouse_state = 1
self.label.ms_board.game_board_state = 1
self.label.ms_board.game_board = ui.board
# self.label.ms_board = mm.abstract_game_board()
# self.label.ms_board.mouse_state = 1
# self.label.ms_board.game_board_state = 1
# self.label.ms_board.game_board = ui.board

# 在局面上画概率,或不画
game_board = self.label.ms_board.game_board

# game_board = ui.board


self.row = len(game_board)
self.column = len(game_board[0])
self.row = len(ui.board)
self.column = len(ui.board[0])

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

# self.setBoard_and_start(len(ui.board), len(ui.board[0]), ans[1][1])
self.setBoard(self.row, self.column, ans[1][1])

self.label.paintPossibility = True
self.label.set_rcp(self.row, self.column, self.pixSize)

self.label.ms_board.game_board = ui.board
self.label.ms_board.mouse_state = 1
self.label.ms_board.game_board_state = 1
self.mineNumShow = ans[1][1]
self.showMineNum(self.mineNumShow)

# ans = ms.cal_possibility_onboard(ui.board, self.mineNumShow)
self.label.boardPossibility = ans[0]
self.label.paintPossibility = True


self.label.update()
# self.label.setMouseTracking(True)
self.game_state = 'study' # 局面进入研究模式

self.minimumWindow()

Expand Down Expand Up @@ -1072,6 +1082,7 @@ def action_OpenFile(self, openfile_name = None):
# 调整窗口
if (video.row, video.column) != (self.row, self.column):
self.setBoard(video.row, video.column, video.mine_num)
self.label.paintPossibility = False
self.label.set_rcp(self.row, self.column, self.pixSize)
# self.label.reloadCellPic(self.pixSize)
self.label.setMinimumSize(QtCore.QSize(self.pixSize*self.column + 8, self.pixSize*self.row + 8))
Expand Down Expand Up @@ -1180,6 +1191,7 @@ def set_face(self, face_type):
pixmap = QPixmap(self.pixmapNum[face_type])
self.label_2.setPixmap(pixmap)
self.label_2.setScaledContents(True)

def hidden_score_board(self):
# 按/隐藏计数器,再按显示
if self.score_board_manager.ui.QWidget.isVisible():
Expand Down
57 changes: 28 additions & 29 deletions src/ui/mineLabel.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import ms_toollib as ms
from PyQt5.QtCore import QPoint, Qt
# from PyQt5.QtSvg import QSvgWidget
import minesweeper_master as mm


class mineLabel(QtWidgets.QLabel):
Expand All @@ -18,6 +19,7 @@ class mineLabel(QtWidgets.QLabel):
mousewheelEvent = QtCore.pyqtSignal (int, int, int)
row = 0
column = 0
pixSize = 0

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

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

def set_rcp(self, row, column, pixSize):
# ui层面,重设一下宽、高、大小
self.pixSize = pixSize
self.paintPossibility = False # 是否打印概率
if (self.row, self.column) != (row, column): # 如果不相等,重新实例化
# self.paintPossibility = False # 是否打印概率
if self.paintPossibility:
self.ms_board = mm.abstract_game_board()
else:
self.row = row
self.column = column
if not hasattr(self, "ms_board"):
self.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
self.ms_board = ms.BaseVideo([[0] * column for _ in range(row)], pixSize)
else:
if isinstance(self.ms_board, ms.BaseVideo):
self.ms_board.reset(row, column, pixSize)
else:
self.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
# print("new board")
# print(self.ms_board.mode)
# if not hasattr(self,'ms_board'):
# self.ms_board = ms.BaseVideo([[0] * self.column for _ in range(self.row)], self.pixSize)
self.boardPossibility = [[0.0] * self.ms_board.column for _ in range(self.ms_board.row)]

# 这里有问题,尺寸不一样也可以reset吗
self.ms_board.reset(self.row, self.column, self.pixSize)
self.ms_board = ms.BaseVideo([[0] * column for _ in range(row)], pixSize)
self.boardPossibility = [[0.0] * column for _ in range(row)]

self.importCellPic(self.pixSize)
self.resize(QtCore.QSize(self.pixSize * self.column + 8, self.pixSize * self.row + 8))
self.current_x = self.row # 鼠标坐标,和高亮的展示有关
self.current_y = self.column

points = [ QPoint(0, 0), # 你猜这个多边形是什么,它就是鼠标
QPoint(0, pixSize),
QPoint(int(0.227 * pixSize), int(0.773 * pixSize)),
QPoint(int(0.359 * pixSize), int(1.125 * pixSize)),
QPoint(int(0.493 * pixSize), int(1.066 * pixSize)),
QPoint(int(0.357 * pixSize), int(0.72 * pixSize)),
QPoint(int(0.666 * pixSize), int(0.72 * pixSize)) ]
mouse_ = QPolygonF(points)
self.mouse = QPainterPath()
self.mouse.addPolygon(mouse_)
if self.pixSize != pixSize:
self.pixSize = pixSize
self.importCellPic(pixSize)
self.resize(QtCore.QSize(pixSize * column + 8, pixSize * row + 8))
self.current_x = self.row # 鼠标坐标,和高亮的展示有关
self.current_y = self.column

points = [ QPoint(0, 0), # 你猜这个多边形是什么,它就是鼠标
QPoint(0, pixSize),
QPoint(int(0.227 * pixSize), int(0.773 * pixSize)),
QPoint(int(0.359 * pixSize), int(1.125 * pixSize)),
QPoint(int(0.493 * pixSize), int(1.066 * pixSize)),
QPoint(int(0.357 * pixSize), int(0.72 * pixSize)),
QPoint(int(0.666 * pixSize), int(0.72 * pixSize)) ]
mouse_ = QPolygonF(points)
self.mouse = QPainterPath()
self.mouse.addPolygon(mouse_)

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

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

0 comments on commit f77dd7b

Please sign in to comment.