Unity3d象棋游戏:第7位兵与车无法选移及数组越界问题
问题排查与解决方案
嘿,我来帮你梳理并解决这个象棋游戏的问题!咱们一步步来:
1. 先修复兵的右对角线移动数组越界错误
你代码里的diagonal right部分存在明显的索引错误,这是导致第7位置棋子异常的核心原因:
原代码片段:
//diagonal right if (CurrentX != 8 && CurrentY != 7) { Debug.Log (CurrentX); if (e [0] == CurrentX + 1 && e [1] == CurrentY + 1) r [(int)CurrentX + 1, CurrentY + 1] = true; c = BoardManager.Instance.Chessmans [(int)CurrentX + 1, CurrentY + 1]; if (c != null && !c.isWhite) { r [(int)CurrentX + 1, CurrentY + 1] = true;
问题分析:
- 你的棋盘数组是
8x8的,索引范围只能是0到7(不管X还是Y轴) - 条件
CurrentX !=8完全无效,因为CurrentX的最大值就是7(棋盘X轴的最后一个位置) - 当
CurrentX=7时,CurrentX+1=8,访问Chessmans[8, ...]会直接触发数组越界异常,导致这段逻辑执行失败,甚至让整个PossibleMove方法报错,进而让棋子无法被选中或计算移动范围。
修正后的代码:
把CurrentX !=8改成CurrentX !=7,确保只有当CurrentX小于7时才检查右对角线(避免+1后超出数组索引):
//diagonal right if (CurrentX != 7 && CurrentY != 7) { // 此处将8改为7 Debug.Log (CurrentX); if (e [0] == CurrentX + 1 && e [1] == CurrentY + 1) r [(int)CurrentX + 1, CurrentY + 1] = true; c = BoardManager.Instance.Chessmans [(int)CurrentX + 1, CurrentY + 1]; if (c != null && !c.isWhite) { r [(int)CurrentX + 1, CurrentY + 1] = true;
2. 解决第7位置(Y=7)棋子无法选中/移动的问题
针对白兵(Y=7):
按照国际象棋规则,白兵走到Y=7(棋盘最顶端)应该触发升变,本身就不能再以兵的身份移动了。但如果是无法选中,大概率是数组越界导致PossibleMove方法抛出异常,让选中逻辑认为这个棋子没有可移动范围,修复越界问题后这个情况应该会改善。
针对车(Y=7):
你没提供车的代码,但推测是类似的边界判断错误或数组越界问题。比如车的PossibleMove方法里,可能错误地把Y轴边界写成Y !=8而不是Y !=7,或者计算移动路径时超出了数组索引范围。你可以参考兵的修复思路,检查车的移动逻辑,确保所有数组访问的索引都在0-7范围内。
3. 额外优化建议
- 把棋盘尺寸定义成常量(比如
const int BoardSize = 8;),避免硬写数字,减少这类索引错误 - 在访问数组前,统一加一层索引合法性检查(比如
if (x >=0 && x < BoardSize && y >=0 && y < BoardSize)),从根源避免越界问题
内容的提问来源于stack exchange,提问作者Sohaib Noyyan Mumtaz
相关产品推荐
相关产品推荐

