Python和tkinter實現的字母記憶配對游戲

Python和tkinter實現的字母記憶配對游戲

因為這個小游戲用到了tkinter,先簡要介紹一下它。tkinter是Python的標準GUI(圖形用戶界面)庫,它提供了一種簡單而強大的方式來創建圖形界面應用程序。它提供了創建基本圖形界面所需的所有工具,同時保持了相對簡單的學習曲線。tkinter是Python的內置庫,無需額外安裝。

messagebox是tkinter中用于創建各種類型的消息對話框的模塊,需要注意的是messagebox是tkinter的一個子模塊。為了正確使用messagebox,你需要從tkinter中單獨導入它。

這個小游戲具有重新開始和難度設置功能。

“游戲”菜單,包含“新游戲”選項,點擊它或完成一局游戲后,會自動開始新游戲。

“難度”菜單,難度設置,包含簡單、中等和困難三個選項。

簡單難度: 4x2 網格,8個方塊

中等難度: 4x3 網格,12個方塊

困難難度: 4x4 網格,16個方塊

運行界面:

現在Python和tkinter實現字母記憶配對游戲源碼,先看使用面向過程風格的版本源碼:

import tkinter as tk
import tkinter.messagebox 
import randomdef setup_menu(root, difficulty, new_game_func):"""設置游戲菜單"""menubar = tk.Menu(root)root.config(menu=menubar)# 創建"游戲"菜單game_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="游戲", menu=game_menu)game_menu.add_command(label="新游戲", command=new_game_func)# 創建"難度"菜單difficulty_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="難度", menu=difficulty_menu)difficulty_menu.add_radiobutton(label="簡單", variable=difficulty, value="簡單", command=new_game_func)difficulty_menu.add_radiobutton(label="中等", variable=difficulty, value="中等", command=new_game_func)difficulty_menu.add_radiobutton(label="困難", variable=difficulty, value="困難", command=new_game_func)def create_button(frame, row, col, on_click_func):"""創建游戲按鈕"""button = tk.Button(frame, text='', width=10, height=5, command=lambda: on_click_func(row, col))button.grid(row=row, column=col, padx=5, pady=5)return buttondef new_game():"""開始新游戲"""global matches_found, first_click, buttons, symbolsmatches_found = 0first_click = None# 清除舊的游戲布局for widget in frame.winfo_children():widget.destroy()buttons = []# 根據難度設置游戲布局和符號if difficulty.get() == "簡單":rows, cols = 4, 2symbols = ['A', 'B', 'C', 'D'] * 2elif difficulty.get() == "中等":rows, cols = 4, 3symbols = ['A', 'B', 'C', 'D', 'E', 'F'] * 2else:  # 困難rows, cols = 4, 4symbols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] * 2random.shuffle(symbols)# 創建游戲按鈕for i in range(rows):for j in range(cols):button = create_button(frame, i, j, on_click)buttons.append(button)def on_click(row, col):"""處理按鈕點擊事件"""global first_click, matches_foundindex = row * len(frame.grid_slaves()) // 4 + colbutton = buttons[index]if button['text'] == '':button['text'] = symbols[index]if first_click is None:first_click = (index, button)else:if symbols[index] == first_click[1]['text']:matches_found += 1if matches_found == len(symbols) // 2:tk.messagebox.showinfo("恭喜", "你贏了!")new_game()else:# 如果不匹配,0.5秒后隱藏按鈕root.after(500, hide_buttons, index, first_click[0])first_click = Nonedef hide_buttons(index1, index2):"""隱藏不匹配的按鈕"""buttons[index1]['text'] = ''buttons[index2]['text'] = ''# 主程序
root = tk.Tk()
root.title("字母記憶配對游戲")
root.geometry("400x450")  # 設置窗口的寬度為400像素,高度為450像素difficulty = tk.StringVar()
difficulty.set("簡單")  # 默認難度為簡單frame = tk.Frame(root)
frame.pack()setup_menu(root, difficulty, new_game)# 初始化游戲變量
matches_found = 0
first_click = None
buttons = []
symbols = []new_game()  # 開始第一局游戲root.mainloop()  # 啟動主事件循環

上面是使用面向過程風格的版本,下面改寫為使用面向對象風格的版本,源碼如下:

import tkinter as tk
import tkinter.messagebox 
import randomclass MemoryGame:def __init__(self, master):self.master = masterself.master.title("字母記憶配對游戲")self.master.geometry("400x450") #設置了窗體的寬度為400像素,高度為450像素self.buttons = []self.first_click = Noneself.matches_found = 0self.difficulty = tk.StringVar()self.difficulty.set("簡單")self.setup_menu()self.setup_game()def setup_menu(self):menubar = tk.Menu(self.master)self.master.config(menu=menubar)game_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="游戲", menu=game_menu)game_menu.add_command(label="新游戲", command=self.new_game)difficulty_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="難度", menu=difficulty_menu)difficulty_menu.add_radiobutton(label="簡單", variable=self.difficulty, value="簡單", command=self.new_game)difficulty_menu.add_radiobutton(label="中等", variable=self.difficulty, value="中等", command=self.new_game)difficulty_menu.add_radiobutton(label="困難", variable=self.difficulty, value="困難", command=self.new_game)def setup_game(self):self.frame = tk.Frame(self.master)self.frame.pack()self.new_game()def new_game(self):self.matches_found = 0self.first_click = Nonefor widget in self.frame.winfo_children():widget.destroy()self.buttons = []if self.difficulty.get() == "簡單":rows, cols = 4, 2symbols = ['A', 'B', 'C', 'D'] * 2elif self.difficulty.get() == "中等":rows, cols = 4, 3symbols = ['A', 'B', 'C', 'D', 'E', 'F'] * 2else:  # 困難rows, cols = 4, 4symbols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] * 2random.shuffle(symbols)for i in range(rows):for j in range(cols):button = tk.Button(self.frame, text='', width=10, height=5, command=lambda x=i, y=j: self.on_click(x, y))button.grid(row=i, column=j, padx=5, pady=5)self.buttons.append(button)self.symbols = symbolsdef on_click(self, row, col):index = row * len(self.frame.grid_slaves()) // 4 + colbutton = self.buttons[index]if button['text'] == '':button['text'] = self.symbols[index]if self.first_click is None:self.first_click = (index, button)else:if self.symbols[index] == self.first_click[1]['text']:self.matches_found += 1if self.matches_found == len(self.symbols) // 2:tk.messagebox.showinfo("恭喜", "你贏了!")self.new_game()else:# 如果不匹配,0.5秒后隱藏按鈕self.master.after(500, self.hide_buttons, index, self.first_click[0])self.first_click = Nonedef hide_buttons(self, index1, index2):self.buttons[index1]['text'] = ''self.buttons[index2]['text'] = ''root = tk.Tk()
game = MemoryGame(root)
root.mainloop()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36710.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OSI七層模型TCP/IP四層面試高頻考點

OSI七層模型&TCP/IP四層&面試高頻考點 1 OSI七層模型 1. 物理層:透明地傳輸比特流 在物理媒介上傳輸原始比特流,定義了連接主機的硬件設備和傳輸媒介的規范。它確保比特流能夠在網絡中準確地傳輸,例如通過以太網、光纖和無線電波等媒…

什么是有效的電子簽名?PDF電子簽名怎樣具備法律效力?

電子簽名逐漸成為商務文書和法律文件中不可或缺的一部分。《電子簽名法》自2005年4月1日起施行,這一立法是中國信息化法律的重要里程碑,為電子簽名應用奠定了法律基礎。電子簽名不僅僅是一種技術手段,更是一種法律認可的簽名形式。那么究竟什…

js生成UUID確保數據的唯一性

在JavaScript中,生成UUID(Universally Unique Identifier)通常用于確保數據的唯一性。 以下是一個簡單的使用JavaScript生成UUID的示例,它基于RFC 4122版本4(隨機UUID)的算法: function gener…

Python私教張大鵬 PyWebIO通過事件回調實現表格的編輯和刪除功能

從上面可以看出,PyWebIO把交互分成了輸入和輸出兩部分:輸入函數為阻塞式調用,會在用戶瀏覽器上顯示一個表單,在用戶提交表單之前輸入函數將不會返回;輸出函數將內容實時輸出至瀏覽器。這種交互方式和控制臺程序是一致的…

學習TTS遇到的問題2 什么是TCN模型

學習TTS遇到的問題2 什么是TCN模型 什么是TCN模型怎么理解 TCN中的 dilation?什么是 Dilation具體例子數學表達作用例子代碼示例 什么是TCN模型 https://juejin.cn/post/7262269863343079479 https://blog.csdn.net/weixin_57726558/article/details/132163074 由下…

出手便是王炸,曙光存儲將高端存儲推向新高度

二十年磨一劍,今朝試鋒芒。 近日,曙光存儲重磅發布全球首個億級IOPS集中式全閃存儲FlashNexus,正式宣告進入高端存儲市場。 作為存儲產業皇冠上的明珠,高端存儲一向以技術難度大、市場準入門檻高和競爭格局穩定著稱,…

從0-1搭建一個web項目(package.json)詳解

本章分析package.json文件詳解 本文主要對packge.json配置子文件詳解 ObJack-Admin一款基于 Vue3.3、TypeScript、Vite3、Pinia、Element-Plus 開源的后臺管理框架。在一定程度上節省您的開發效率。另外本項目還封裝了一些常用組件、hooks、指令、動態路由、按鈕級別權限控制等…

Centos7源碼方式安裝sqle及開發相關

官方文檔-源碼安裝 操作系統:centos:7.9,everything (DVD版應該也可以) (在ubuntu22.04裝了兩天之后乖乖開了一個新Centos7虛擬機) 鏡像:清華大學開源軟件鏡像站 centos/7.9.2009 安裝git sudo yum update -y sudo yum install -y git git --version安…

數據結構與算法筆記:高級篇 - B+樹:MySql數據庫索引是如何實現的?

概述 作為一名軟件開發工程師,你對數據庫肯定再熟悉不過了。MySQL 作為主流的數據庫存儲系統,它在我們的業務開發中,有著舉足輕重的地位。在工作中,為了加速數據庫中數據的查找速度,我們常用的處理思路是,…

01.Ambari自定義服務開發-項目初始化

文章目錄 基礎環境在PyCharm中初始化項目配置項目相關依賴在PyCharm中導入依賴 基礎環境 PyCharmPython 2.7已經安裝完成的Ambari服務端 在PyCharm中初始化項目 項目名稱就是我們要安裝服務的名稱,要求名稱為全大寫,如:DORIS創建Python2.7…

如何實現機房的自動化運維-青島佰優聯

要讓機房更穩定地實現自動化運維,可以參考以下幾點建議: 一、實施自動化運維工具和技術 1. 配置管理工具: - 使用如Ansible、Puppet、Chef等開源的自動化運維工具,進行服務器配置的管理。這些工具可以幫助管理員快速部署、更…

龍迅LT8711V TYPE-CDP 1.2轉VGA芯片,內置MCU,成熟批量產品

龍迅LT8711V描述: LT8711V是一種高性能的Type-C/DP1.2到VGA轉換器,設計用于連接USB Type-C源或DP1.2源到VGA接收器。LT8711V集成了一個DP1.2兼容的接收器,和一個高速三通道視頻DAC。此外,還包括兩個CC控制器,用于CC通…

XML selectNodes 模糊查找

public static XmlElement[] FuzzyFindNode(string xmlPath, string key, string valuenull){XmlDocument xmlDoc new XmlDocument();xmlDoc.Load(xmlPath); string xpath $"//節點名字[contains({key},{value})]"; XmlNodeList nodes xmlDoc.SelectNodes(xpath)…

圖像大小調整(縮放)

尺寸調整前尺寸調整前 1、背景介紹 在深度學習中,將圖像調整到固定尺寸(如28x28像素)的操作是非常常見的,尤其是在處理諸如圖像分類、物體檢測和圖像分割等任務時。這種操作有幾個重要原因: 標準化輸入:許…

【可控圖像生成系列論文(五)】ControlNet 和 IP-Adapter 之間的區別有哪些?

系列文章目錄 【可控圖像生成系列論文(一)】 簡要介紹了 MimicBrush 的整體流程和方法;【可控圖像生成系列論文(二)】 就MimicBrush 的具體模型結構、訓練數據和紋理遷移進行了更詳細的介紹。【可控圖像生成系列論文&…

【漏洞復現】銳捷統一上網行為管理與審計系統——遠程命令執行漏洞

聲明:本文檔或演示材料僅供教育和教學目的使用,任何個人或組織使用本文檔中的信息進行非法活動,均與本文檔的作者或發布者無關。 文章目錄 漏洞描述漏洞復現測試工具 漏洞描述 銳捷統一上網行為管理與審計系統naborTable/static_convert.php…

如何應對瀏覽器提示的“存在不安全腳本”問題

哈嘍呀,大家好,淼淼又來和大家見面啦,咱們在互聯網瀏覽過程中,您或許會遇到瀏覽器彈出的安全警告,提示頁面中包含“不安全腳本”。這樣的信息往往讓人心生警惕,擔心自己的隱私和數據安全受到威脅。本文將為…

Linux系統編程(七)進程間通信IPC

進程間通訊的7種方式_進程間通信的幾種方法-CSDN博客 管道 pipe(命名管道和匿名管道);信號 signal;共享內存;消息隊列;信號量 semaphore;套接字 socket; 1. 管道 內核提供&#x…

Hive基礎知識(二十三):數據傾斜優化

絕大部分任務都很快完成,只有一個或者少數幾個任務執行的很慢甚至最終執行失敗, 這樣的現象為數據傾斜現象。 一定要和數據過量導致的現象區分開,數據過量的表現為所有任務都執行的很慢,這個 時候只有提高執行資源才可以優化 HQL…

Arduino平臺軟硬件原理及使用——SR04超聲波傳感器的使用

文章目錄: 一、超聲波傳感器工作原理 二、SR04超聲波庫的使用 三、SR04超聲波傳感器在Arduino中的使用 一、超聲波傳感器工作原理 如上圖所示:HCSR04超聲波傳感器擁有4個針腳,除了VCC接正極、GND接負極外,還有兩個引腳“Trig”及“…