You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WPF黑杰克开发:如何将字符串数组转为整数数组?

黑杰克牌面数值计算解决方案

原代码问题说明

你之前的代码里Array.ConvertAll(kaartenArray, s => int.Parse(s))会直接报错,因为牌的字符串(比如"Klaveren Aas")包含花色和牌面,无法直接解析为整数,这是核心问题。下面提供几种实用的实现方案,可根据需求选择:


方案一:字典映射(复用现有字符串数组)

通过字典建立牌字符串与点数的对应关系,直接复用你现有的数组,查找效率高:

// 定义牌面与点数的映射字典
private Dictionary<string, int> kaartWaardeMap = new Dictionary<string, int>()
{
    {"Klaveren Aas", 1}, {"Klaveren 2",2}, {"Klaveren 3",3}, {"Klaveren 4",4}, {"Klaveren 5",5},
    {"Klaveren 6",6}, {"Klaveren 7",7}, {"Klaveren 8",8}, {"Klaveren 9",9}, {"Klaveren 10",10},
    {"Klaveren Boer",10}, {"Klaveren Koningin",10}, {"Klaveren Koning",10},
    {"Ruiten Aas",1}, {"Ruiten 2",2}, {"Ruiten 3",3}, {"Ruiten 4",4}, {"Ruiten 5",5},
    {"Ruiten 6",6}, {"Ruiten 7",7}, {"Ruiten 8",8}, {"Ruiten 9",9}, {"Ruiten 10",10},
    {"Ruiten Boer",10}, {"Ruiten Koningin",10}, {"Ruiten Koning",10},
    {"Harten Aas",1}, {"Harten 2",2}, {"Harten 3",3}, {"Harten 4",4}, {"Harten 5",5},
    {"Harten 6",6}, {"Harten 7",7}, {"Harten 8",8}, {"Harten 9",9}, {"Harten 10",10},
    {"Harten Boer",10}, {"Harten Koningin",10}, {"Harten Koning",10},
    {"Schoppen Aas",1}, {"Schoppen 2",2}, {"Schoppen 3",3}, {"Schoppen 4",4}, {"Schoppen 5",5},
    {"Schoppen 6",6}, {"Schoppen 7",7}, {"Schoppen 8",8}, {"Schoppen 9",9}, {"Schoppen 10",10},
    {"Schoppen Boer",10}, {"Schoppen Koningin",10}, {"Schoppen Koning",10}
};

// 计算ListBox中牌面的总和(包含黑杰克A的11点规则)
private int BerekenKaartSom(ListBox targetListBox)
{
    int som = 0;
    int aantalAzen = 0;

    foreach (string kaart in targetListBox.Items)
    {
        if (kaartWaardeMap.TryGetValue(kaart, out int waarde))
        {
            som += waarde;
            if (waarde == 1) aantalAzen++;
        }
    }

    // 黑杰克规则:A可算11点,只要总和不超过21
    while (aantalAzen > 0 && som + 10 <= 21)
    {
        som += 10;
        aantalAzen--;
    }

    return som;
}

// 使用示例:更新玩家总和到Label
private void UpdateSpelerSom()
{
    int spelerSom = BerekenKaartSom(spelerListBox);
    spelerSomLabel.Content = $"玩家总和: {spelerSom}";
}

方案二:面向对象Card类(长期维护最优方案)

如果后续要扩展功能(比如添加牌面图片、复杂规则),建议用类封装牌的所有信息,比字符串数组更易维护:

// 定义牌类
public class Kaart
{
    public string Kleur { get; set; } // 花色:Klaveren/Ruiten/Harten/Schoppen
    public string Naam { get; set; } // 牌面:Aas/2/.../10/Boer/Koningin/Koning
    public int BasisWaarde { get; set; } // 基础点数

    // 重写ToString,保证ListBox显示和原字符串一致
    public override string ToString()
    {
        return $"{Kleur} {Naam}";
    }
}

// 生成完整牌组
private List<Kaart> MaakVolleKaartSet()
{
    List<Kaart> kaarten = new List<Kaart>();
    string[] kleuren = {"Klaveren", "Ruiten", "Harten", "Schoppen"};

    foreach (string kleur in kleuren)
    {
        // 添加A
        kaarten.Add(new Kaart { Kleur = kleur, Naam = "Aas", BasisWaarde = 1 });
        // 添加2-10
        for (int i = 2; i <= 10; i++)
        {
            kaarten.Add(new Kaart { Kleur = kleur, Naam = i.ToString(), BasisWaarde = i });
        }
        // 添加J/Q/K
        kaarten.Add(new Kaart { Kleur = kleur, Naam = "Boer", BasisWaarde = 10 });
        kaarten.Add(new Kaart { Kleur = kleur, Naam = "Koningin", BasisWaarde = 10 });
        kaarten.Add(new Kaart { Kleur = kleur, Naam = "Koning", BasisWaarde = 10 });
    }
    return kaarten;
}

// 计算总和方法
private int BerekenKaartSom(ListBox targetListBox)
{
    int som = 0;
    int aantalAzen = 0;

    foreach (Kaart kaart in targetListBox.Items)
    {
        som += kaart.BasisWaarde;
        if (kaart.Naam == "Aas") aantalAzen++;
    }

    // 处理A的11点规则
    while (aantalAzen > 0 && som + 10 <= 21)
    {
        som += 10;
        aantalAzen--;
    }

    return som;
}

// 初始化与发牌示例
private List<Kaart> alleKaarten;
public MainWindow()
{
    InitializeComponent();
    alleKaarten = MaakVolleKaartSet();
    // 洗牌:alleKaarten = alleKaarten.OrderBy(x => Guid.NewGuid()).ToList();
}

private void DealButton_Click(object sender, RoutedEventArgs e)
{
    // 发牌给玩家
    Kaart teDelvenKaart = alleKaarten.First();
    spelerListBox.Items.Add(teDelvenKaart);
    alleKaarten.Remove(teDelvenKaart);
    // 更新总和显示
    spelerSomLabel.Content = $"玩家总和: {BerekenKaartSom(spelerListBox)}";
}

方案三:从字符串提取牌面计算(无需额外映射)

如果不想维护字典或类,可以直接从牌字符串中提取牌面部分,动态计算点数:

// 单张牌的点数计算
private int GetKaartWaarde(string kaart)
{
    // 分割字符串,取牌面部分
    string[] delen = kaart.Split(' ');
    string kaartNaam = delen[1];

    if (kaartNaam == "Aas") return 1;
    else if (kaartNaam is "Boer" or "Koningin" or "Koning") return 10;
    else return int.Parse(kaartNaam);
}

// 计算总和(包含A的规则)
private int BerekenKaartSom(ListBox targetListBox)
{
    int som = 0;
    int aantalAzen = 0;

    foreach (string kaart in targetListBox.Items)
    {
        int waarde = GetKaartWaarde(kaart);
        som += waarde;
        if (waarde == 1) aantalAzen++;
    }

    while (aantalAzen > 0 && som + 10 <= 21)
    {
        som += 10;
        aantalAzen--;
    }

    return som;
}

内容的提问来源于stack exchange,提问作者Mars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:01:06