用Python寫一個算24點的小程序

一、運行界面

二、顯示答案——遞歸介紹

工作流程:

1. 基本情況:函數首先檢查輸入的數字列表 nums 的長度。如果列表中只剩下一個數字,它會判斷這個數字是否接近 24(使用 abs(nums[0] - 24) < 1e-10 來處理浮點數精度問題)。如果是,它返回 True 和這個數字的字符串表示;否則返回 False 和空字符串。

2. 遞歸組合:如果列表中有多個數字,函數會通過雙重循環選擇兩個數字 a 和 b(nums[i] 和 nums[j]),并從列表中移除這兩個數字,形成一個新的數字列表 remaining。

3. 運算符嘗試:接下來,函數會遍歷定義的運算符字典 ops,對選中的兩個數字進行運算。對于每個運算符,函數會嘗試計算 result = ops[op](a, b)。如果運算符是除法,還會檢查除數 b 是否為零,以避免除以零的錯誤。

4. 遞歸調用:如果運算成功,函數會遞歸調用 evaluate,將計算結果 result 和剩余的數字列表 remaining 組合成新的列表進行下一輪計算。如果在遞歸中找到了有效的解法,函數會返回成功的標志和相應的算式字符串。

5. 返回結果:如果所有組合都嘗試過后仍未找到解法,函數會返回 False 和空字符串。

以輸入數字[4, 2, 3, 1]為例:

步驟操作說明
1選擇4和1進行加法運算 → 5剩余數字變為[2, 3, 5]
2選擇5和3進行乘法運算 → 15剩余數字變為[2, 15]
3選擇15和2進行減法運算 → 13未滿足24,回溯嘗試其他路徑
4找到有效路徑如 (4*(3*(2/1)))最終返回算式字符串?

三、完整代碼

"""
24點游戲
這是一個使用tkinter開發的24點游戲,玩家需要使用給定的4個數字和基本運算符(+、-、*、/)計算出24。
"""import tkinter as tk
from tkinter import messagebox
import random
import itertools
import operatorclass TwentyFourGame:"""24點游戲的主類負責創建游戲界面、處理游戲邏輯和用戶交互"""def __init__(self):"""初始化游戲窗口和基本設置創建主窗口、設置樣式、初始化游戲變量"""self.window = tk.Tk()self.window.title("24點游戲")self.window.geometry("400x500")self.window.configure(bg="#f0f0f0")# 設置界面樣式self.style = {'bg': "#f0f0f0",  # 背景色'button_bg': "#4CAF50",  # 按鈕背景色'button_fg': "white",  # 按鈕文字顏色'font': ("Arial", 12),  # 字體設置'entry_bg': "white",  # 輸入框背景色'entry_fg': "black"  # 輸入框文字顏色}# 創建游戲界面組件self.create_widgets()# 初始化游戲數據self.numbers = []  # 存儲當前游戲的4個數字self.solution = ""  # 存儲當前游戲的解法self.new_game()  # 開始新游戲def create_widgets(self):"""創建游戲界面的所有組件包括標題、數字顯示區、輸入框、按鈕等"""# 創建游戲標題title = tk.Label(self.window,text="24點游戲",font=("Arial", 20, "bold"),bg=self.style['bg'])title.pack(pady=20)# 創建數字顯示區域self.numbers_frame = tk.Frame(self.window, bg=self.style['bg'])self.numbers_frame.pack(pady=20)# 創建4個數字標簽self.number_labels = []for i in range(4):label = tk.Label(self.numbers_frame,text="",font=self.style['font'],width=4,height=2,relief="solid",bg=self.style['entry_bg'])label.pack(side=tk.LEFT, padx=5)self.number_labels.append(label)# 創建算式輸入框self.expression_var = tk.StringVar()self.expression_entry = tk.Entry(self.window,textvariable=self.expression_var,font=self.style['font'],width=30,bg=self.style['entry_bg'],fg=self.style['entry_fg'])self.expression_entry.pack(pady=20)# 創建按鈕區域button_frame = tk.Frame(self.window, bg=self.style['bg'])button_frame.pack(pady=20)# 創建提交答案按鈕submit_btn = tk.Button(button_frame,text="提交答案",command=self.check_answer,font=self.style['font'],bg=self.style['button_bg'],fg=self.style['button_fg'],width=10)submit_btn.pack(side=tk.LEFT, padx=5)# 創建新游戲按鈕new_game_btn = tk.Button(button_frame,text="新游戲",command=self.new_game,font=self.style['font'],bg=self.style['button_bg'],fg=self.style['button_fg'],width=10)new_game_btn.pack(side=tk.LEFT, padx=5)# 創建顯示答案按鈕show_answer_btn = tk.Button(button_frame,text="顯示答案",command=self.show_answer,font=self.style['font'],bg=self.style['button_bg'],fg=self.style['button_fg'],width=10)show_answer_btn.pack(side=tk.LEFT, padx=5)# 創建提示標簽self.hint_label = tk.Label(self.window,text="請輸入算式,使用 + - * / 和括號",font=self.style['font'],bg=self.style['bg'])self.hint_label.pack(pady=10)def new_game(self):"""開始新游戲隨機生成4個1-9之間的數字,并計算一個可能的解法"""self.numbers = [random.randint(1, 9) for _ in range(4)]for i, num in enumerate(self.numbers):self.number_labels[i].config(text=str(num))self.expression_var.set("")self.solution = self.find_solution()def find_solution(self):"""尋找當前數字組合的一個可能解法使用遞歸方法嘗試所有可能的運算組合返回:如果找到解法返回算式字符串,否則返回"無解""""# 定義基本運算符ops = {'+': operator.add,'-': operator.sub,'*': operator.mul,'/': operator.truediv}def evaluate(nums):"""遞歸計算所有可能的運算組合參數:nums: 待計算的數字列表返回:(是否找到解法, 算式字符串)"""if len(nums) == 1:return abs(nums[0] - 24) < 1e-10, str(nums[0])# 嘗試所有可能的數字組合和運算符for i in range(len(nums)):for j in range(i + 1, len(nums)):a, b = nums[i], nums[j]remaining = nums[:i] + nums[i + 1:j] + nums[j + 1:]for op in ops:try:result = ops[op](a, b)if op == '/':if abs(b) < 1e-10:  # 避免除以0continuesuccess, expr = evaluate(remaining + [result])if success:return True, f"({a}{op}{b}){expr}"except:continuereturn False, ""success, expr = evaluate(self.numbers)return expr if success else "無解"def check_answer(self):"""檢查用戶輸入的答案是否正確驗證:1. 是否只使用了給定的數字2. 計算結果是否等于24"""try:expr = self.expression_var.get()# 移除所有空格expr = expr.replace(" ", "")# 檢查是否只使用了給定的數字used_nums = [int(n) for n in expr if n.isdigit()]if sorted(used_nums) != sorted(self.numbers):messagebox.showerror("錯誤", "請只使用給定的數字!")returnresult = eval(expr)if abs(result - 24) < 1e-10:messagebox.showinfo("恭喜", "答案正確!")else:messagebox.showerror("錯誤", f"計算結果為 {result},不等于24")except:messagebox.showerror("錯誤", "請輸入有效的算式!")def show_answer(self):"""顯示當前游戲的一個可能解法"""if self.solution:messagebox.showinfo("答案", f"一個可能的解法:{self.solution}")else:messagebox.showinfo("答案", "這組數字無解!")def run(self):"""運行游戲主循環"""self.window.mainloop()if __name__ == "__main__":game = TwentyFourGame()game.run()

四、Readme

## 功能特點- 圖形用戶界面,操作簡單直觀
- 隨機生成4個1-9之間的數字
- 支持基本的四則運算(+、-、*、/)和括號
- 實時驗證答案的正確性
- 提供答案提示功能
- 支持開始新游戲## 系統要求- Python 3.x
- Tkinter(Python標準庫,通常隨Python一起安裝)## 安裝說明1. 確保您的系統已安裝Python 3.x
2. 下載或克隆此倉庫
3. 運行游戲:```bashpython 24_points_game.py```## 游戲規則1. 游戲會隨機生成4個1-9之間的數字
2. 使用這4個數字,通過加減乘除運算和括號,得到24
3. 每個數字必須且只能使用一次
4. 運算結果必須精確等于24## 使用方法1. 啟動游戲后,界面會顯示4個隨機數字
2. 在輸入框中輸入您的算式(例如:`(3+5)*(6-3)`)
3. 點擊"提交答案"按鈕檢查答案
4. 如果遇到困難,可以點擊"顯示答案"查看一個可能的解法
5. 隨時可以點擊"新游戲"開始新的挑戰## 注意事項- 請確保輸入的算式格式正確
- 只能使用給定的4個數字
- 每個數字只能使用一次
- 運算結果必須精確等于24## 技術實現- 使用Tkinter構建圖形界面
- 實現了自動求解算法
- 包含輸入驗證和錯誤處理
- 采用面向對象編程方式開發

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

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

相關文章

PostgreSQL 18新特性之虛擬生成列

PostgreSQL 12 提供了生成列&#xff08;GENERATED ALWAYS AS STORED&#xff09;功能&#xff0c;但是只能支持存儲型的生成列&#xff0c;需要占用存儲空間&#xff0c;更新成本高。 為此&#xff0c;PostgreSQL 18 即將引入一個新的增強&#xff1a;虛擬生成列。這種類型的…

GitHub上傳項目

總結&#xff08;有基礎的話直接執行這幾步&#xff0c;就不需要再往下看了&#xff09;&#xff1a; git init 修改git的config文件&#xff1a;添加:[user]:name你的github用戶名 email你注冊github的用戶名 git branch -m master main git remote add origin 你的URL gi…

常見排序算法深度評測:從原理到10萬級數據實戰

常見排序算法深度評測&#xff1a;從原理到10萬級數據實戰 摘要 本文系統解析冒泡排序、選擇排序、插入排序、希爾排序、歸并排序、快速排序、堆排序和基數排序8種經典算法&#xff0c;通過C語言實現10萬隨機數排序并統計耗時。測試顯示&#xff1a;快速排序綜合性能最優&…

動態規劃填表技巧:固定最后一個數 vs 固定倒數第二個數

在動態規劃中&#xff0c;填表時固定最后一個數還是倒數第二個數&#xff0c;取決于問題的定義和狀態轉移方程的設計。 目錄 1. 固定最后一個數 適用場景 特點 示例 2. 固定倒數第二個數 適用場景 特點 示例 3. 固定最后一個數與倒數第二個數的對比 4. 總結 1. 固定最…

【C】鏈式二叉樹算法題2

目錄 1 另一棵樹的子樹 1&#xff09; 題目描述 示例1&#xff1a; 示例2&#xff1a; 2&#xff09; 算法解析 3&#xff09; 代碼 2 二叉樹的遍歷 1&#xff09; 問題描述 2&#xff09; 算法解析 3&#xff09; 代碼 3 總結 1 另一棵樹的子樹 leetcode鏈接…

配置Hadoop集群

Hadoop的運行模式 本地運行&#xff1a;在一臺單機上運行&#xff0c;沒有分布式文件系統&#xff0c;直接讀寫本地操作系統的文件系統。特點&#xff1a;不對配置文件進行修改&#xff0c;Hadoop 不會啟動 偽分布式&#xff1a;也是在一臺單機上運行&#xff0c;但用不同的 …

python辦公自動化--數據可視化(pandas+matplotlib)--生成條形圖和餅狀圖

前言 前幾天我們學習了pandas讀取數據&#xff0c;還學習了如何用patplotlib繪制柱狀圖和折線圖。 今天我們繼續學習&#xff0c;如何繪制條形圖和餅狀圖。 一、課程回顧-pandas讀取數據 1.示例數據文件 這里我們用到的依舊是d盤底下的這個excel工作簿&#xff0c;這個工作簿…

基于大模型的結節性甲狀腺腫診療全流程預測與方案研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義 1.3 國內外研究現狀 二、大模型預測原理與方法 2.1 相關大模型概述 2.2 數據收集與預處理 2.3 模型訓練與驗證 三、術前預測與評估 3.1 結節性質預測 3.1.1 良惡性判斷 3.1.2 與傳統診斷方法對比 3.2 手術風險預測…

不同開發語言對字符串的操作

一、字符串的訪問 Objective-C: 使用 characterAtIndex: 方法訪問字符。 NSString *str "Hello, World!"; unichar character [str characterAtIndex:0]; // 訪問第一個字符 H NSLog("%C", character); // 輸出: H NSString 內部存儲的是 UTF-16 編…

Java開發者如何接入并使用DeepSeek

目錄 一、準備工作 二、添加DeepSeek SDK依賴 三、初始化DeepSeek客戶端 四、數據上傳與查詢 五、數據處理與分析 六、實際應用案例 七、總結 【博主推薦】&#xff1a;最近發現了一個超棒的人工智能學習網站&#xff0c;內容通俗易懂&#xff0c;風格風趣幽默&#xff…

S19文件格式詳解:汽車ECU軟件升級中的核心鏡像格式

文章目錄 引言一、S19文件格式的起源與概述二、S19文件的核心結構三、S19在汽車ECU升級中的應用場景四、S19與其他格式的對比五、S19文件實例解析六、工具鏈支持與安全考量七、未來趨勢與挑戰結語引言 在汽車電子控制單元(ECU)的軟件升級過程中,S19文件(也稱為Motorola S-…

CTF雜項——[suctf 2019]簽到題

base64轉圖片 可以直接用隨波逐流 得到flag SUCTF{ffffffffT4nk}

【Python】整數除法不正確,少1的問題,以及有關浮點數轉換的精度問題

1. 問題 今天在做leetcode 不同路徑 的時候發現了個問題 對于m53 n4class Solution:def uniquePaths(self, m: int, n: int) -> int:rlt 1for i in range(0, m-1):rlt * (m n - 2 - i)for i in range(0, m-1):rlt / (i 1)return int(rlt)為什么這個結果是 26234class S…

AI無代碼平臺

以下是目前支持快速開發產品的高生產力免費AI無代碼平臺推薦&#xff0c;按功能和適用場景分類&#xff1a; 一、全棧應用開發類 Bolt.DIY DeepSeek-R1 無需編寫代碼即可開發全棧應用&#xff0c;提供免費API和無速率限制&#xff0c;支持AI編碼助手與自動化流程 。 優勢&…

Gini系數的應用 - 指標波動貢獻分析

基尼系數的定義 基尼系數是衡量數據分布不均衡程度的指標&#xff0c;取值范圍在0到1之間&#xff1a; 0 表示完全均衡&#xff08;所有值相等&#xff09;。1 表示完全不均衡&#xff08;所有值集中在一個點&#xff09;。 基尼系數的計算公式 假設有 n n n 個數據點&…

第一節: 網絡基礎與參考模型

深入理解OSI七層模型與TCP/IP四層模型:網絡工程師的入門指南 在網絡通信的世界中,OSI七層模型和TCP/IP四層模型是理解網絡架構的基礎。無論是配置路由器、排查網絡故障,還是設計復雜的網絡系統,掌握這些模型的分層結構及其功能都是必不可少的。本文將從新手角度出發,深入…

HTTP拾技雜談

HTTP拾技雜談 簡單聊聊HTTP中的那些東西 文章目錄 HTTP拾技雜談前言HTTP協議1.請求從客戶端到服務器端的4個步驟一般客戶端請求如下&#xff1a;服務端響應如下 2.Keep-AliveHTTP方法Cookie 總結 前言 超文本傳輸協議&#xff08;Hypertext Transfer Protocol &#xff0c;HT…

用Deepseek寫一個五子棋微信小程序

在當今快節奏的生活中&#xff0c;休閑小游戲成為了許多人放松心情的好選擇。五子棋作為一款經典的策略游戲&#xff0c;不僅規則簡單&#xff0c;還能鍛煉思維。最近&#xff0c;我借助 DeepSeek 的幫助&#xff0c;開發了一款五子棋微信小程序。在這篇文章中&#xff0c;我將…

自然語言處理:最大期望值算法

介紹 大家好&#xff0c;博主又來給大家分享知識了&#xff0c;今天給大家分享的內容是自然語言處理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文簡稱為EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型參數的過程分成…

【從零開始學習計算機科學】計算機體系結構(一)計算機體系結構、指令、指令集(ISA)與量化評估

【從零開始學習計算機科學】計算機體系結構(一)計算機體系結構、指令、指令集(ISA)與量化評估 概論計算機體系結構簡介計算機的分類并行體系結構指令集體系結構(ISA)分類存儲器尋址尋址模式操作數大小指令ISA的編碼程序的優化計算機體系結構量化評估存儲器體系結構概論 …