C#数组重复项检测方法?Yahtzee游戏Fullhouse等牌型判断求助
Yahtzee牌型检测与数组重复项处理方案
先修正你现有代码的问题
你的代码存在类型不匹配的低级错误:数组是string[]却用int类型的1做Contains判断,foreach循环又用int遍历字符串数组,还和字符串"1"对比,同时num变量未初始化。修正后的数字计数逻辑应该是这样:
// 先统一转成int数组,避免类型混乱 int[] numbers = { int.Parse(number1), int.Parse(number2), int.Parse(number3), int.Parse(number4), int.Parse(number5) }; // 统计数字1的出现次数 int count1 = 0; foreach (int num in numbers) { if (num == 1) count1++; } // 用LINQ可以更简洁:int count1 = numbers.Count(n => n == 1);
C#搜索数组重复项的核心方法
检测Yahtzee牌型的核心是统计每个数字的出现频次,常用两种实现方式:
1. 手动用Dictionary统计
适合不想用LINQ的场景,逻辑清晰:
Dictionary<int, int> frequency = new Dictionary<int, int>(); foreach (int num in numbers) { if (frequency.ContainsKey(num)) frequency[num]++; else frequency[num] = 1; } // 键=骰子数字,值=该数字出现的次数
2. 用LINQ的GroupBy(更简洁)
一行代码搞定频次分组,.NET Framework 3.5及以上支持:
var frequencyGroups = numbers.GroupBy(n => n) .Select(g => new { Number = g.Key, Count = g.Count() }) .ToList();
三种目标牌型的检测逻辑
基于上面的频次统计,就能轻松实现牌型判断:
Three of a Kind(三条)
只要存在任意数字出现次数≥3:
// Dictionary版本 bool isThreeOfAKind = frequency.Any(kv => kv.Value >= 3); // GroupBy版本 bool isThreeOfAKind = frequencyGroups.Any(g => g.Count >= 3);
Four of a Kind(四条)
只要存在任意数字出现次数≥4:
bool isFourOfAKind = frequency.Any(kv => kv.Value >= 4);
Fullhouse(满堂红)
必须满足两个条件:只有两种不同数字,且其中一种出现3次、另一种出现2次(顺序无关):
// Dictionary版本 bool isFullHouse = frequency.Count == 2 && frequency.Values.Contains(3) && frequency.Values.Contains(2); // GroupBy版本(更严谨,避免出现4+1的情况) bool isFullHouse = frequencyGroups.Count == 2 && frequencyGroups.Select(g => g.Count) .OrderBy(c => c) .SequenceEqual(new[] {2, 3});
完整示例代码
把所有逻辑整合起来的可运行示例:
// 模拟输入的骰子值(实际可从UI或用户输入获取) string input1 = "3", input2 = "3", input3 = "3", input4 = "5", input5 = "5"; int[] numbers = { int.Parse(input1), int.Parse(input2), int.Parse(input3), int.Parse(input4), int.Parse(input5) }; // 统计频次 var frequency = numbers.GroupBy(n => n) .ToDictionary(g => g.Key, g => g.Count()); // 检测牌型 bool threeOfAKind = frequency.Any(kv => kv.Value >= 3); bool fourOfAKind = frequency.Any(kv => kv.Value >= 4); bool fullHouse = frequency.Count == 2 && frequency.Values.Contains(2) && frequency.Values.Contains(3); // 输出结果 Console.WriteLine($"三条:{threeOfAKind}"); Console.WriteLine($"四条:{fourOfAKind}"); Console.WriteLine($"满堂红:{fullHouse}");
内容的提问来源于stack exchange,提问作者DrRuxton
相关产品推荐
相关产品推荐

