当前位置: 首页 > news >正文

用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构建图形界面
- 实现了自动求解算法
- 包含输入验证和错误处理
- 采用面向对象编程方式开发

相关文章:

用Python写一个算24点的小程序

一、运行界面 二、显示答案——递归介绍 工作流程&#xff1a; 1. 基本情况&#xff1a;函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字&#xff0c;它会判断这个数字是否接近 24&#xff08;使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…...

分布式网络

分布式网络&#xff08;Distributed Network&#xff09;指的是一种计算机网络架构&#xff0c;其中计算资源&#xff08;计算、存储、数据处理等&#xff09;分布在多个物理或逻辑上的节点上&#xff0c;而不是集中在单一的服务器或数据中心中。这种架构的主要目标是提高系统的…...

忘记dedecms后台超级管理员账号和密码的解决方案

解决方案&#xff1a; 方案一、数据库修改&#xff1a; 1、前提是您能登录到数据库后台&#xff0c;登录MySQL数据库管理工具&#xff08;如phpMyAdmin&#xff09; 2、打开数据库中的 dede_admin 表&#xff0c;找到管理员记录&#xff0c;将 pwd 字段的值改成 f297a57a5a7…...

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…...

Git基础之分支

常用指令 git branch 列出本地所有分支 git branch -r 列出所有远程分支 git branch [branch-name] 新建一个分支&#xff0c;但依然停留在当前分支 git checkout -b [branch] 新建一个分支&#xff0c;并切换到该分支 git merge [branch] 合并指定分支当前分支 git branch -d …...

MAC电脑常用操作

环境&#xff1a;M3芯片 &#xff0c;macOS15.2 &#x1f680; 快捷键 &#x1f5a5;️ 窗口管理 ✅ 退出/进入全屏模式 • 浏览器等应用&#xff1a;⌘ Command Ctrl F ✅ 最小化当前窗口 • ⌘ Command M • &#x1f4a1; 隐藏窗口但保留应用在后台运行 ✅ 关闭当前标…...

【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式

网络原理— HTTP 1. 什么是HTTP? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议&#xff1a; HTTP 往往是基于传输层的 TCP 协议实现的 (HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3基于UDP实现) 我们平时打开一个网站&#xff0c;就是通过HTTP协议来…...

Springboot redis bitMap实现用户签到以及统计,保姆级教程

项目架构&#xff0c;这是作为demo展示使用&#xff1a; Redis config&#xff1a; package com.zy.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Ob…...

【C++】:STL详解 —— 红黑树封装map和set

目录 红黑树的源代码 正向迭代器的代码 反向迭代器的代码 set的模拟实现 map的模拟实现 红黑树的源代码 #pragma once #include <iostream>using namespace std; // set ->key // map ->key/value// set ->key // map ->key/valueenum Colour {RED,BLAC…...

FPGA设计时序约束用法大全保姆级说明

目录 一、序言 二、时序约束概览 2.1 约束五大类 2.2 约束功能简述 2.3 跨时钟域约束 三、时序约束规范 3.1 时序约束顺序 3.2 约束的优先级 四、约束示例 4.1 设计代码 4.2 时序结果 4.2.1 create_clock 4.2.2 create_generated_clock 4.2.3 Rename_Auto-Derive…...

【前缀和与差分 C/C++】洛谷 P8218 求区间和

2025 - 03 - 09 - 第 72 篇 Author: 郑龙浩 / 仟濹 【前缀和与差分 C/C】 文章目录 洛谷 P8218 求区间和题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示思路代码 洛谷 P8218 求区间和 题目描述 给定 n n n 个正整数组成的数列 a 1 , a 2 , ⋯ , a n a_…...

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …...

Pytorch 第九回:卷积神经网络——ResNet模型

Pytorch 第九回&#xff1a;卷积神经网络——ResNet模型 本次开启深度学习第九回&#xff0c;基于Pytorch的ResNet卷积神经网络模型。这是分享的第四个卷积神经网络模型。该模型是基于解决因网络加深而出现的梯度消失和网络退化而进行设计的。接下来给大家分享具体思路。 本次…...

2025-3-9 一周总结

目前来看本学期上半程汇编语言,编译原理,数字电路和离散数学是相对重点的课程. 在汇编语言和编译原理这块,个人感觉黑书内知识点更多,细节更到位,体系更完整,可以在老师讲解之前进行预习 应当及时复习每天的内容.第一是看书,然后听课,在一天结束后保证自己的知识梳理完整,没有…...

如何在el-input搜索框组件的最后面,添加图标按钮?

1、问题描述 2、解决步骤 在el-input组件标签内&#xff0c;添加一个element-plus的自定义插槽&#xff0c; 在插槽里放一个图标按钮即可。 3、效果展示 结语 以上就是在搜索框组件的末尾添加搜索按钮的过程。 喜欢本篇文章的话&#xff0c;请关注本博主~~...

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯&#xff08;飞控部分&#xff09;六.移植2.4g通讯&#xff08;遥控部分&#xff09; 一.Si24Ri原理图 Si24R1芯片原理图如下&#xff1a; 右侧为晶振。 模块…...

Python爬取咸鱼Goodfish店铺所有商品接口的详细指南

在电商数据分析和市场研究中&#xff0c;爬取咸鱼店铺内的所有商品信息是一项极具价值的任务。通过调用咸鱼的goodfish.item_search_shop接口&#xff0c;可以获取指定店铺内的商品列表&#xff0c;包括商品标题、价格、图片链接、销量等详细信息。本文将详细介绍如何使用Pytho…...

【极光 Orbit•STC8A-8H】03. 小刀初试:点亮你的LED灯

【极光 Orbit•STC8H】03. 小刀初试&#xff1a;点亮你的 LED 灯 七律 点灯初探 单片方寸藏乾坤&#xff0c;LED明灭见真章。 端口配置定方向&#xff0c;寄存器值细推敲。 高低电平随心控&#xff0c;循环闪烁展锋芒。 嵌入式门初开启&#xff0c;从此代码手中扬。 摘要 …...

docker本地部署RagFlow

1.安装 克隆仓库 git clone https://github.com/infiniflow/ragflow.git构建预建的Docker映像并启动服务器 cd ragflow/docker chmod x ./entrypoint.sh docker compose -f docker-compose.yml -p ragflow up -d修改ragflow/docker/.env文件 #RAGFLOW_IMAGEinfiniflow/ragfl…...

STM32F4 UDP组播通信:填一填ST官方HAL库的坑

先说写作本文的原因&#xff0c;由于开项目开发中需要用到UDP组播接收的功能&#xff0c;但是ST官方没有提供合适的参考&#xff0c;使用STM32CubeMX生成的代码也是不能直接使用的&#xff0c;而我在网上找了一大圈&#xff0c;也没有一个能够直接解决的方案&#xff0c;deepse…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...