双色球彩票模拟程序(python代码,tkinter界面,面向对象编程)

目录

需求

实现效果

代码实现

程序说明


需求

通过python代码,实现双色球彩票选号,模拟摇奖,开奖,显示中奖情况

实现效果

代码实现

import tkinter as tk
from tkinter import messagebox
import random


class DoubleColorBallApp:
    def __init__(self, root):
        self.root = root
        self.root.title("双色球彩票程序")

        self.red_balls = []
        self.blue_ball = None
        self.drawn_red_balls = []
        self.drawn_blue_ball = None

        self.bet_frames = []
        self.max_bets = 5
        self.current_bet = 0

        self.create_widgets()

    def create_widgets(self):
        # 创建红球选择框
        self.red_frame = tk.Frame(self.root)
        self.red_frame.pack(pady=10)

        self.red_vars = []
        for i in range(1, 34):
            var = tk.IntVar()
            chk = tk.Checkbutton(self.red_frame, text=f"{i:02}", variable=var)
            chk.grid(row=(i - 1) // 10, column=(i - 1) % 10)
            self.red_vars.append(var)

        # 创建蓝球选择框
        self.blue_frame = tk.Frame(self.root)
        self.blue_frame.pack(pady=10)

        self.blue_var = tk.IntVar()
        for i in range(1, 17):
            rb = tk.Radiobutton(self.blue_frame, text=f"{i:02}", variable=self.blue_var, value=i)
            rb.grid(row=0, column=i - 1)

        # 创建按钮
        self.button_frame = tk.Frame(self.root)
        self.button_frame.pack(pady=10)

        self.add_bet_button = tk.Button(self.button_frame, text="添加号码", command=self.add_bet)
        self.add_bet_button.grid(row=0, column=0, padx=5)

        self.draw_button = tk.Button(self.button_frame, text="开奖", command=self.draw_balls)
        self.draw_button.grid(row=0, column=1, padx=5)

        self.check_button = tk.Button(self.button_frame, text="检查中奖", command=self.check_winning)
        self.check_button.grid(row=0, column=2, padx=5)

        self.draw_until_win_button = tk.Button(self.button_frame, text="开奖直到中奖", command=self.draw_until_win)
        self.draw_until_win_button.grid(row=0, column=3, padx=5)

        # 创建结果显示框
        self.result_label = tk.Label(self.root, text="", font=("Arial", 12))
        self.result_label.pack(pady=10)

    def add_bet(self):
        if self.current_bet >= self.max_bets:
            messagebox.showwarning("警告", "最多只能购买5个号码!")
            return

        selected_red_balls = [i + 1 for i, var in enumerate(self.red_vars) if var.get() == 1]
        selected_blue_ball = self.blue_var.get()

        if len(selected_red_balls) != 6:
            messagebox.showwarning("警告", "请选择6个红球!")
            return

        if selected_blue_ball == 0:
            messagebox.showwarning("警告", "请选择1个蓝球!")
            return

        bet_frame = tk.Frame(self.root)
        bet_frame.pack(pady=5)

        red_label = tk.Label(bet_frame, text=f"红球: {sorted(selected_red_balls)}")
        red_label.pack(side=tk.LEFT)

        blue_label = tk.Label(bet_frame, text=f"蓝球: {selected_blue_ball:02}")
        blue_label.pack(side=tk.LEFT)

        remove_button = tk.Button(bet_frame, text="移除", command=lambda frame=bet_frame: self.remove_bet(frame))
        remove_button.pack(side=tk.LEFT)

        self.bet_frames.append((bet_frame, selected_red_balls, selected_blue_ball))
        self.current_bet += 1

        # 清空选择
        for var in self.red_vars:
            var.set(0)
        self.blue_var.set(0)

    def remove_bet(self, frame):
        for i, (f, _, _) in enumerate(self.bet_frames):
            if f == frame:
                f.destroy()
                del self.bet_frames[i]
                self.current_bet -= 1
                break

    def draw_balls(self):
        self.drawn_red_balls = random.sample(range(1, 34), 6)
        self.drawn_blue_ball = random.randint(1, 16)

        self.result_label.config(text=f"开奖号码:红球 {sorted(self.drawn_red_balls)},蓝球 {self.drawn_blue_ball:02}")

    def check_winning(self):
        if not self.drawn_red_balls or self.drawn_blue_ball is None:
            messagebox.showwarning("警告", "请先开奖!")
            return

        results = []
        for _, selected_red_balls, selected_blue_ball in self.bet_frames:
            red_matches = set(selected_red_balls).intersection(set(self.drawn_red_balls))
            blue_match = selected_blue_ball == self.drawn_blue_ball

            num_red_matches = len(red_matches)

            if num_red_matches == 6 and blue_match:
                results.append("一等奖")
            elif num_red_matches == 6:
                results.append("二等奖")
            elif num_red_matches == 5 and blue_match:
                results.append("三等奖")
            elif num_red_matches == 5 or (num_red_matches == 4 and blue_match):
                results.append("四等奖")
            elif num_red_matches == 4 or (num_red_matches == 3 and blue_match):
                results.append("五等奖")
            elif blue_match:
                results.append("六等奖")
            else:
                results.append("未中奖")

        message = "\n".join([f"号码 {i + 1}: {result}" for i, result in enumerate(results)])
        messagebox.showinfo("中奖结果", message)

    def draw_until_win(self):
        if not self.bet_frames:
            messagebox.showwarning("警告", "请先添加号码!")
            return

        draws = 0
        wins = 0
        while True:
            self.draw_balls()
            draws += 1
            results = []
            for _, selected_red_balls, selected_blue_ball in self.bet_frames:
                red_matches = set(selected_red_balls).intersection(set(self.drawn_red_balls))
                blue_match = selected_blue_ball == self.drawn_blue_ball

                num_red_matches = len(red_matches)

                if num_red_matches == 6 and blue_match:
                    results.append("一等奖")
                    wins += 1
                elif num_red_matches == 6:
                    results.append("二等奖")
                    wins += 1
                elif num_red_matches == 5 and blue_match:
                    results.append("三等奖")
                    wins += 1
                elif num_red_matches == 5 or (num_red_matches == 4 and blue_match):
                    results.append("四等奖")
                    wins += 1
                elif num_red_matches == 4 or (num_red_matches == 3 and blue_match):
                    results.append("五等奖")
                    wins += 1
                elif blue_match:
                    results.append("六等奖")
                    wins += 1
                else:
                    results.append("未中奖")

            if any(result != "未中奖" for result in results):
                break

        message = f"一共开奖了 {draws} 次,中奖了 {wins} 次。\n"
        message += "\n".join([f"号码 {i + 1}: {result}" for i, result in enumerate(results)])
        messagebox.showinfo("中奖结果", message)


if __name__ == "__main__":
    root = tk.Tk()
    app = DoubleColorBallApp(root)
    root.mainloop()

程序说明

  1. 红球选择

    • 使用 Checkbutton 控件让用户选择6个红球。
    • 每个 Checkbutton 对应一个红球编号,用户可以通过勾选来选择。
  2. 蓝球选择

    • 使用 Radiobutton 控件让用户选择1个蓝球。
    • 每个 Radiobutton 对应一个蓝球编号,用户只能选择一个。
  3. 添加号码按钮

    • 点击“添加号码”按钮后,程序会检查用户选择的红球和蓝球是否有效,然后将选择的号码添加到一个列表中,并显示在界面上。
    • 用户最多可以添加5个不同的号码。
  4. 移除号码按钮

    • 每个已添加的号码旁边都有一个“移除”按钮,用户可以点击该按钮移除对应的号码。
  5. 开奖按钮

    • 点击“开奖”按钮后,程序随机生成6个红球和1个蓝球,并显示在结果显示框中。
  6. 检查中奖按钮

    • 点击“检查中奖”按钮后,程序根据用户选择的每个号码和开奖号码进行对比,判断每个号码的中奖情况,并弹出相应的消息框。
  7. 开奖直到中奖按钮

    • 点击“开奖直到中奖”按钮后,程序会不断开奖,直到用户购买的所有号码中至少有一个号码中奖为止。
    • 程序会显示一共开奖了多少次,以及中奖了多少次。

上一篇:大厂面试必看!Java基本数据类型和包装类的那些坑


下一篇:SSL 证书申请以及配置流程