C#控制台15拼图(15 puzzle)应用如何校验用户输入的数字是否合法
C# 控制台15拼图移动合法性校验实现
核心问题
你当前需要实现的校验逻辑本质是判断用户输入数字的坐标与空位点(值为0)的坐标是否为上下左右相邻关系,原有实现存在两个问题:一是没有做数组边界判断,空位点在数组边缘时访问x-1/y-1/x+1/y+1会触发数组越界报错;二是不需要重复比对数组存储的数值,直接对比两个坐标的位置关系即可,逻辑更简单。
修复后的校验方法代码
替换你原有的IsLocation方法即可:
static public bool IsLocation(Board board,Player player) { // 获取空位点和用户输入数字的坐标 Index emptyLocation = new Index(0, 0).GetEmptyLocation(board); Index inputLocation = new Index(0, 0).GetIndex(board, player); // 坐标异常直接返回非法 if (emptyLocation == null || inputLocation == null) return false; // 相邻规则:要么x差1且y相同(上下相邻),要么y差1且x相同(左右相邻) bool isVerticalAdjacent = Math.Abs(emptyLocation.x - inputLocation.x) == 1 && emptyLocation.y == inputLocation.y; bool isHorizontalAdjacent = Math.Abs(emptyLocation.y - inputLocation.y) == 1 && emptyLocation.x == inputLocation.x; return isVerticalAdjacent || isHorizontalAdjacent; }
逻辑说明
该实现用差值绝对值判断相邻关系,天然规避了数组越界问题,不需要单独判断空位点是否处于数组边缘:
- 比如空位点坐标为(0,0),用户输入数字坐标为(0,1),y差值为1且x相同,符合左右相邻规则,返回true
- 如果用户输入数字坐标为(1,1),x和y差值都为1,属于对角位置,返回false
可选优化点
- 输入校验部分可以把
int.Parse换成int.TryParse,处理用户输入非数字的场景,避免程序直接崩溃 - Swap方法中不需要双层循环找0的位置,直接调用
GetEmptyLocation拿到空位点坐标即可,减少不必要的遍历
内容的提问来源于stack exchange,提问作者Amr Ali
相关产品推荐
相关产品推荐

