python扫雷小游戏,扫雷程序设计 python
这篇文章主要为大家详细介绍了大蟒实现简单扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了大蟒实现简单扫雷游戏的具体代码,供大家参考,具体内容如下
#编码: utf-8
__note__=
* 扫雷小游戏
* 需要python3.x以上
* 需要安装PyQt5
* pip安装PyQt5
导入系统
尝试:
导入PyQt5
除了导入错误:
导入图形界面
从图形界面导入messagebox
err_str=请安装PyQt5后再打开:点安装PyQt5
messagebox.showerror(模块错误!,err_str)
引发导入错误(错误字符串)
sys.exit()
从随机导入产生均匀分布的随机整数矩阵
来自PyQt5 .QtWidgets导入\
q应用程序,\
QWidget,\
q按钮,\
QLCDNumber,\
QDesktopWidget,\
提示框
来自PyQt5 .QtCore导入
类矿(对象):
我的=9
no_mine=0
我的=10
宽度=10
高度=10
def __init__(self,width=10,height=10,nMines=10):
self.map=[]
对于_在范围(高度):
t_line=[]
对于_在范围(宽度):
t_line.append(self.no_mine)
self.map.append(t_line)
自身宽度=宽度
自我高度=高度
self.n_mine=nMines
self.remix()
# 打乱布局重新随机编排
def remix(自己):
对于范围内的y(自身高度):
对于范围内的x(自身宽度):
self.map[y][x]=self.no_mine
定义添加标记(x,y):
# 如果不是雷的标记就数字一(一)
如果自我。映射[y][x]1自我。我的:
self.map[y][x]=1
mine_count=0
而地雷_计数self.n_mine:
x=randint(0,self.width-1)
y=randint(0,self.height-1)
if self.map[y][x]!=self.mine:
self.map[y][x]=self.mine
mine_count=1
# 雷所在的位置的8个方位的数值数字一(一)
## 上下左右
如果y-1=0: add_mark(x,y-1)
如果y 1 self.height: add_mark(x,y 1)
如果x-1=0: add_mark(x-1,y)
if x 1 self.width: add_mark(x 1,y)
## 四个角: 左上角、左下角、右上角、右下角
如果x-1=0且y-1=1: add_m
ark(x-1, y-1)
if x-1 >= 0 and y+1 < self.height: add_mark(x-1, y+1)
if x+1 < self.width and y-1 >= 1: add_mark(x+1, y-1)
if x+1 < self.width and y+1 < self.height: add_mark(x+1, y+1)
def __getitem__(self, key):
return self.map[key]
def __str__(self):
format_str = ""
for y in range(self.height):
format_str += str(self[y]) + "\n"
return format_str
__repr__ = __str__
class LCDCounter(QLCDNumber):
__counter = 0
def __init__(self, start=0, parent=None):
super().__init__(4, parent)
self.setSegmentStyle(QLCDNumber.Flat)
self.setStyleSheet("background: black; color: red")
self.counter = start
@property
def counter(self):
return self.__counter
@counter.setter
def counter(self, value):
self.__counter = value
self.display(str(self.__counter))
def inc(self):
self.counter += 1
def dec(self):
self.counter -= 1
class MineButton(QPushButton):
# 按钮类型
MINE = Mine.mine # 雷
NOTMINE = Mine.no_mine # 不是雷
m_type = None
# 按钮状态
mark = False # 是否是标记状态(默认: 未被标记)
s_flag = ⚑ # 标记
s_mine = ☠ # 雷
s_success = 👌
# 按钮是否按下(默认False: 未按下)
__pushed = False
# 按钮对应map的位置
m_x = 0
m_y = 0
def __init__(self, map_pos, m_type, parent):
super().__init__(parent)
self.m_type = m_type
self.pushed = False
self.m_x = map_pos[0]
self.m_y = map_pos[1]
@property
def pushed(self):
return not self.__pushed
@pushed.setter
def pushed(self, value):
self.__pushed = not value
self.setEnabled(self.__pushed)
## 按钮上的鼠标按下事件
def mousePressEvent(self, e):
#print("m_x:%d"%self.m_x, "m_y:%d"%self.m_y, "m_type:%d"%self.m_type)
p = self.parent()
# 记录鼠标单击次数
p.nwap_lcd_clicked.counter += 1
# 左键扫雷
if e.buttons() == Qt.LeftButton:
# 踩中雷, 全部雷都翻起来
if self.m_type == self.MINE:
for t_line_btn in p.btn_map:
for btn in t_line_btn:
if btn.m_type == btn.MINE:
btn.setText(btn.s_mine)
else:
if btn.mark != True:
if btn.m_type != btn.NOTMINE:
btn.setText(str(btn.m_type))
btn.pushed = True
# 苦逼脸
p.RestartBtn.setText(😣)
QMessageBox.critical(self, "失败!", "您不小心踩到了雷! " + self.s_mine)
return None
elif self.m_type == self.NOTMINE:
self.AutoSwap(self.m_x, self.m_y)
else:
self.setText(str(self.m_type))
p.mine_counter -= 1
self.pushed = True
# 右键添加标记
elif e.buttons() == Qt.RightButton:
if self.mark == False:
self.setText(self.s_flag)
self.mark = True
else:
self.setText("")
self.mark = False
self.setFocus(False)
## 当按下的位置是NOTMINE时自动扫雷
def AutoSwap(self, x, y):
p = self.parent()
map_btn = p.btn_map
def lookup(t_line, index):
# 向左扫描
i = index
while i >= 0 and not t_line[i].pushed and t_line[i].m_type != MineButton.MINE:
if t_line[i].m_type != MineButton.NOTMINE:
t_line[i].setText(str(t_line[i].m_type))
t_line[i].pushed = True
p.mine_counter -= 1
p.nwap_lcd_counter.counter = p.mine_counter
i -= 1
if t_line[i].m_type != MineButton.NOTMINE:
break
# 向右扫描
i = index + 1
while i < p.mine_map.width and not t_line[i].pushed and t_line[i].m_type != MineButton.MINE:
if t_line[i].m_type != MineButton.NOTMINE:
t_line[i].setText(str(t_line[i].m_type))
t_line[i].pushed = True
p.mine_counter -= 1
p.nwap_lcd_counter.counter = p.mine_counter
i += 1
if t_line[i].m_type != MineButton.NOTMINE:
break
# 向上扫描
j = y
while j >= 0:
lookup(map_btn[j], x)
j -= 1
# 向下扫描
j = y + 1
while j < p.mine_map.height:
lookup(map_btn[j], x)
j += 1
class MineWindow(QWidget):
def __init__(self):
super().__init__()
self.mine_map = Mine(nMines=16)
self.InitGUI()
#print(self.mine_map)
def InitGUI(self):
w_width = 304
w_height = 344
self.resize(w_width, w_height)
self.setFixedSize(self.width(), self.height())
self.setWindowTitle("扫雷")
## 窗口居中于屏幕
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.x(), qr.y())
l_start_x = 2
l_start_y = 40
l_x = l_start_x
l_y = l_start_y
l_width = 30
l_height = 30
# 雷区按钮
self.btn_map = []
for h in range(self.mine_map.height):
l_x = l_start_x
self.btn_map.append(list())
for w in range(self.mine_map.width):
self.btn_map[h].append(MineButton([w, h], self.mine_map[h][w], self))
self.btn_map[h][w].resize(l_width, l_height)
self.btn_map[h][w].move(l_x, l_y)
self.btn_map[h][w].show()
l_x += l_width
l_y += l_height
r_width = 30
r_height = 30
# 恢复按钮
self.RestartBtn = QPushButton(😊, self)
self.RestartBtn.clicked.connect(self.restart_btn_event)
self.RestartBtn.resize(r_width, r_height)
self.RestartBtn.move((w_width-r_width)//2, 6)
## 计数器
self.__mine_counter = self.mine_map.width * self.mine_map.height - self.mine_map.n_mine
## 两个LCD显示控件
# 操作次数
self.nwap_lcd_clicked = LCDCounter(0, self)
self.nwap_lcd_clicked.move(44, 8)
# 无雷块个数
self.nwap_lcd_counter = LCDCounter(self.mine_counter, self)
self.nwap_lcd_counter.move(204, 8)
def restart_btn_event(self):
self.mine_map.remix()
#QMessageBox.information(self, "look up", str(self.mine_map))
for y in range(len(self.btn_map)):
for x in range(len(self.btn_map[y])):
self.btn_map[y][x].pushed = False
self.btn_map[y][x].setText("")
self.btn_map[y][x].m_type = self.mine_map[y][x]
self.mine_counter = self.mine_map.width * self.mine_map.height - self.mine_map.n_mine
self.RestartBtn.setText(😊)
self.nwap_lcd_clicked.counter = 0
self.nwap_lcd_counter.counter = self.mine_counter
### 计数器
@property
def mine_counter(self):
return self.__mine_counter
@mine_counter.setter
def mine_counter(self, value):
self.__mine_counter = value
self.nwap_lcd_counter.dec()
if self.mine_counter == 0:
for t_line_btn in self.btn_map:
for btn in t_line_btn:
if btn.m_type == btn.MINE:
btn.setText(btn.s_success)
btn.pushed = True
QMessageBox.information(self, "恭喜!", "您成功扫雷! " + MineButton.s_success)
if __name__ == __main__:
app = QApplication(sys.argv)
w = MineWindow()
w.show()
sys.exit(app.exec_())
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。