1. 扫雷游戏
效果
3
2. 代码
# 导入所需库 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('<ButtonRelease-1>',lambda event:self._open(event.widget)) # 左键单击点开 self.mines[(x,y)].bind('<ButtonRelease-3>',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()
因为这个网络游戏比较简单,也有游戏可以作为参考,所以相对得没有那么难,代码也就没有那么多了,希望各位能够看得懂哦!