用户:
Andrew李查看:0 回复:0 评论:0 创建时间:2022-01-23T19:08:34
【作品展示】

【作品介绍】
无
【作品源代码】
# 导入所需库
from tkinter import *
import random
class main:
# 定义一个类,继承 tkinter 的 Button
# 用来保存按钮的状态和在网格布局中的位置
class minebtn(Button):
def __init__(self, master, xy, **kw):
Button.__init__(self, master, **kw)
self.xy = xy
self._state = 0
# 状态
# 0: 未点开
# 1: 已点开
# 2: 标记
# 3: 问号
def __init__(self):
# 定义规格及雷数
self.width = 9
self.height = 9
self.minenum = 10
# Windows 7 默认的三种规格和雷数
# 9*9,10
# 16*16,40
# 16*32,99
self.rest = self.minenum # 剩余未标记的雷
# 雷数的颜色
self.colorlist = ['green', # 绿色
'DodgerBlue', # 浅蓝色
'DarkOrange1', # 橙色
'blue', # 蓝色
'red', # 红色
'Chocolate4', # 棕色
'grey', # 灰色
'black'] # 黑色
self.setgui()
def setgui(self):
# GUI界面
self.root = Tk()
self.root.title('扫雷')
self.restlabel = Label(self.root, text=f'剩余:{self.minenum}')
self.restlabel.grid(row=0, column=0, columnspan=3)
self.mineplace = random.sample(
range(self.width*self.height), self.minenum) # 随机抽取雷
self.mineplace = [(x % self.width, x//self.height)
for x in self.mineplace] # 将雷的序号转变为坐标
self.mines = {}
for y in range(self.height):
for x in range(self.width):
self.mines[(x, y)] = self.minebtn(self.root, xy=(x, y), font=(
'黑体', 8, 'bold'), width=2, bd=1, relief='ridge')
self.mines[(x, y)].bind('',
lambda event: self._open(event.widget)) # 左键单击点开
self.mines[(x, y)].bind('',
lambda event: self.make(event.widget)) # 右键单击事件
self.mines[(x, y)].grid(row=y+1, column=x, sticky='nswe')
self.root.mainloop()
# 点开
def _open(self, widget):
xy = widget.xy
x = xy[0]
y = xy[1] # 获取当前按钮的坐标
# 如果是雷则显示全部雷的位置
if widget.xy in self.mineplace:
self.showmine()
return
# 如果已经点开了就什么也不做
if widget._state == 1:
return
widget.configure(relief='flat', bg='white') # 更改当前按钮的样式
widget._state = 1 # 按钮状态设为点开
# 获取周围八个雷的坐标
around = [(x-1, y-1),
(x, y-1),
(x+1, y-1),
(x-1, y),
(x+1, y),
(x-1, y+1),
(x, y+1),
(x+1, y+1)]
_sum = 0
around_ = []
for o, p in around:
# 排除掉在雷区之外的雷
if 0 <= o <= self.width - 1 and 0 <= p <= self.height - 1:
around_.append((o, p))
# 计算周围的雷数
if self.mines[(o, p)].xy in self.mineplace:
_sum += 1
#如果周围没有雷则打开周围未标记的雷,直到有雷为止
if _sum == 0:
widget['text'] = ''
for i, j in around:
if self.mines[(i, j)]._state == 0:
self._open(self.mines[(i, j)])
else:
widget['text'] = _sum # 显示雷数
# 对应数字设置对应颜色
widget['fg'] = self.colorlist[_sum-1]
# 右键单击设置标记/问号
def make(self, widget):
string = {0: '', 2: '♀', 3: '?'}
if widget._state == 0:
widget._state = 2
widget['text'] = string[2]
self.rest -= 1
self.restlabel['text'] = f'剩余:{self.rest}'
elif widget._state == 2:
widget._state = 3
widget['text'] = string[3]
self.rest += 1
self.restlabel['text'] = f'剩余:{self.rest}'
elif widget._state == 3:
widget._state = 0
widget['text'] = string[0]
# 如果踩到雷,显示所有的雷
def showmine(self):
for i, j in self.mineplace:
self.mines[(i, j)].configure(text='ி', fg='red')
main()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.co喵