【问题标题】:How do you wrap an object on a grid in Javascript?如何在 Javascript 中将对象包装在网格上?
【发布时间】:2017-01-06 21:15:18
【问题描述】:

我目前正在研究火星探测器 Kata。我创建了一个 10x10 的网格,流动站可以前后移动并改变方向 ['N', 'E', 'S', 'W']。因为网格实际上代表了一个球形行星,所以漫游车应该包裹在 10x10 的网格上,而不是完全离开。我正在尝试对包装进行编码。包含更多上下文的对象。我目前正在使用 if/else 语句来确定流动站应该包裹的情况,但我知道我把它复杂化了。 switch 语句会更有效吗?或者我可以以某种方式使用循环吗?我是 Javascript 的新手。非常感谢。

var myRover = {
  position: [[0],[0]],
  direction: 'N',
  roverDirections = ['N', 'E', 'S', 'W'],
  marsGrid: [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
  obstacles: [];
};

if (command === 'f') {

if ((myRover.position[[0],[0]]) && (myRover.direction === 'S')) {
  myRover.position[[10],[0]];
}

else if ((myRover.position[[0],[0]]) && (myRover.direction === 'W')) {
  myRover.position[[0],[10]];
}

if ((myRover.position[[0],[10]]) && (myRover.direction === 'E')) {
  myRover.position[[0],[0]];
}

else if ((myRover.position[[0],[10]]) && (myRover.direction === 'S')) {
  myRover.position[[10],[10]];
}

if ((myRover.position[[10],[0]]) && (myRover.direction === 'N')) {
  myRover.position[[0],[0]];
}

else if ((myRover.position[[10],[0]]) && (myRover.direction === 'W')) {
  myRover.position[[10],[10]];
}

if ((myRover.position[[10],[10]]) && (myRover.direction === 'N')) {
  myRover.position[[0],[10]];
}

else if ((myRover.position[[0],[0]]) && (myRover.direction === 'E')) {
  myRover.position[[10],[0]];
}


}

【问题讨论】:

  • 可能有更多的代码递增和递减计数器,它们在哪里正确?如果是这样,如果号码是 > 10counter = 10 如果号码是 < 0,你可以拥有 counter = 0 的东西
  • 你有一些语法错误:roverDirections =应该是roverDirections:,删除obstacles之后的;,同样myRover.position[[0],[0]]没有任何意义。
  • 你可以定义一个gridPoint对象,用“指针”指向周围的gridPoints,这样你就可以很容易地连接边缘。所以当你四处移动时,你改变了流动站的 currentGridPoint,而不是 x,y 坐标
  • 你可以用一个一维数组来简化你的位置,比如[1, 5]
  • 请注意,您移动 N/S 的情况并不准确到球形行星表示。您需要保持 Y 位置,将 X 位置移动最大值的一半,然后反转方向。

标签: javascript loops if-statement


【解决方案1】:

您可以使用一个对象来计算具有给定方向的流动站的新位置。

directions = {
    N: [0, 9], // 9 because length of x - 1 and the positive remainder operator
    W: [9, 0], // 9 because length of y - 1
    O: [1, 0],
    S: [0, 1]
};

然后你可以用

来确定新的位置
direction = 'S';
newPos = [
    (oldPos[0] + directions[direction][0]) % 10,
    (oldPos[1] + directions[direction][1]) % 10
];

【讨论】:

  • 感谢您的提示。是否有任何方法可以使用 for 循环或 while 循环来做到这一点?
  • 这取决于您是否想更改多个位置,您可以将上述内容包裹在您选择的循环中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2018-04-27
  • 2013-03-06
  • 2011-06-12
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多