目录
需求
实现效果
代码实现
程序说明
需求
通过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()
程序说明
-
红球选择:
- 使用
Checkbutton
控件让用户选择6个红球。 - 每个
Checkbutton
对应一个红球编号,用户可以通过勾选来选择。
- 使用
-
蓝球选择:
- 使用
Radiobutton
控件让用户选择1个蓝球。 - 每个
Radiobutton
对应一个蓝球编号,用户只能选择一个。
- 使用
-
添加号码按钮:
- 点击“添加号码”按钮后,程序会检查用户选择的红球和蓝球是否有效,然后将选择的号码添加到一个列表中,并显示在界面上。
- 用户最多可以添加5个不同的号码。
-
移除号码按钮:
- 每个已添加的号码旁边都有一个“移除”按钮,用户可以点击该按钮移除对应的号码。
-
开奖按钮:
- 点击“开奖”按钮后,程序随机生成6个红球和1个蓝球,并显示在结果显示框中。
-
检查中奖按钮:
- 点击“检查中奖”按钮后,程序根据用户选择的每个号码和开奖号码进行对比,判断每个号码的中奖情况,并弹出相应的消息框。
-
开奖直到中奖按钮:
- 点击“开奖直到中奖”按钮后,程序会不断开奖,直到用户购买的所有号码中至少有一个号码中奖为止。
- 程序会显示一共开奖了多少次,以及中奖了多少次。