猫史档案馆


Python作品:24点

用户:月光之树月光之树查看:1 回复:4 评论:1 创建时间:2023-06-27T22:50:28


众所周知,24点是一款能锻炼智力的游戏,今天教大家如何用python去实现它,废话不多说,俺们现在开始。

上图片:center_image

正片开始,

我会交出代码的

来,上代码:

import tkinter as tk
from tkinter import messagebox
import itertools
import operator
import random
def calculate(a, b, op):
    if op == "+":
        return a + b
    if op == "-":
        return a - b
    if op == "*":
        return a * b
    if op == "/":
        return a / b if b != 0 else None
def solve_24(nums, target=24):
    ops = ["+", "-", "*", "/"]
    num_permutations = list(itertools.permutations(nums))
    op_permutations = list(itertools.product(ops, repeat=3))
    results = []
    for num_perm in num_permutations:
        for op_perm in op_permutations:
            expr = f"({num_perm[0]} {op_perm[0]} {num_perm[1]}) {op_perm[1]} {num_perm[2]} {op_perm[2]} {num_perm[3]}"
            try:
                result = eval(expr)
            except ZeroDivisionError:
                result = None
            if result == target:
                results.append(expr)
    return results
def check_solution():
    user_solution = user_input.get()
    solution_nums = user_solution
    solution_nums = solution_nums.replace("(", " ")
    solution_nums = solution_nums.replace(")", " ")
    solution_nums = solution_nums.replace("+", " ")
    solution_nums = solution_nums.replace("-", " ")
    solution_nums = solution_nums.replace("*", " ")
    solution_nums = solution_nums.replace("/", " ")
    user_solution_nums = [s for s in solution_nums.split() if s.isdigit()]
    print(user_solution_nums)
    x = int(user_solution_nums[0])
    if x in nums:
        num_bool = 1
    else:
        num_bool = 0
        user_input.delete(0, tk.END)
    x = int(user_solution_nums[0])
    if x in nums:
        num_bool = 1
    else:
        num_bool = 0
        user_input.delete(0, tk.END)
    x = int(user_solution_nums[0])
    if x in nums:
        num_bool = 1
    else:
        num_bool = 0
        user_input.delete(0, tk.END)
    x = int(user_solution_nums[0])
    if x in nums:
        num_bool = 1
    else:
        num_bool = 0
        user_input.delete(0, tk.END)
    if num_bool == 0:
        messagebox.showerror("结果", "不包含生成的数字")
    try:
        result = eval(user_input.get())
    except (SyntaxError, NameError, ZeroDivisionError):
        result = None
    if result == 24 and num_bool:
        messagebox.showinfo("结果", "正确!")
        generate_valid_numbers()  # 生成新的数字
    else:
        if num_bool == 1:
            messagebox.showerror("结果", "错误!")
            user_input.delete(0, tk.END)
def generate_valid_numbers():
    global nums, solutions, timer
    while True:
        nums = [random.randint(1, 13) for _ in range(4)]
        solutions = set(solve_24(nums))
        if solutions:
            break
    for i, num in enumerate(nums):
        num_vars[i].set(num)
    user_input.delete(0, tk.END)
    timer = 50
    start_timer()
    timer_var.set(f"剩余时间:{timer}秒")
def show_solution():
    if solutions:
        solution_str = list(solutions)[random.randint(0, len(solutions) - 1)]
        messagebox.showinfo("答案", f"一个可能的答案:{solution_str}")
        generate_valid_numbers()
    else:
        messagebox.showinfo("答案", "无解!")
def update_timer():
    global timer, timer_expired
    if timer > 0:
        timer -= 1
        timer_var.set(f"剩余时间:{timer}秒")
        root.after(1000, update_timer)
    elif not timer_expired:
        timer_var.set("时间到!")
        timer_expired = True
        show_solution()
def start_timer():
    global timer, timer_expired
    timer = 50
    timer_expired = False
    update_timer()
def hint():
    if solutions:
        user_input.delete(0, tk.END)
        user_input.insert(0, list(solutions)[random.randint(0, len(solutions) - 1)])
root = tk.Tk()
root.title("24点")
num_vars = [tk.StringVar() for _ in range(4)]
num_labels = [tk.Label(root, textvariable=num_var, font=("Arial", 24)) for num_var in num_vars]
for i, num_label in enumerate(num_labels):
    num_label.grid(row=0, column=i)
user_input = tk.Entry(root, width=30)
user_input.grid(row=1, column=0, columnspan=4)
check_button = tk.Button(root, text="检查解答", command=check_solution)
check_button.grid(row=2, column=0)
generate_button = tk.Button(root, text="生成数字", command=generate_valid_numbers)
generate_button.grid(row=2, column=1)
start_button = tk.Button(root, text="重启计时", command=start_timer)
start_button.grid(row=2, column=2)
hint_button = tk.Button(root, text="提示", command=hint)
hint_button.grid(row=2, column=3)
timer_var = tk.StringVar()
timer_label = tk.Label(root, textvariable=timer_var)
timer_label.grid(row=3, column=0, columnspan=4)
generate_valid_numbers()
root.mainloop()

代码是精简版,没空行,没注释

自己去理解吧!


回复

上一页1 页 / 共 1下一页
月光之树月光之树

代码还有没完成的,

check_solution

这个函数下,int后列表的项数要自己改

 

点赞0


评论


月光之树月光之树

开发完成

最终代码

import tkinter as tk
from tkinter import messagebox
import itertools
import operator
import random
def calculate(a, b, op):
    if op == "+":
        return a + b
    if op == "-":
        return a - b
    if op == "*":
        return a * b
    if op == "/":
        return a / b if b != 0 else None
def solve_24(nums, target=24):
    ops = ["+", "-", "*", "/"]
    num_permutations = list(itertools.permutations(nums))
    op_permutations = list(itertools.product(ops, repeat=3))
    results = []
    for num_perm in num_permutations:
        for op_perm in op_permutations:
            expr = f"({num_perm[0]} {op_perm[0]} {num_perm[1]}) {op_perm[1]} {num_perm[2]} {op_perm[2]} {num_perm[3]}"
            try:
                result = eval(expr)
            except ZeroDivisionError:
                result = None
            if result == target:
                results.append(expr)
    return results
def check_solution():
    user_solution = user_input.get()
    solution_nums = user_solution
    solution_nums = solution_nums.replace("(", " ")
    solution_nums = solution_nums.replace(")", " ")
    solution_nums = solution_nums.replace("+", " ")
    solution_nums = solution_nums.replace("-", " ")
    solution_nums = solution_nums.replace("*", " ")
    solution_nums = solution_nums.replace("/", " ")
    user_solution_nums = [s for s in solution_nums.split() if s.isdigit()]
    print(user_solution_nums)
    num_bool = 1
    if len(user_solution_nums) == 4:
        x = int(user_solution_nums[0])
        if x in nums:
            if num_bool:
                num_bool = 1
            else:
                num_bool = 0
        else:
            num_bool = 0
            user_input.delete(0, tk.END)
        x = int(user_solution_nums[1])
        if x in nums:
            if num_bool:
                num_bool = 1
            else:
                num_bool = 0
        else:
            num_bool = 0
            user_input.delete(0, tk.END)
        x = int(user_solution_nums[2])
        if x in nums:
            if num_bool:
                num_bool = 1
            else:
                num_bool = 0
        else:
            num_bool = 0
            user_input.delete(0, tk.END)
        x = int(user_solution_nums[3])
        if x in nums:
            if num_bool:
                num_bool = 1
            else:
                num_bool = 0
        else:
            num_bool = 0
            user_input.delete(0, tk.END)
    else:
        num_bool = 0
    if num_bool == 0:
        messagebox.showerror("结果", "不包含生成的数字")
        user_input.delete(0, tk.END)
    try:
        result = eval(user_input.get())
    except (SyntaxError, NameError, ZeroDivisionError):
        result = None
    if result == 24 and num_bool:
        messagebox.showinfo("结果", "正确!")
        generate_valid_numbers()  # 生成新的数字
    else:
        if num_bool == 1:
            messagebox.showerror("结果", "错误!")
            user_input.delete(0, tk.END)
def generate_valid_numbers():
    global nums, solutions, timer
    while True:
        nums = [random.randint(1, 13) for _ in range(4)]
        solutions = set(solve_24(nums))
        if solutions:
            break
    for i, num in enumerate(nums):
        num_vars[i].set(num)
    user_input.delete(0, tk.END)
    timer = "未开启计时模式"
    timer_var.set(timer)
def show_solution():
    if solutions:
        solution_str = list(solutions)[random.randint(0, len(solutions) - 1)]
        messagebox.showinfo("答案", f"一个可能的答案:{solution_str}")
        generate_valid_numbers()
    else:
        messagebox.showinfo("答案", "无解!")
def update_timer():
    global timer, timer_expired
    if isinstance(timer, int):
        if timer > 0:
            timer -= 1
            timer_var.set(f"剩余时间:{timer}秒")
            root.after(1000, update_timer)
        elif not timer_expired:
            timer_var.set("时间到!")
            timer_expired = True
            show_solution()
def start_timer():
    global timer, timer_expired
    timer = 50
    timer_expired = False
    update_timer()
def hint():
    if solutions:
        user_input.delete(0, tk.END)
        user_input.insert(0, list(solutions)[random.randint(0, len(solutions) - 1)])
root = tk.Tk()
root.title("24点")
num_vars = [tk.StringVar() for _ in range(4)]
num_labels = [tk.Label(root, textvariable=num_var, font=("Arial", 24)) for num_var in num_vars]
for i, num_label in enumerate(num_labels):
    num_label.grid(row=0, column=i)
user_input = tk.Entry(root, width=30)
user_input.grid(row=1, column=0, columnspan=4)
check_button = tk.Button(root, text="检查解答", command=check_solution)
check_button.grid(row=2, column=0)
generate_button = tk.Button(root, text="生成数字", command=generate_valid_numbers)
generate_button.grid(row=2, column=1)
start_button = tk.Button(root, text="开始计时", command=start_timer)
start_button.grid(row=2, column=2)
hint_button = tk.Button(root, text="提示", command=hint)
hint_button.grid(row=2, column=3)
timer_var = tk.StringVar()
timer_label = tk.Label(root, textvariable=timer_var)
timer_label.grid(row=3, column=0, columnspan=4)
generate_valid_numbers()
root.mainloop()

点赞0


评论


Mecat⁧~喵呜⁧Mecat⁧~喵呜⁧

阿巴阿巴.....

点赞0


评论


1111111111111111211111111111111112

这东西我研究了4多天,其实有个内置库可以列出所有数字组合的,你可以简化一下代码

点赞0


评论