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



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

当选择一个棋子时,会生成棋盘上的一系列合法移动

legalMoves = piece.Move();

我选择在这里使用向量,所以列表中的任何移动都是2d向量。

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

例如:如果女王在(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();
}
}
}

这是我的问题可视化的国际象棋碰撞问题

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

我们的女王=q在(3,0(,被遮挡的棋子=k在(3,6(,

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

由于我们知道一个轴是0,我们可以使用布尔值检查哪一个是0,在这种情况下它是x,并简单地放弃所有在x上且在6以上或6以下的合法移动,以获得黑色碎片。

我还没有想过如果一块东西在水平方向上受阻,该怎么做,但我确信这只是添加/减去上面的正确坐标的问题。

最新更新