Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何限制典当♟️;棋盘上的运动?_Javascript_Arrays_Typescript_Multidimensional Array_Chess - Fatal编程技术网

Javascript 如何限制典当♟️;棋盘上的运动?

Javascript 如何限制典当♟️;棋盘上的运动?,javascript,arrays,typescript,multidimensional-array,chess,Javascript,Arrays,Typescript,Multidimensional Array,Chess,请不要对打字稿感到吃惊。它只是带有类型的js 我正在下国际象棋,我已经到了验证动作的阶段。我的瓷砖等级如下: class Tile { x: number; y: number; tile: Element; team: string; piece: string; constructor(i: number, j: number, tile: Element, team: string) { this.x = i; this.y = j; thi

请不要对打字稿感到吃惊。它只是带有类型的js

我正在下国际象棋,我已经到了验证动作的阶段。我的瓷砖等级如下:

class Tile {
  x: number;
  y: number;
  tile: Element;
  team: string;
  piece: string;
  constructor(i: number, j: number, tile: Element, team: string) {
    this.x = i;
    this.y = j;
    this.tile = tile;
    this.piece = "none";
    this.team = team;
  }
}
如您所见,我可以控制2D阵列中任何给定磁贴的x和y位置

我有下面的函数,它返回一个数组,其中包含每个工件在其y和x坐标中的总移动。它接收2个
平铺
对象作为参数。第一个是初始点击,最后一个是结束点击(用户想要移动工件的地方)

我已经设法确认了车的运动♜ 以下是:

  if (
    (getVectorComponents(start, end)[0] <= 7 &&
      getVectorComponents(start, end)[1] == 0) ||
    (getVectorComponents(start, end)[0] == 0 &&
      getVectorComponents(start, end)[1] <= 7)
  ) {
    //This is an available move for the rook
  }
此算法导致以下问题:

在国际象棋游戏中,棋子不能向后移动。但是,我的算法将此移动返回为有效

有没有一种很好的方法来限制棋子的移动,使它们只能向前移动?这需要考虑到白人和黑人团队

更多信息:
a8=[0][0]
h1=[7][7]


我建议您在检查有效移动时,检查一下,如果棋子是一种颜色,那么start.x必须大于end.x,反之亦然。即
白色只能在end.x较大时移动,黑色只能在start.x较大时移动。看起来你的注意力集中在向量分量上。您也可以使用原始值的简单比较

我建议您在检查有效移动时,检查如果棋子是一种颜色,则start.x必须大于end.x,反之亦然。即 白色只能在end.x较大时移动,黑色只能在start.x较大时移动。看起来你的注意力集中在向量分量上。您也可以使用原始值的简单比较

这个怎么样:

function getVectorComponents(start: Tile, end: Tile) {
  return [end.x - start.x, end.y - start.y];
}
这样可以保留方向,并且可以在以后移动棋子时检查方向是否为负。如果是负数,您就知道移动无效。

这个怎么样:

function getVectorComponents(start: Tile, end: Tile) {
  return [end.x - start.x, end.y - start.y];
}

这样可以保留方向,并且可以在以后移动棋子时检查方向是否为负。如果是负数,你就知道移动无效。

出于好奇:你如何确定是否可以投掷,你的算法没有足够的信息。你说的“典当只有一步可用”是错误的,因为“顺路”可能是一种选择,以确定算法再次需要更多的信息。正如你自己注意到的,我相信你需要一个“方向”概念。也许可以将其添加到“team”属性中,例如,代替
team:string
,您将得到一个
team:team
,它将以某种方式保持
方向
属性(例如
向上
向下
,甚至可以简化沿途的计算)。关键是来自瓦片的授权动作取决于该瓦片的所有者,这使我认为字符串不够表达。与该问题无关,但您可能需要考虑运行<代码> GETVECCOREST组件< /C> >,并将结果存储在变量中。现在用简单的计算可能没有多大区别,但一般来说,如果你不需要的话,你不想多次运行给你相同答案的东西(干)。出于好奇:你如何确定是否可以使用Casting,你的算法没有足够的信息。你说的“典当只有一步可用”是错误的,因为“顺路”可能是一种选择,以确定算法再次需要更多的信息。正如你自己注意到的,我相信你需要一个“方向”概念。也许可以将其添加到“team”属性中,例如,代替
team:string
,您将得到一个
team:team
,它将以某种方式保持
方向
属性(例如
向上
向下
,甚至可以简化沿途的计算)。关键是来自瓦片的授权动作取决于该瓦片的所有者,这使我认为字符串不够表达。与该问题无关,但您可能需要考虑运行<代码> GETVECCOREST组件< /C> >,并将结果存储在变量中。现在用简单的计算可能没有多大区别,但是一般来说,如果你不需要的话,你不想运行多次给出相同答案的东西(干的)。谢谢你的建议。它起作用了,但是这个结果有很多嵌套的if。也许是我把任务复杂化了。但是我期待一个更干净的解决方案。谢谢你的建议。它起作用了,但是这个结果有很多嵌套的if。也许是我把任务复杂化了。但我期待一个更干净的解决方案。
function getVectorComponents(start: Tile, end: Tile) {
  return [end.x - start.x, end.y - start.y];
}