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
相关产品推荐
相关产品推荐

