Skip to content

Commit b6e1928

Browse files
committed
fix:修复了在边框上按下、在局面内释放造成的状态机报错问题
1 parent 728d2f5 commit b6e1928

File tree

7 files changed

+106
-33
lines changed

7 files changed

+106
-33
lines changed

src/media/cat.ico

-82.9 KB
Binary file not shown.

src/mineSweeperGUI.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,8 +1438,8 @@ class RECT(ctypes.Structure):
14381438
("right", ctypes.c_long),
14391439
("bottom", ctypes.c_long)]
14401440
# 创建RECT实例
1441-
r = RECT(rect.left() + 4, rect.top() + 4,
1442-
rect.right() - 4, rect.bottom() - 4)
1441+
r = RECT(rect.left(), rect.top(),
1442+
rect.right(), rect.bottom())
14431443
# 调用Windows API函数ClipCursor来限制光标
14441444
ctypes.windll.user32.ClipCursor(ctypes.byref(r))
14451445

src/mineSweeperGUIEvent.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from PyQt5 import QtCore
22
from PyQt5.QtCore import Qt
33
# from PyQt5.QtWidgets import QLineEdit, QInputDialog, QShortcut
4-
from PyQt5.QtWidgets import QApplication, QFileDialog, QWidget
4+
from PyQt5.QtWidgets import QApplication
55
import superGUI
66

77
# 局面中的鼠标和滚轮事件
88

99
class MineSweeperGUIEvent(superGUI.Ui_MainWindow):
1010
def mineAreaLeftPressed(self, i, j):
11+
# print("lc", i, j)
1112
if self.game_state == 'ready' or self.game_state == 'playing' or\
1213
self.game_state == 'joking':
1314
self.label.ms_board.step('lc', (i, j))
@@ -22,6 +23,7 @@ def mineAreaLeftPressed(self, i, j):
2223
self.set_face(15)
2324

2425
def mineAreaLeftRelease(self, i, j):
26+
# print("lr", i, j)
2527
if self.game_state == 'ready':
2628
if not self.pos_is_in_board(i, j):
2729
self.label.ms_board.step('lr', (i, j))
@@ -95,6 +97,7 @@ def mineAreaLeftRelease(self, i, j):
9597
self.set_face(14)
9698

9799
def mineAreaRightPressed(self, i, j):
100+
# print("rc", i, j)
98101
if self.game_state == 'ready' or self.game_state == 'playing' or self.game_state == 'joking':
99102
if i < self.pixSize * self.row and j < self.pixSize * self.column:
100103
# 计算左上角显示的雷数用。必须校验:当前格的状态、鼠标状态为双键都抬起。
@@ -113,6 +116,7 @@ def mineAreaRightPressed(self, i, j):
113116
self.set_face(15)
114117

115118
def mineAreaRightRelease(self, i, j):
119+
# print("rr", i, j)
116120
if self.game_state == 'ready' or self.game_state == 'playing' or self.game_state == 'joking':
117121
self.chording_ai(i // self.pixSize, j // self.pixSize)
118122
self.label.ms_board.step('rr', (i, j))
@@ -125,6 +129,7 @@ def mineAreaRightRelease(self, i, j):
125129
self.set_face(14)
126130

127131
def mineAreaLeftAndRightPressed(self, i, j):
132+
# print("cc", i, j)
128133
if self.game_state == 'ready' or self.game_state == 'playing' or\
129134
self.game_state == 'joking':
130135
self.label.ms_board.step('cc', (i, j))

src/superGUI.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,8 +426,8 @@ def readPredefinedBoardPara(self):
426426

427427
def minimumWindow(self):
428428
# 最小化展示窗口,并固定尺寸
429-
self.label.setFixedSize(QtCore.QSize(self.pixSize*self.column + 8,
430-
self.pixSize*self.row + 8))
429+
self.label.setFixedSize(QtCore.QSize(self.pixSize*self.column,
430+
self.pixSize*self.row))
431431
self.windowSizeState = 'tight'
432432
self.timer_ = QTimer()
433433
self.timer_.timeout.connect(self.__minimumWindow)

src/ui/mineLabel.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ def set_rcp(self, row, column, pixSize):
7878
self.importCellPic(pixSize)
7979
# self.resize(QtCore.QSize(pixSize * column + 8, pixSize * row + 8))
8080
self.setMinimumSize(QtCore.QSize(
81-
pixSize * column + 8, pixSize * row + 8))
81+
pixSize * column, pixSize * row))
8282
self.setMaximumSize(QtCore.QSize(
83-
pixSize * column + 8, pixSize * row + 8))
83+
pixSize * column, pixSize * row))
8484
# self.current_x = self.row # 鼠标坐标,和高亮的展示有关
8585
# self.current_y = self.column
8686

@@ -97,8 +97,9 @@ def set_rcp(self, row, column, pixSize):
9797

9898
def mousePressEvent(self, e):
9999
# 重载一下鼠标点击事件
100-
xx = int(e.localPos().x() - 4)
101-
yy = int(e.localPos().y() - 4)
100+
xx = int(e.localPos().x())
101+
yy = int(e.localPos().y())
102+
# print("press: ", xx, yy)
102103
if yy < 0 or xx < 0 or yy >= self.row * self.pixSize or\
103104
xx >= self.column * self.pixSize:
104105
self.current_x = self.row * self.pixSize
@@ -119,8 +120,9 @@ def mousePressEvent(self, e):
119120
def mouseReleaseEvent(self, e):
120121
#每个标签的鼠标事件发射给槽的都是自身的坐标
121122
#所以获取释放点相对本标签的偏移量,矫正发射的信号
122-
xx = int(e.localPos().x() - 4)
123-
yy = int(e.localPos().y() - 4)
123+
xx = int(e.localPos().x())
124+
yy = int(e.localPos().y())
125+
# print("release: ", xx, yy)
124126

125127
if yy < 0 or xx < 0 or yy >= self.row * self.pixSize or\
126128
xx >= self.column * self.pixSize:
@@ -136,8 +138,8 @@ def mouseReleaseEvent(self, e):
136138
self.rightRelease.emit(self.current_x, self.current_y)
137139

138140
def mouseMoveEvent(self, e):
139-
xx = int(e.localPos().x() - 4)
140-
yy = int(e.localPos().y() - 4)
141+
xx = int(e.localPos().x())
142+
yy = int(e.localPos().y())
141143
# print('移动位置{}, {}'.format(xx, yy))
142144
if yy < 0 or xx < 0 or yy >= self.row * self.pixSize or\
143145
xx >= self.column * self.pixSize:
@@ -152,14 +154,15 @@ def wheelEvent(self, event):
152154
# 滚轮事件
153155
angle = event.angleDelta()
154156
angle_y = angle.y()
155-
xx = int(event.x() - 4) # 距离左侧
156-
yy = int(event.y() - 4) # 距离上方
157+
xx = int(event.x()) # 距离左侧
158+
yy = int(event.y()) # 距离上方
157159
if yy < 0 or xx < 0 or yy >= self.row * self.pixSize or\
158160
xx >= self.column * self.pixSize:
159161
self.mousewheelEvent.emit(angle_y, self.row, self.column)
160162
else:
161163
self.mousewheelEvent.emit(angle_y, yy // self.pixSize, xx // self.pixSize)
162164

165+
163166
def paintEvent(self, event):
164167
super().paintEvent(event)
165168
pix_size = self.pixSize
@@ -184,16 +187,16 @@ def paintEvent(self, event):
184187
for i in range(row):
185188
for j in range(column):
186189
if game_board[i][j] == 10:
187-
painter.drawPixmap(j * pix_size + 4, i * pix_size + 4, QPixmap(self.pixmapNum[10]))
190+
painter.drawPixmap(j * pix_size, i * pix_size, QPixmap(self.pixmapNum[10]))
188191
if self.paintProbability: # 画概率
189192
if self.paint_cursor:
190193
painter.setOpacity(self.ms_board.game_board_poss[i][j])
191194
else:
192195
painter.setOpacity(self.boardProbability[i][j])
193-
painter.drawPixmap(j * pix_size + 4, i * pix_size + 4, QPixmap(self.pixmapNum[100]))
196+
painter.drawPixmap(j * pix_size, i * pix_size, QPixmap(self.pixmapNum[100]))
194197
painter.setOpacity(1.0)
195198
else:
196-
painter.drawPixmap(j * pix_size + 4, i * pix_size + 4, QPixmap(self.pixmapNum[game_board[i][j]]))
199+
painter.drawPixmap(j * pix_size, i * pix_size, QPixmap(self.pixmapNum[game_board[i][j]]))
197200

198201

199202
# 画高亮
@@ -203,12 +206,12 @@ def paintEvent(self, event):
203206
for r in range(max(current_x - 1, 0), min(current_x + 2, row)):
204207
for c in range(max(current_y - 1, 0), min(current_y + 2, column)):
205208
if game_board[r][c] == 10:
206-
painter.drawPixmap(c * pix_size + 4, r * pix_size + 4, QPixmap(self.pixmapNum[0]))
209+
painter.drawPixmap(c * pix_size, r * pix_size, QPixmap(self.pixmapNum[0]))
207210
elif mouse_state == 4 and game_board[current_x][current_y] == 10:
208-
painter.drawPixmap(current_y * pix_size + 4, current_x * pix_size + 4, QPixmap(self.pixmapNum[0]))
211+
painter.drawPixmap(current_y * pix_size, current_x * pix_size, QPixmap(self.pixmapNum[0]))
209212
# 画光标
210213
if self.paint_cursor:
211-
painter.translate(x + 4, y + 4)
214+
painter.translate(x, y)
212215
painter.drawPath(self.mouse)
213216
painter.fillPath(self.mouse,Qt.white)
214217
painter.end()

src/ui/ui_main_board.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,31 @@ def setupUi(self, MainWindow):
180180
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
181181
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
182182
self.horizontalLayout_2.addItem(spacerItem2)
183-
self.label = mineLabel(self.frame_1)
184-
self.label.setFrameShape(QtWidgets.QFrame.Panel)
185-
self.label.setFrameShadow(QtWidgets.QFrame.Sunken)
186-
self.label.setLineWidth(4)
183+
self.frame = QtWidgets.QFrame(self.frame_1)
184+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
185+
sizePolicy.setHorizontalStretch(0)
186+
sizePolicy.setVerticalStretch(0)
187+
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
188+
self.frame.setSizePolicy(sizePolicy)
189+
self.frame.setMinimumSize(QtCore.QSize(0, 0))
190+
self.frame.setFrameShape(QtWidgets.QFrame.Panel)
191+
self.frame.setFrameShadow(QtWidgets.QFrame.Sunken)
192+
self.frame.setLineWidth(4)
193+
self.frame.setObjectName("frame")
194+
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame)
195+
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
196+
self.verticalLayout_3.setSpacing(0)
197+
self.verticalLayout_3.setObjectName("verticalLayout_3")
198+
self.label = mineLabel(self.frame)
199+
self.label.setMinimumSize(QtCore.QSize(0, 0))
200+
self.label.setFrameShape(QtWidgets.QFrame.NoFrame)
201+
self.label.setFrameShadow(QtWidgets.QFrame.Plain)
202+
self.label.setLineWidth(0)
187203
self.label.setText("")
188204
self.label.setAlignment(QtCore.Qt.AlignCenter)
189205
self.label.setObjectName("label")
190-
self.horizontalLayout_2.addWidget(self.label)
206+
self.verticalLayout_3.addWidget(self.label)
207+
self.horizontalLayout_2.addWidget(self.frame)
191208
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
192209
self.horizontalLayout_2.addItem(spacerItem3)
193210
self.verticalLayout.addLayout(self.horizontalLayout_2)

uiFiles/main_board.ui

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,19 @@
471471
</spacer>
472472
</item>
473473
<item>
474-
<widget class="mineLabel" name="label">
474+
<widget class="QFrame" name="frame">
475+
<property name="sizePolicy">
476+
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
477+
<horstretch>0</horstretch>
478+
<verstretch>0</verstretch>
479+
</sizepolicy>
480+
</property>
481+
<property name="minimumSize">
482+
<size>
483+
<width>0</width>
484+
<height>0</height>
485+
</size>
486+
</property>
475487
<property name="frameShape">
476488
<enum>QFrame::Panel</enum>
477489
</property>
@@ -481,12 +493,48 @@
481493
<property name="lineWidth">
482494
<number>4</number>
483495
</property>
484-
<property name="text">
485-
<string/>
486-
</property>
487-
<property name="alignment">
488-
<set>Qt::AlignCenter</set>
489-
</property>
496+
<layout class="QVBoxLayout" name="verticalLayout_3">
497+
<property name="spacing">
498+
<number>0</number>
499+
</property>
500+
<property name="leftMargin">
501+
<number>0</number>
502+
</property>
503+
<property name="topMargin">
504+
<number>0</number>
505+
</property>
506+
<property name="rightMargin">
507+
<number>0</number>
508+
</property>
509+
<property name="bottomMargin">
510+
<number>0</number>
511+
</property>
512+
<item>
513+
<widget class="mineLabel" name="label">
514+
<property name="minimumSize">
515+
<size>
516+
<width>0</width>
517+
<height>0</height>
518+
</size>
519+
</property>
520+
<property name="frameShape">
521+
<enum>QFrame::NoFrame</enum>
522+
</property>
523+
<property name="frameShadow">
524+
<enum>QFrame::Plain</enum>
525+
</property>
526+
<property name="lineWidth">
527+
<number>0</number>
528+
</property>
529+
<property name="text">
530+
<string/>
531+
</property>
532+
<property name="alignment">
533+
<set>Qt::AlignCenter</set>
534+
</property>
535+
</widget>
536+
</item>
537+
</layout>
490538
</widget>
491539
</item>
492540
<item>

0 commit comments

Comments
 (0)