You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:13:45