新手开发者求助:小游戏中foreach循环方法的数组修改与打印问题
问题解答
1. 数组修改的核心结论
你当前的Stickor方法仅负责打印,完全没有修改数组的逻辑,所以它无法在游戏过程中修改sticks数组的值。不过C#中数组属于引用类型,你可以单独编写修改数组的方法,方法内对数组元素的修改会直接作用到原数组上。
2. 修正你的打印方法
原Stickor方法存在逻辑错误:内层循环用array.Length(固定为3)控制打印数量,不管每堆实际木棍数是多少,都会打印3个|,和数组存储的数量不匹配。以下是修正后的打印方法,能更直观地展示每堆木棍的数量:
static void PrintSticks(int[] array) { // 找到最多的木棍数,确定打印的行数 int maxSticks = array.Max(); // 从顶部到底部逐行打印木棍 for (int row = maxSticks; row > 0; row--) { foreach (var count in array) { // 当前行号小于等于堆的木棍数时打印|,否则打印空格占位 Console.Write(row <= count ? " | " : " "); } Console.WriteLine(); } // 打印堆的分隔线 foreach (var _ in array) { Console.Write("---"); } Console.WriteLine(); // 打印每堆的剩余木棍数量 foreach (var count in array) { Console.Write($" {count} "); } Console.WriteLine(); }
3. 编写数组修改方法
需要单独写一个修改数组的方法,同时加入合法性校验,避免无效操作:
// 返回值表示修改是否成功 static bool TakeSticks(int[] array, int pileIndex, int takeCount) { // 校验堆索引是否合法、拿走数量是否合规 if (pileIndex < 0 || pileIndex >= array.Length || takeCount <= 0 || takeCount > array[pileIndex]) { Console.WriteLine("操作无效,请重新输入!"); return false; } array[pileIndex] -= takeCount; return true; }
4. 方法整合示例
在主逻辑中可以这样把打印和修改方法整合起来:
static void Main() { int[] sticks = {5, 5, 5}; while (true) { Console.Clear(); PrintSticks(sticks); // 获取玩家输入(可根据需求优化输入校验) Console.Write("请输入要操作的堆编号(0/1/2):"); int pile = int.Parse(Console.ReadLine()); Console.Write("请输入要拿走的木棍数量:"); int count = int.Parse(Console.ReadLine()); if (TakeSticks(sticks, pile, count)) { // 判断游戏是否结束(所有堆木棍数为0) if (sticks.All(x => x == 0)) { Console.WriteLine("游戏结束!"); break; } } Console.WriteLine("按任意键继续..."); Console.ReadKey(); } }
内容的提问来源于stack exchange,提问作者Kim Persson
相关产品推荐
相关产品推荐

