抽牌模拟器

我来创建一个模拟这个牌堆抽牌游戏的Python程序,使用Tkinter构建GUI界面。

这个程序具有以下功能:

  1. 牌堆管理

    • 自动生成包含10种牌的牌堆,每种牌有随机数量(5-15张)

    • 目标牌固定为第1种牌(红色显示)

  2. 概率计算

    • 自动计算单次抽取成功的概率

    • 实时显示当前刷新次数首次成功的理论概率

    • 概率公式:P(第x次成功) = (1-p)^(x-1) * p

  3. 交互功能

    • "抽取3张牌"按钮:进行一次抽取

    • "刷新(重新开始)"按钮:重置游戏状态,开始新游戏

    • "重置牌堆"按钮:重新生成随机牌堆

  4. 视觉反馈

    • 目标牌用红色显示,非目标牌用绿色显示

    • 成功/失败有明确的颜色和图标提示

    • 实时显示历史记录

  5. 概率显示

    • 显示当前刷新次数

    • 显示下一次刷新首次成功的理论概率

    • 成功时显示实际发生的概率

要运行此程序,需要安装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"
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值