Проверьте, действительно ли ход коня между двумя точками - PullRequest
0 голосов
/ 12 декабря 2018

Я занимаюсь шахматным проектом на 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 голосов
/ 12 декабря 2018

Моя попытка:

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

Для эффективности абсолютное значение может быть вычислено без ответвлений.

0 голосов
/ 12 декабря 2018

Вот варианты проверки достоверности, проверки горизонтального и вертикального расстояния:

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); 
}

А здесь один проверяет горизонтальное и вертикальное перемещение против набора допустимых возможностей:

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()); 
}

Онлайн демо

...