首页 > 编程语言 > 详细

python 用 tkinter 开发简单扫雷小游戏

时间:2021-06-01 14:49:54      阅读:17      评论:0      收藏:0      [点我收藏+]

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()

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

 

python 用 tkinter 开发简单扫雷小游戏

原文:https://www.cnblogs.com/heyu123/p/14836023.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!