【tkinter】用不到50行Python代码,写一个扫雷小游戏
生活随笔
收集整理的這篇文章主要介紹了
【tkinter】用不到50行Python代码,写一个扫雷小游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 定制按鈕
- 生成雷區
- 主流程
Tkinter系列:
- GUI初步💎布局💎綁定變量💎綁定事件💎消息框
- 掃雷小游戲💎強行表白神器
定制按鈕
學會了布局和綁定事件,就可以開發一些簡單的應用,比如掃雷小游戲。從外觀來看,掃雷就是一個按鈕矩陣,左鍵點擊按鈕,如果按鈕里埋了雷,那么就游戲結束,否則繼續游戲。
所以第一步,是對按鈕進行定制
import tkinter as tk from itertools import productdef 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.shapei0, 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 showerrordef clickRight(evt, txt):if txt.get() == "🚩": txt.set("")else: txt.set("🚩")def clickLeft(i, j):if txtLst[i][j].get() != "":returnflag = mineNumber(mat, i, j)txtLst[i][j].set(flag)if flag == "💥":showerror("", "你輸了!")if flag != "0":returni0, 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()效果為
這個掃雷還有一些不足之處,最顯而易見的就是旗幟和雷的顏色,這一點其實很好辦,只要改下前景就行。另外一點就是,并沒有提供一個按鈕用于改變雷區和難度,對于這點,最簡單的方法既是來一個參數對話框,這個內容接下來就講。
總結
以上是生活随笔為你收集整理的【tkinter】用不到50行Python代码,写一个扫雷小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝牙mesh- Features和设备类
- 下一篇: 【WPF】用100行C#代码实现扫雷