如何在C#多维数组中查找替换对象?附Bingo卡排重与行校验需求
5×5 Bingo卡实现方案(新手友好版)
一、填充无重复的1-25随机数
你的原代码直接随机生成数字会出现重复,最简单的方法是先把1到25的数字放进列表,打乱顺序后再填充到二维数组,天然避免重复:
// 创建包含1-25的数字列表 List<int> numbers = new List<int>(); for (int num = 1; num <= 25; num++) { numbers.Add(num); } // 打乱列表顺序(Fisher-Yates洗牌算法,逻辑简单) Random rnd = new Random(); for (int i = numbers.Count - 1; i > 0; i--) { int j = rnd.Next(0, i + 1); // 交换两个位置的数字 int temp = numbers[i]; numbers[i] = numbers[j]; numbers[j] = temp; } // 填充到5×5二维数组 int[,] bingo = new int[5, 5]; int index = 0; for (int i = 0; i < bingo.GetLength(0); i++) { for (int j = 0; j < bingo.GetLength(1); j++) { bingo[i, j] = numbers[index]; index++; } }
这个方法不用额外检查重复,所有数字都是唯一的,比生成一个检查一个更直观。
二、校验用户所选数字是否构成Bingo行
假设用HashSet<int> selectedNumbers存储用户选的数字(查存在性效率高),按以下步骤检查Bingo:
1. 检查每行是否全被选中
bool hasBingo = false; // 遍历每行 for (int i = 0; i < 5; i++) { bool rowComplete = true; for (int j = 0; j < 5; j++) { if (!selectedNumbers.Contains(bingo[i, j])) { rowComplete = false; break; // 有一个没选中,直接跳出该行检查 } } if (rowComplete) { hasBingo = true; break; } }
2. 检查每列是否全被选中
如果行检查没找到Bingo,继续检查列:
if (!hasBingo) { for (int j = 0; j < 5; j++) { bool colComplete = true; for (int i = 0; i < 5; i++) { if (!selectedNumbers.Contains(bingo[i, j])) { colComplete = false; break; } } if (colComplete) { hasBingo = true; break; } } }
3. 检查两条对角线是否全被选中
如果行列都没找到,检查对角线:
if (!hasBingo) { // 左上到右下的主对角线 bool diag1Complete = true; for (int i = 0; i < 5; i++) { if (!selectedNumbers.Contains(bingo[i, i])) { diag1Complete = false; break; } } if (diag1Complete) { hasBingo = true; } else { // 右上到左下的副对角线 bool diag2Complete = true; for (int i = 0; i < 5; i++) { if (!selectedNumbers.Contains(bingo[i, 4 - i])) { diag2Complete = false; break; } } hasBingo = diag2Complete; } }
最后hasBingo为true就说明用户达成了Bingo。
内容的提问来源于stack exchange,提问作者mjau666
相关产品推荐
相关产品推荐

