1. 扫雷游戏
    成果

  2. 代码
# 导入所需库from tkinter import *import randomclass 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()

因为这个h5游戏比较简单,也有游戏能够作为参考,所以绝对得没有那么难,代码也就没有那么多了,心愿各位可能看得懂哦!