检查骑士在两点之间的移动是否有效

时间:2018-12-12 18:52:16

标签: c++ algorithm chess

我正在用C ++做一个象棋项目。我正在尝试检查二维阵列中的有效骑士移动。

我已经拥有玩家this->getLocX(),this->getLocY()变量的旧位置(玩家所在的位置),并且我拥有x,y(玩家想要将其骑士移入的位置)。

如何以最佳方式检查有效性?这是我的解决方案,但我想知道是否有更好的方法。

if (x == this->getLocX() + 1 && y == this->getLocY() + 2 || x == this->getLocX() - 1 && y == this->getLocY() + 2 || y == this->getLocY() + 1 && x == this->getLocX() + 2 || y == this->getLocY() + 1 && x == this->getLocX() - 2  || x == this->getLocX() - 1 && y == this->getLocY() + 2 || x == this->getLocX() + 1 && y == this->getLocY() - 2 || y == this->getLocY() - 1 && x == this->getLocX() - 2 || y == this->getLocY() - 1 && x == this->getLocX() + 2 || x == this->getLocX() - 1 && y == this->getLocY() - 2)
{
    //Move is vaid
}

2 个答案:

答案 0 :(得分:5)

我的尝试:

abs((X0 - X1) * (Y0 - Y1)) == 2

为了提高效率,绝对值可以无分支计算。

答案 1 :(得分:1)

这里有一个变体来检查有效性,检查水平和垂直距离:

bool isValidKnight2(int getLocX,int getLocY, int x,int y)
{
    int dx = abs(getLocX - x); 
    int dy = abs(getLocY - y); 
    return (dx == 1 && dy==2 || dx  == 2 && dy==1); 
}

这里,我们根据set允许的可能性来检查水平和垂直移动:

bool isValidKnight3(int getLocX,int getLocY, int x,int y)
{
    static set<pair<int,int>> valid={{1,2},{2,1}}; 
    return (valid.find(make_pair(abs(getLocX - x), abs(getLocY - y)))!=valid.end()); 
}

Online demo