广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python GUI编程实现扫雷游戏
  • 877
分享到

python GUI编程实现扫雷游戏

2024-04-02 19:04:59 877人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一、基本思路二、源代码1.运行效果2.上源码总结前言 1992年扫雷被加入到windows3.1,成为早期windows的经典游戏。近来接触python的GUI(图形化)编程

前言

1992年扫雷被加入到windows3.1,成为早期windows的经典游戏。近来接触python的GUI(图形化)编程,于是通过编写扫雷来实践学习。有关程序的问题和想法欢迎大家指出。

一、基本思路

(1)程序的核心数据是二维列表control_list[16][16],值-1代表雷,0和其他数字代表四周雷的数目。函数randomization()随机40个雷的 位置
(2)生成16x16个按钮控件,根据control_list列表确定点击相应的按钮时执行的代码。如按照游戏规则:点击对应control_list列表值为0的按钮时,递归执行函数re()来扫雷,当点击对应的control_list列表值为-1时直接结束游戏,对应大于0的值则只需隐藏当前的按钮控件。
其他:本程序用到的GUI编程库为tkinter, 控件的布局统一采用place()方法

二、源代码

1.运行效果

运行效果如下(示例):

2.上源码

"""
Created on Tuesday, April 5,2022
@author:I
"""
from tkinter import *
from tkinter import messagebox
import random

#定义五个二维数组,充当整个程序的数据
control_list=[[0 for i in range(16)] for j in range(16)]#二维列表,呈现雷和数字的分布。
show_list=[[0 for i in range(16)] for j in range(16)]#二维列表,控制遮住或显示雷和数字。(0--遮住,1--显示)
button_list=[[0 for i in range(16)] for j in range(16)]#二维的按钮列表(显示在上层)
label_list=[[0 for i in range(16)] for j in range(16)]#二维的标签列表(显示在下层)
mark_list=[[0 for i in range(16)] for j in range(16)]#二维标记列表
num_mine=40#控制游戏结束
counter=0#计时
T ,t= 1,0#游戏结束的判断
def randomization(c_list):#随机初始化雷的分布即初始化列表control_list
    num=0
    while num<40:
        x=random.randint(0,15)
        y=random.randint(0,15)
        if(c_list[x][y]==0):
            num+=1
            c_list[x][y]=-1
    for i in range(16):
        for j in range(16):
            if(c_list[i][j]>-1):
                if (i>0 and c_list[i-1][j]==-1):
                    c_list[i][j]+=1
                if (i<15 and c_list[i+1][j]==-1):
                    c_list[i][j]+=1
                if (j>0 and c_list[i][j-1]==-1):
                    c_list[i][j]+=1
                if (j<15 and c_list[i][j+1]==-1):
                    c_list[i][j]+=1
                if (i>0 and j>0 and c_list[i-1][j-1]==-1):
                    c_list[i][j]+=1
                if (i<15 and j<15 and c_list[i+1][j+1]==-1):
                    c_list[i][j]+=1
                if (i>0 and j<15 and c_list[i-1][j+1]==-1):
                    c_list[i][j]+=1
                if (i<15 and j>0 and c_list[i+1][j-1]==-1):
                    c_list[i][j]+=1
def game_core():
    randomization(control_list)
    for row in range(16):
        for col in range(16):
            if(control_list[row][col]==-1):
                label_list[row][col]=Label(root,text="☠",font=('arial', 15, 'bold'),fg="black",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==0):
                label_list[row][col]=Label(root,text="",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==1):
                label_list[row][col]=Label(root,text="1",font=('arial', 15, 'bold'),fg="red",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==2):
                label_list[row][col]=Label(root,text="2",font=('arial', 15, 'bold'),fg="blue",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==3):
                label_list[row][col]=Label(root,text="3",font=('arial', 15, 'bold'),fg="green",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==4):
                label_list[row][col]=Label(root,text="4",font=('arial', 15, 'bold'),fg="white",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==5):
                label_list[row][col]=Label(root,text="5",font=('arial', 15, 'bold'),fg="red",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==6):
                label_list[row][col]=Label(root,text="6",font=('arial', 15, 'bold'),fg="blue",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==7):
                label_list[row][col]=Label(root,text="7",font=('arial', 15, 'bold'),fg="green",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
            elif(control_list[row][col]==8):
                label_list[row][col]=Label(root,text="8",font=('arial', 15, 'bold'),fg="white",bg="#AAAAAA",relief=RIDGE)
                label_list[row][col].place(x=17+col*20,y=46+row*20,height=20,width=20)
    for r in range(16):
        for c in range(16):
            s = str((r)*16+c)
            button_list[r][c]=Button(root,text=s,activeforeground="#AAAAAA",bg="#AAAAAA",fg="#AAAAAA")
            button_list[r][c].place(x=17+c*20,y=46+r*20,height=20,width=20)
            button_list[r][c].bind("<Button-1>",button_control_l)#鼠标左击绑定函数
            button_list[r][c].bind("<Button-3>",button_control_r)
def button_control_l(event):#扫雷控制函数.(开始函数直接用参数r和c,但是会产生问题)
    r = int(event.widget["text"])//16
    c = int(event.widget["text"])%16
    global t
    global T
    if(control_list[r][c]>=1):
        button_list[r][c].place_forget()
        show_list[r][c]=1
        t+=1
    elif(control_list[r][c]==0):
        rec(r,c)
    elif(control_list[r][c]==-1 and T):
        button_list[r][c].place_forget()
        show_list[r][c]=1
        T=0
        for i in range(16):
            for j in range(16):
                if(control_list[i][j]==-1):
                    button_list[i][j].place_forget()
                    show_list[r][c]=1
        button_restart["text"]="☹"
        messagebox.showwarning("失败","你已经被炸死了!")
    if t==216:
            T=0
            messagebox.showwarning("成功","恭喜你扫雷完成!")
def button_control_r(event):
    r = int(event.widget["text"])//16
    c = int(event.widget["text"])%16
    mark_list[r][c]=Button(root,text="?",font=('楷体', 14),activeforeground="#AAAAAA",bg="#AAAAAA",fg="yellow")
    mark_list[r][c].place(x=17+c*20,y=46+r*20,height=20,width=20)
    mark_list[r][c].bind("<Button-3>",button_control_r_change)
def button_control_r_change(event):
    global num_mine
    if (event.widget["text"]=="?" and num_mine>0):
        num_mine-=1
        event.widget["text"]="▲"
        cout_label["text"]=str(num_mine)
    elif(event.widget["text"]=="▲"):
        num_mine+=1
        cout_label["text"]=str(num_mine)
        event.widget.place_forget()
    elif (event.widget["text"]=="?" and num_mine==0):
        event.widget.place_forget()
def rec(r,c):#递归探测
    global t
    if control_list[r][c]>0 and show_list[r][c]==0:
        button_list[r][c].place_forget()
        show_list[r][c]=1
        t+=1
        return 0
    elif control_list[r][c] ==0 and show_list[r][c]==0:
        button_list[r][c].place_forget()
        show_list[r][c]=1
        t+=1
        if r>0 and c>0:
            rec(r-1,c-1)
        if r>0:
            rec(r-1,c)
        if r>0 and c<15:
            rec(r-1,c+1)
        if c<15:
            rec(r,c+1)
        if r<15 and c<15:
            rec(r+1,c+1)
        if r<15:
            rec(r+1,c)
        if r<15 and c>0:
            rec(r+1,c-1)
        if c>0:
            rec(r,c-1)
def time_counter(la):  # la是标签,计时函数
    def counting():
        global counter
        if T:
            counter += 1
        la["text"]=str(counter)
        la.after(1000,counting)  # 在1000毫秒后执行counting()函数,即循环执行counting
    counting()
def restart():#重新开始函数
    button_restart["text"]="☺"
    cout_label["text"]="40"
    #数据重置
    for i in range(16):
        for j in range(16):
            control_list[i][j]=0
            show_list[i][j]=0
            button_list[i][j].place_forget()
            button_list[i][j]=0
            label_list[i][j].place_forget()
            label_list[i][j]=0
            if (mark_list[i][j]!=0):
                mark_list[i][j].place_forget()
            mark_list[i][j]=0
    global num_mine
    global counter
    global T ,t
    num_mine=40
    counter=0
    T ,t= 1,0
    game_core()
if __name__ =="__main__":
    
    root = Tk()#根窗体
    root.title("扫雷小游戏")
    root.geometry("360x410")#根窗体大小
    cv1 = canvas(root,bd=15,bg="#FFFFFF",relief=RIDGE,cursor="cross",width=321,height=350)
    cv1.create_line(15,45,337,45)
    cv1.place(x=0,y=0)
    w=Label(root,text="你所作的选择,决定你的命运!",font=("楷体",12))
    w.place(x=60,y=385)
    button_restart=Button(root,text="☺",font=('楷体', 15),bg="#AAAAAA",fg="yellow",command=restart)
    button_restart.place(x=150,y=17,height=27,width=27)
    time_label = Label(root,bg="black",fg="red",text=str(counter),font=("LcdD",15))#计时标签
    time_label.place(x=285,y=17,height=27,width=50)
    cout_label = Label(root,bg="black",fg="red",text="40",font=("LcdD",20))#计数标签
    cout_label.place(x=18,y=17,height=27,width=27)
    game_core()
    time_counter(time_label)
    root.mainloop()#监控组件,组件发生变化或触发事件时,更新窗口

总结

扫雷的思路简单,但编写这个程序仍然花费了我比较长的时间,究其原因:初次接触Python的GUI编程,对各个控件的方法等不熟悉,且没有能够充分的查找资料,在面对问题时处理思路局限。编程世界,道路漫长遥远。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: python GUI编程实现扫雷游戏

本文链接: https://www.lsjlt.com/news/118620.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python GUI编程实现扫雷游戏
    目录前言一、基本思路二、源代码1.运行效果2.上源码总结前言 1992年扫雷被加入到windows3.1,成为早期windows的经典游戏。近来接触python的GUI(图形化)编程...
    99+
    2022-11-11
  • C语言编程实现扫雷游戏
    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 在我们熟知的扫雷中,我们点击小方块,小方块要么出现数字,要么遇到地雷。我打算,使用数组的方式来完成扫雷游戏...
    99+
    2022-11-12
  • Python实现简单扫雷游戏
    本文实例为大家分享了Python实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 #coding: utf-8 __note__ = """ * 扫雷小游戏 * 需要pytho...
    99+
    2022-11-11
  • C#实现扫雷游戏
    目录一、实验目的:二、实验要求:三、实验内容:四、实验源代码:五、实验结果:六、总结本文实例为大家分享了C#实现扫雷游戏的具体代码,供大家参考,具体内容如下 一、实验目的: 1、掌握...
    99+
    2022-11-13
  • Easyx实现扫雷游戏
    本文实例为大家分享了Easyx实现扫雷游戏的具体代码,供大家参考,具体内容如下 代码: #include<stdio.h> #include<stdlib.h&g...
    99+
    2022-11-12
  • C语言编程怎么实现扫雷游戏
    这篇文章主要讲解了“C语言编程怎么实现扫雷游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言编程怎么实现扫雷游戏”吧!在我们熟知的扫雷中,我们点击小方块,小方块要么出现数字,要么遇到地...
    99+
    2023-06-20
  • JavaScript实现扫雷小游戏
    本文实例为大家分享了JavaScript实现扫雷小游戏的具体代码,供大家参考,具体内容如下 先说大体思路,下面放代码 思路: 1产生指定数量的地雷2计算方块周围的地雷3点击地雷结束4...
    99+
    2022-11-13
  • jQuery实现扫雷小游戏
    本文实例为大家分享了jQuery实现扫雷小游戏的具体代码,供大家参考,具体内容如下 扫雷小游戏实现思路: 设计为9*9简单面板,每次随机生成10颗雷,然后计算每颗雷周围八个位置上每个...
    99+
    2022-11-13
  • 用java实现扫雷游戏
    用java做出简单一个扫雷游戏,供大家参考,具体内容如下 1.创造窗口 //创建扫雷窗口界面       public Saolei() {                     ...
    99+
    2022-11-13
  • Python如何实现简单扫雷游戏
    本篇内容介绍了“Python如何实现简单扫雷游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体代码如下#coding: utf...
    99+
    2023-07-02
  • 微信小程序实现扫雷游戏
    本文实例为大家分享了微信小程序实现扫雷游戏的具体代码,供大家参考,具体内容如下 实验小提醒,打开微信小程序模板时,一定要看清楚,要选js模板,不要选ts模板,因为ts中对数据类型检查...
    99+
    2022-11-13
  • java实现扫雷游戏入门程序
    本文实例为大家分享了java实现扫雷游戏入门程序的具体代码,供大家参考,具体内容如下 分析: 1.首先布一个10*10的雷阵,即二维数组map,每个地方都为0 2.再在雷阵中随机选取...
    99+
    2022-11-13
  • java如何实现扫雷游戏程序
    本篇内容介绍了“java如何实现扫雷游戏程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分析:首先布一个10*10的雷阵,即二维数组map...
    99+
    2023-07-01
  • C语言扫雷排雷小游戏实现全程
    目录test.cgame.hgame.c详解游戏代码的实现1初化扫雷区2打印扫雷区3 设置雷4 排雷4.1展开一片的功能4.2雷标记功能的实现游戏过程test.c 在这个文件中,我们...
    99+
    2022-11-13
  • J2ME怎么实现扫雷游戏
    这篇文章主要介绍“J2ME怎么实现扫雷游戏”,在日常操作中,相信很多人在J2ME怎么实现扫雷游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”J2ME怎么实现扫雷游戏”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-03
  • C#如何实现扫雷游戏
    今天小编给大家分享一下C#如何实现扫雷游戏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、实验目的:掌握c#窗体和控件的常...
    99+
    2023-07-02
  • js实现经典扫雷游戏
    本文实例为大家分享了js实现经典扫雷游戏的具体代码,供大家参考,具体内容如下 项目结构 实现效果 思路流程 1、写出基本的布局 2、利用js生成扫雷的table表格 3、利用随...
    99+
    2022-11-12
  • C++实现趣味扫雷游戏
    本文实例为大家分享了C++实现趣味扫雷游戏的具体代码,供大家参考,具体内容如下 流程设计 1.初始化阵列。 2.输入坐标点。 3.选择:挖掘,标记,取消标记,重启,退出游戏。 如果选...
    99+
    2022-11-12
  • Vue2+JS实现扫雷小游戏
    目录实现步骤1、场景布局实现2、初始化事件3、游戏动作(action)游戏收尾总结实现步骤 1、场景布局实现 布局就是经典的方格布局,对于场景的美观度可以自行找几个配色网站作为参考。...
    99+
    2022-11-13
  • Easyx如何实现扫雷游戏
    今天给大家介绍一下Easyx如何实现扫雷游戏。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。代码:#include<stdio.h>#include...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作