我来创建一个模拟这个牌堆抽牌游戏的Python程序,使用Tkinter构建GUI界面。
这个程序具有以下功能:
-
牌堆管理:
-
自动生成包含10种牌的牌堆,每种牌有随机数量(5-15张)
-
目标牌固定为第1种牌(红色显示)
-
-
概率计算:
-
自动计算单次抽取成功的概率
-
实时显示当前刷新次数首次成功的理论概率
-
概率公式:P(第x次成功) = (1-p)^(x-1) * p
-
-
交互功能:
-
"抽取3张牌"按钮:进行一次抽取
-
"刷新(重新开始)"按钮:重置游戏状态,开始新游戏
-
"重置牌堆"按钮:重新生成随机牌堆
-
-
视觉反馈:
-
目标牌用红色显示,非目标牌用绿色显示
-
成功/失败有明确的颜色和图标提示
-
实时显示历史记录
-
-
概率显示:
-
显示当前刷新次数
-
显示下一次刷新首次成功的理论概率
-
成功时显示实际发生的概率
-
要运行此程序,需要安装Python和Tkinter(通常Python自带)。程序模拟了几何分布的过程,直观展示了随着刷新次数增加,首次成功的概率如何变化。
import tkinter as tk
from tkinter import ttk, messagebox
import random
import math
from typing import List, Tuple
class CardGame:
def __init__(self, root):
self.root = root
self.root.title("牌堆抽牌模拟器")
self.root.geometry("800x700")
# 初始化参数
self.N = 10 # 10种牌
self.target_type = 1 # 目标牌类型(1-based index)
# 生成牌堆:每种牌有随机数量(5-15张)
self.card_counts = [random.randint(5, 15) for _ in range(self.N)]
self.total_cards = sum(self.card_counts)
# 计算单次成功概率
self.p_success = self.calculate_success_probability()
self.p_fail = 1 - self.p_success
# 初始化状态
self.current_trial = 0
self.successful = False
self.drawn_cards = []
# 创建GUI组件
self.setup_ui()
def calculate_success_probability(self) -> float:
"""计算单次抽取成功的概率"""
target_count = self.card_counts[self.target_type - 1]
non_target_count = self.total_cards - target_count
if self.total_cards < 3:
return 1.0
# 失败概率 = 抽到3张都不是目标牌的概率
if non_target_count < 3:
fail_prob = 0.0
else:
fail_prob = (math.comb(non_target_count, 3) /
math.comb(self.total_cards, 3))
return 1.0 - fail_prob
def setup_ui(self):
# 标题
title_label = ttk.Label(
self.root,
text="牌堆抽牌模拟器",
font=("Arial", 20, "bold")
)
title_label.pack(pady=10)
# 牌堆信息框架
info_frame = ttk.LabelFrame(self.root, text="牌堆信息", padding=10)
info_frame.pack(fill="x", padx=20, pady=10)
# 显示牌堆信息
info_text = f"总牌数: {self.total_cards}张 | 牌种类: {self.N}种\n"


273

被折叠的 条评论
为什么被折叠?



