C#战舰游戏坐标输入问题:无法处理“4 a”格式的攻击指令
C#战舰游戏问题排查与修复
一、输入格式错误的核心原因
输入“4 a”抛出Input string was not in a correct format,基本是以下几种情况导致:
- 直接用
int.Parse()或Convert.ToInt32()处理列字母(比如"a"),强行将非数字字符串转整数 - 输入拆分时没处理空格、大小写差异,比如逻辑只支持大写字母,但用户输入了小写
- 行号转数组索引时,没有正确适配“底部开始1-10”到“数组0-9”的转换逻辑
二、针对性修复方案
1. 输入解析逻辑修正
处理“行号 字母”格式的输入,按以下步骤实现:
- 拆分输入:用带去空选项的分割方法,避免多余空格干扰
- 列字母转索引:兼容大小写,将A-J转为0-9的数组索引
- 行号转索引:根据“底部为1”的规则,转换为数组的0-9索引(假设数组索引0对应底部行)
2. 完整输入解析代码示例
public (int rowIndex, int colIndex) ParseAttackInput(string input) { // 拆分输入,自动移除空项 var inputParts = input.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); if (inputParts.Length != 2) { throw new ArgumentException("输入格式错误,需为「行号 列字母」格式,例如:4 A"); } // 解析行号:用TryParse避免格式错误直接崩溃 if (!int.TryParse(inputParts[0], out int rowNum) || rowNum < 1 || rowNum > 10) { throw new ArgumentException("行号必须是1-10之间的有效整数"); } // 底部行1对应数组索引0,行10对应索引9 int rowIndex = 10 - rowNum; // 解析列字母:兼容大小写 if (inputParts[1].Length != 1 || !char.IsLetter(inputParts[1][0])) { throw new ArgumentException("列标识必须是单个字母(A-J)"); } char colChar = char.ToUpper(inputParts[1][0]); int colIndex = colChar - 'A'; if (colIndex < 0 || colIndex > 9) { throw new ArgumentException("列标识必须是A-J之间的字母"); } return (rowIndex, colIndex); }
3. 战舰摧毁逻辑校验
确保摧毁判断逻辑准确:
- 提前统计棋盘上所有代表战舰的单元格总数(比如14个)
- 每次攻击击中战舰时,累计击中次数
- 当攻击次数达到14次时,对比累计击中数是否等于战舰总单元格数:相等则返回"destroyed",否则返回"not destroyed"
三、常见避坑提醒
- 必须用
int.TryParse()替代int.Parse(),避免非数字输入直接抛出格式错误 - 强制将列字母转为大写/小写,兼容用户的大小写输入习惯
- 行号转换逻辑要和棋盘存储结构匹配:如果你的数组索引0对应顶部行,需把转换逻辑改成
rowIndex = rowNum - 1
内容的提问来源于stack exchange,提问作者Dragos Bogdan
相关产品推荐
相关产品推荐

