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

Check if knight move between two points is valid

我正在用 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
}

这里是检查有效性的变体,检查水平和垂直距离:

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

我的尝试:

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

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