友方棋子碰撞的Unity国际象棋游戏问题

Unity chess game problem with friendly piece collision

嗨,我正在 Unity 中构建一个国际象棋游戏,我的问题是女王可以移动到友方棋子上方。

选择棋子后,会生成棋盘上的合法走法数组

legalMoves = piece.Move();

我在这里选择使用向量,因此列表中的任何移动都是二维向量。

然后在一个循环中,我检查是否有任何移动在棋盘的边界内,以及移动是否会将棋子放在另一个友好的棋子上。如果是,则丢弃该移动,但我的问题是它应该丢弃该方向内的所有移动。

例如:如果皇后在(3,3)上,(3,5)上有兵,那么所有的走法(3,6),(3,7)...都应该是丢弃但不丢弃 (3,4)。

类似地,如果黑皇后在 (7,7) 上,兵在 (7,5) 上,则所有移动 (7,4)、(7,3)、(7,2) ..应该丢弃而不是 (7,6).

我的直觉是,当一个矢量上有友方棋子时,检查我对它的所有合法移动的方向和长度:

if (dir.normalized.Equals(temp[j].normalized) && dir.SqrMagnitude() < temp[j].SqrMagnitude())

我们的想法是从 legalmoves 中删除所有方向相同但长度更长的向量,但这似乎并没有真正起作用,因为归一化向量将不相等。

这里是相关代码

foreach (var dir in legalMoves)
{
    if (0 <= dir.x && dir.x <= 7 && 0 <= dir.y && dir.y <= 7)
    {
        //TODO shrink this to 1d array search
        if (board[(int) dir.x, (int) dir.y].getPiece() == null)
        {

           Instantiate(trail, dir, Quaternion.identity);
        }
        else
        {
            List<Vector2> temp = legalMoves.ToList();
            GameObject[] trails = GameObject.FindGameObjectsWithTag("bullet");

            for (int j = 0; j< temp.Count; j++)
            {
                if (  dir.normalized.Equals(temp[j].normalized) &&   dir.SqrMagnitude() < temp[j].SqrMagnitude())
                {
                    foreach(var t in trails)
                    {
                        // remove trail 
                        if (t.transform.position.Equals(temp[j])) Destroy(t);
                    }
                    // remove the move with the same direction
                    temp.Remove(temp[j]);
                }
            }
            
            temp.Remove(dir);
            
            legalMoves = temp.ToArray();
        }
    }
}

这是我的问题可视化chess collision issue

好的,也许有更好的解决方案,但是,我设法做到的方法如下:

我们的皇后 = q 在 (3,0) ,被阻挡的棋子 = k 在 (3,6),

如果我们计算从 k 到 q 的偏移量,我们总是得到一个轴,它是 0(x 或 y),在这种情况下它是 x。

因为我们知道轴是 0,所以我们可以使用布尔值检查哪个轴是 0,在本例中是 x,并且简单地丢弃所有在 x 上且高于 6 或低于 6 的黑色棋子的合法移动.

我还没有想过如果一个棋子在水平方向上有障碍物怎么办,但是我确定这只是一个像上面那样添加/减去正确坐标的问题。