【tkinter】用不到50行Python代码,写一个扫雷小游戏

news2024/11/22 9:24:37

文章目录

    • 定制按钮
    • 生成雷区
    • 主流程

基础知识:

  • StringVar
  • tkinter布局

定制按钮

学会了布局和绑定事件,就可以开发一些简单的应用,比如扫雷小游戏。从外观来看,扫雷就是一个按钮矩阵,左键点击按钮,如果按钮里埋了雷,那么就游戏结束,否则继续游戏。

所以第一步,是对按钮进行定制

import tkinter as tk
from itertools import product

def clickRight(evt, txt):
    if txt.get() == "🚩":
        txt.set("")
    else:
        txt.set("🚩")

def clickLeft(evt, txt, isMine):
    if isMine:
        txt.set("💥")
    else:
        txt.set(" ")

def setMine(root, i, j, isMine=False):
    txt = tk.StringVar()
    btn = tk.Button(root, width=5, height=2,
        textvariable=txt)
    btn.grid(row=i,column=j)
    btn.bind("<Button-3>", lambda evt: clickRight(evt, txt))
    btn.bind("<Button-1>", lambda evt: clickLeft(evt, txt, isMine))

root = tk.Tk()
root.title("扫雷")
for i,j in product(range(5), range(8)):
    setMine(root, i, j, True)

root.mainloop()

效果如下,总共设置了40个按钮,每个按钮都是雷。

在这里插入图片描述

生成雷区

接下来要做的有两件事,一是随机生成一片雷区,二是引发雷的连锁反应,当点击一个按钮,如果这个按钮不是雷,那么会显示这个按钮周围的雷的个数。

随机雷区可以通过矩阵实现

import numpy as np
def setMineMat(M, N, r):
    mat = np.random.rand(M, N)
    return mat > r

其中mat是一个范围在0到1之间均匀分布的矩阵,其返回值是一个布尔型矩阵,True为雷,False为非雷,所以r越大,则True值越少,雷也就越少,也就越简单。

然后实现第二个需求,当左键点击按钮后,按钮显示的值,

def mineNumber(mat, i, j):
    if mat[i,j] == True:
        return "💥"
    M, N = mat.shape
    i0, i1 = max(0, i-1), min(M, i+2)
    j0, j1 = max(0, j-1), min(N, j+2)
    num = np.sum(mat[i0:i1, j0:j1])
    return str(num)

在这个基础上,更改左键单击的逻辑,除了点击之后显示的内容发生变化之外,若该点为雷,则弹出失败框;若该点为0,则将该点周围所有点全部翻面。

from tkinter.messagebox import showerror

def clickRight(evt, txt):
    if txt.get() == "🚩": txt.set("")
    else: txt.set("🚩")

def clickLeft(i, j):
    if txtLst[i][j].get() != "":
        return
    flag = mineNumber(mat, i, j)
    txtLst[i][j].set(flag)
    if flag == "💥":
        showerror("", "你输了!")
    if flag != "0":
        return
    i0, i1 = max(0, i-1), min(M, i+2)
    j0, j1 = max(0, j-1), min(N, j+2)
    for i,j in product(range(i0,i1), range(j0, j1)):
        clickLeft(i, j)

重新写一下生成雷区的逻辑,按钮绑定了两个事件,分别在左键点击和右键点击时触发。

def setMine(root, i, j):
    txt = tk.StringVar()
    btn = tk.Button(root, width=5, height=2,
        textvariable=txt)
    btn.grid(row=i,column=j)
    btn.bind("<Button-3>", lambda evt: clickRight(evt, txt))
    btn.bind("<Button-1>", lambda evt: clickLeft(i, j))
    return txt

主流程

最后,写一下主流程

root = tk.Tk()
root.title("扫雷")

M, N, r  = 6, 10, 0.8
mat = setMineMat(M, N, r)
txtLst = [[] for _ in range(M)]
for i,j in product(range(M), range(N)):
    txt = setMine(root, i, j)
    txtLst[i].append(txt)

root.mainloop()

效果为

在这里插入图片描述
这个扫雷还有一些不足之处,最显而易见的就是旗帜和雷的颜色,这一点其实很好办,只要改下前景就行。另外一点就是,并没有提供一个按钮用于改变雷区和难度,对于这点,最简单的方法既是来一个参数对话框,这个内容接下来就讲。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

myBaits Target Capture Kits;myBaits 靶向捕获试剂盒,快速捕获富集目标序列

myBaits Target Capture Kits可以快速捕获富集目标序列&#xff0c;提高NGS研究效率&#xff0c;兼容Illumina&#xff0c;PacBio 和 Nanopore等多种测序平台。Arbor Biosciences使用oligo合成专利技术&#xff0c;为您提供高质量、高性价比的捕获试剂盒。适用于各种基因组类型…

pytest简介

介绍pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个特点&#xff1a;简单灵活&#xff0c;容易上手支持参数化能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequ…

我写了一个脚本,实现了图片分类问题模型训练的全自动化训练

众所周知,图片分类问题属于计算机视觉中比较容易解决的问题之一 但 这几天被数据集的问题搞得焦头烂额, 照理说分类问题的数据集应该比较好制作 但 如果之前没有现成的数据集 也会变得比较麻烦 直到我偶然发现了一个HuggingFace的图片搜索API 无限次调用 而且不需要身份验证 真…

如何实现报表集成?(五)——集成案例分享

在前面几篇&#xff0c;我们分别给大家介绍了报表工具的系统集成架构、用户同步/单点登录、资源集成和权限集成&#xff0c;从整体上对报表工具实现系统集成的各个方面都作了针对性的阐述。那别的用户实际上是如何做报表集成的呢&#xff1f; 这一篇&#xff0c;我们来看一下某…

408—二叉树与树

二叉树的一些概念&#xff1a;//二叉树有严格的左右子树之分&#xff0c;度数为2的树则没有对此进行要求。常见的两种二叉树&#xff1a;//如上E为满二叉树&#xff0c;每一层的结点个数都达到了当层能达到的最大结点数//满二叉树自上而下&#xff0c;从左到右依次进行编号&…

易于理解的完全立方体计算的多路数组聚集方法

自己琢磨半天终于搞懂了&#xff0c;可能是自己悟性不够吧-_-|| 多路数组聚集其实就是对维度(dimension)进行选择&#xff0c;保留一些常用的可以很方便地生成别的子立方体的立方体(cube)。对一个维做聚集(aggregation)其实就是按照这个维度的方向做加法&#xff0c;把这个维度…

Linux下的动静态库及链接

目录 常识 动态链接 静态链接 两者的比较 动态库与静态库 常识 我们平时写的代码和标准库是两回事&#xff0c;像C标准库提供给我们一些函数方便使用&#xff0c;降低程序员工作成本。比如写个printf("hello world"); 我们只是调用了库里的函数&#xff0c;并没…

字节跳动“技穷”,火山引擎“啃老”

文丨智能相对论作者丨沈浪「云」的赛道正在细化&#xff0c;是显而易见的趋势&#xff0c;诸如汽车云、营销云、视频云、零售云等等&#xff0c;大致可以理解为通过云计算等技术推动特定行业场景实现数字化转型的解决方案。之所以出现这种情况&#xff0c;存在多个层面的原因&a…

Kubernetes部署Postgresql

环境&#xff1a;Postgresql的Docker镜像 ->参考Docker安装部署PostgresqlCentos7.x kubernetes1.23.7 docker1.13.1 postgres12.7pg的docker镜像已经上传到云平台。Kubernetes参考&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap基本命…

Youngter-drive 题解

1.查壳 32bit&#xff0c;加了UPX壳 2.虚拟机脱壳 Youngter-drive脱壳3.静态分析寻找思路 跟进main_0函数 线程控制的知识不懂&#xff0c;去搜一下函数 createMutexW 函数 创建或打开命名或未命名的互斥对象。 HANDLE CreateMutexW( [in, optional] LPSECURITY_ATTRIBUTES lp…

通信原理笔记—部分响应基带传输系统

目录 基本设计思想&#xff1a; 问题的引入与考虑&#xff1a; 第一类部分响应系统: 定义奈奎斯特脉冲: 定义第一类部分响应系统的冲激响应: 第一类部分响应系统冲激响应与频率特性波形图: 第一类部分响应系统信号波形示例&#xff1a; 编码发送与接收解码过程示例: 第…

Biome-BGC生态系统模型与Python融合技术实践应用

查看原文>>> Biome-BGC生态系统模型与Python融合技术实践应用 Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中&#xf…

Tomcat 源码启动

要想学习 Tomcat 原理&#xff0c;看源码是最直接的方式&#xff0c;而想要理解源码&#xff0c;我们要想把它在本地跑起来。 下载源码 到 Tomcat 的官网 http://tomcat.apache.org 上下载 Tomcat 的源码 下载下来是一个压缩包文件 解压之后目录结构如下 用IDEA打开 在…

redis集群管理工具HHDBCS

参考地址: HHDBCS下载地址 Redis教程 1 快速介绍 1.1 什么是HHDBCS&#xff1f; HHDBCS是恒辉信达公司推出的通用数据库管理桌面工具&#xff0c;专为简化数据库的管理及数据管理成本而设计&#xff0c;让用户通过统一的桌面视图管理成千上万的异构数据库实例。 它采用了…

【Feign】Spring框架集成Feign

Spring框架集成Feign1、Feign-简介2、spring-cloud快速整合OpenFeign3、Feign日志4、Feign契约配置5、Feign配置超时时间6、Feign拦截器7、Feign断路器1、Feign-简介 Feign是Neflix开发的声明式、模块化的HTTP客户端&#xff0c;集成了Ribbon、RestTemplate实现了负载均衡的执…

快收藏,2023有这些财务分析模板就够了

相信很多的财务人都才刚刚经历一个兵荒马乱的年终&#xff0c;各种核算、整理、分析&#xff0c;工作量直线上升&#xff0c;说不定加班几点半个月都未必能歇一下。但不用担心&#xff0c;在接下来的2023里&#xff0c;可以通过BI财务分析报表模板来高效解决这些问题。 BI软件…

[python][VTK]vtk安装后测试代码

测试vtk版本为9.2.5 import vtk cone_a vtk.vtkConeSource() coneMapper vtk.vtkPolyDataMapper() coneMapper.SetInputConnection(cone_a.GetOutputPort()) coneActor vtk.vtkActor() coneActor.SetMapper(coneMapper) ren1 vtk.vtkRenderer() ren1.AddActor(coneActor…

黑马点评项目要点内容总结【面试用】

小众点评项目要点 文章目录小众点评项目要点1.使用Redis代替Session登录1.1 Session登录存在的问题1.2 使用Redis代替Session登录分析1.3 使用Redis登录的流程1.4 解决Redis中有效期问题2.使用Redis作为缓存2.1 为什么使用缓存2.2 缓存策略2.3 解决缓存穿透2.4 解决缓存雪崩2.5…

熵值法原理及python实现 附指标编制案例

文章目录1.简单理解 信息熵2.编制指标 &#xff08;学术情景应用&#xff09;3.python实现3.1 数据准备3.2 数据预处理3.3 熵值、权重计算3.4 编制综合评价指标熵值法也称熵权法&#xff0c;是学术研究&#xff0c;及实际应用中的一种常用且有效的编制指标的方法。1.简单理解 信…

在数组中删除重复数字(详解)

前言&#xff1a;本期是关于删除重复数字的详解&#xff0c;今天你c了吗&#xff1f; 方法&#xff1a; 双指针 以一组数&#xff1a;3 4 1 0 0 2 3 1 1 2 为例删除重复的数字 step 1&#xff1a;排序 使用双下标法的前提是数组有序&#xff08;降序or升序&#xff09; 可以使…