日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2024/1/8 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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代码,写一个扫雷小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。