【问题标题】:Check if knight move between two points is valid检查两点之间的骑士移动是否有效
【发布时间】:2018-12-12 18:52:15
【问题描述】:

我正在用 C++ 做一个国际象棋项目。我正在尝试检查 2D 数组中的有效骑士移动。

我有玩家的旧位置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
}

【问题讨论】:

  • 一个有效的马的移动是 x 变化的绝对值和 y 变化的绝对值是 1 和 2 或 2 和 1。并且移动仅限于棋盘.
  • 你能纠正我的条件吗?我不确定我是否理解
  • @Z.Zadon 不,我们不能为您编写条件:SO 不是编码服务。此外,合法骑士移动的问题在网上得到了很好的介绍,包括在这个网站上。我们希望您在发帖寻求帮助之前尽职尽责地找到或创建解决方案。
  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 On topichow to ask... the perfect question 在此处申请。 StackOverflow 不是设计、编码、研究或教程资源。但是,如果您遵循您在网上找到的任何资源,进行诚实的编码尝试并遇到问题,那么您将有一个很好的示例可以发布。
  • 我不明白我做错了什么。我在这里发布了我的解决方案,效果很好,但我只是想检查是否有更好的方法.. 这不像我只是让你给我写代码;(

标签: c++ algorithm chess


【解决方案1】:

我的尝试:

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

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

【讨论】:

  • 我喜欢这个解决方案 +1,但你错过了检查目的地是否在棋盘内(以及到目前为止的所有其他解决方案)。
  • @AlKepp:这似乎没有在问题中要求,可能在其他地方处理或只是隐含实现。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多