一、运行界面

二、显示答案——递归介绍

工作流程:

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的编码程序的优化计算机体系结构量化评估存储器体系结构概论 …