C#开发简易乐透宾果游戏时一维与二维数组匹配问题求助
C# 宾果游戏中奖判定解决方案
核心逻辑说明
你需要校验的是乐透卡上任意整行、任意整列、两条对角线的所有数字,全部存在于用户输入的7个数字中,即为中奖。
第一步:优化查询效率
将用户输入的数组转成HashSet,O(1)时间复杂度即可判断数字是否存在,避免多次遍历数组:
HashSet<int> userNumberSet = new HashSet<int>(userNmr);
第二步:替换校验逻辑
直接替换你注释// --- This is where im stuck --- 后的所有代码即可:
bool isBingo = false; int size = 5; // 1. 校验所有行 for (int i = 0; i < size; i++) { bool rowAllMatch = true; for (int j = 0; j < size; j++) { if (!userNumberSet.Contains(lottoCard[i, j])) { rowAllMatch = false; break; } } if (rowAllMatch) { isBingo = true; break; } } // 未命中再校验列 if (!isBingo) { for (int j = 0; j < size; j++) { bool colAllMatch = true; for (int i = 0; i < size; i++) { if (!userNumberSet.Contains(lottoCard[i, j])) { colAllMatch = false; break; } } if (colAllMatch) { isBingo = true; break; } } } // 未命中再校验对角线 if (!isBingo) { bool diag1AllMatch = true; for (int i = 0; i < size; i++) { if (!userNumberSet.Contains(lottoCard[i, i])) { diag1AllMatch = false; break; } } if (diag1AllMatch) isBingo = true; } if (!isBingo) { bool diag2AllMatch = true; for (int i = 0; i < size; i++) { if (!userNumberSet.Contains(lottoCard[i, size - 1 - i])) { diag2AllMatch = false; break; } } if (diag2AllMatch) isBingo = true; } if (isBingo) { Console.WriteLine("BINGO!"); } else { Console.WriteLine("No win . . ."); }
原有失败方案的问题说明
- 方案1逻辑完全偏离,是校验两个数组的维度、长度、元素完全一致,和你的中奖规则没有关系
- 方案2参数用了锯齿数组
int[][],但你声明的乐透卡是二维数组int[,],类型不匹配无法运行,同时逻辑是查找连续子序列,不符合整行/列全匹配的要求
可选优化建议
- 目前你生成的乐透卡可能存在重复数字,正规宾果卡的25个数字是1-25不重复的,你可以在生成阶段加去重逻辑
- 用户输入阶段可以加校验,避免重复输入、超出范围的数字
内容的提问来源于stack exchange,提问作者5for5
相关产品推荐
相关产品推荐

