C#战舰小游戏 自定义行列坐标(A-J列/1-10倒序行)修改方案
C# 战舰小游戏自定义坐标适配实现
问题描述
C#开发Battleships(战舰)迷你游戏时需要调整坐标命名规则:不使用0-10的数字索引,改为行号从底部起始编号1到10,列号从A到J编号。
当前已实现基础击毁判定逻辑:输入攻击坐标后可判断是否命中,船只所有占位格被命中则返回destroyed,否则返回not destroyed,已知参考坐标5 C对应当前程序索引5 2即可判定命中,现有代码如下:
char[,] board = new char[10, 10]; for (int i = 0; i < 10; i++) { string line = Console.ReadLine(); string[] boardCharacters = line.Split(' '); for (int j = 0 ; j < 10; j++) board[i, j] = Convert.ToChar(boardCharacters[j]); } int countHits = 0; for (int z = 0; z < 14; z++) { var attackCoordinates = Console.ReadLine().Split(' '); int[] attack = new int[2]; for (int i = 0; i < 2; i++) { attack[i] = int.Parse(attackCoordinates[i]); } if (board[attack[0], attack[1]] == 'x') { countHits++; } } if (countHits == 8) { Console.WriteLine("destroyed"); } else { Console.WriteLine("not destroyed"); }
修改方案
不需要改动棋盘初始化、命中计数、结果输出的核心逻辑,只需要替换攻击坐标的解析部分,做两层坐标映射即可:
- 行映射:当前数组
i=0对应棋盘顶部第一行,要求行号从底部开始计1~10,因此数组行索引计算公式为10 - 用户输入的行号。例:输入底部行号1,对应索引9;输入顶部行号10,对应索引0。 - 列映射:要求列号为A~J,直接通过ASCII码偏移计算数组列索引,公式为
char.ToUpper(用户输入的列字母) - 'A'。例:输入C,大写转换后减'A'得2,完全匹配你给出的「5 C对应原程序索引5 2命中」的规则。
替换后的攻击解析代码
把原循环中解析攻击坐标的部分替换为以下代码即可:
for (int z = 0; z < 14; z++) { // 拆分时自动忽略多打空格产生的空条目 var attackCoordinates = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries); // 解析行号 int inputRow = int.Parse(attackCoordinates[0]); int boardRowIndex = 10 - inputRow; // 解析列号,自动兼容小写输入 char inputCol = char.ToUpper(attackCoordinates[1][0]); int boardColIndex = inputCol - 'A'; if (board[boardRowIndex, boardColIndex] == 'x') { countHits++; } }
可选优化:输入合法性校验
如果需要避免用户输错坐标导致程序崩溃,可以在解析完索引后加校验逻辑:
// 校验坐标范围 if (boardRowIndex is < 0 or > 9 || boardColIndex is < 0 or > 9) { Console.WriteLine("坐标非法,请输入1-10行号+A-J列号,例如:5 C"); z--; // 本次无效输入不计入次数,重新等待输入 continue; }
内容的提问来源于stack exchange,提问作者Skike
相关产品推荐
相关产品推荐

