24点游戏(python)

上代码!

"""


24点游戏
这是一个使用tkinter开发的24点游戏,玩家需要使用给定的4个数字和基本运算符(+、-、*、/)计算出24.
"""
 
import tkinter as tk
from tkinter import messagebox
import random
import itertools
import operator
 
 
class 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:  # 避免除以0
                                    continue
                            success, expr = evaluate(remaining + [result])
                            if success:
                                return True, f"({a}{op}{b}){expr}"
                        except:
                            continue
            return 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("错误", "请只使用给定的数字!")
                return
 
            result = 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值