我正在用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
}
答案 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());
}