在两个数组中查找10个区域内的数字

时间:2019-04-11 22:26:15

标签: javascript arrays function for-loop

我目前正在为我的APCS年终项目编写网络游戏。我正在尝试在充满城镇坐标的数组中找到最接近的数字。由于它是坐标,因此我需要对X和Y数组执行此操作。例如,x = [10,20,30],y = [20,10,23],第一个城镇将位于[10,20]。但是由于要精确找到这个确切位置非常困难,因此您可以进入周围有10个坐标的区域,以发现城镇。

这是我当前的代码:

function setTowns() {
  for(i = 0; i < 9000; i++){
    townLocations.x.push(random(-1000, 1000));
    townLocations.y.push(random(-1000, 1000));
  }
}

function checkTown() {
  var townX = townLocations.x;
  var townY = townLocations.y;

  for(i = 0; i < townX.length; i++){
    if((Math.abs(townX[i]) - Math.abs(bb.location.x)) < 10){
      console.log(townX[i]);
      for(i = 0; i < townY.length; i++){
        if((Math.abs(townY[i]) - Math.abs(bb.location.y)) < 10){
          console.log(townY[i]);
          return true;
        }
        else {
          return false;
        }
      }
    }
  }
}
每次玩家移动时都会调用

checkTown()。

1 个答案:

答案 0 :(得分:0)

想象这样的地图:

1 0 0 0 0 0
0 0 1 0 0 1
0 0 ‍♀️ 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0

一个是小镇,而零不包含任何内容。 ‍♀️标记了玩家。

您可以使用勾股定理来发现任何类型的“碰撞”。假设玩家靠近两个城镇(每个城镇),每个城镇以及玩家都有自己的坐标(X,Y)。在您的脑海中绘制一个三角形,这两个地方的Y坐标都创建了三角形的一侧,而X坐标则是另一侧。距离是斜边。

让我们假设碰撞的距离(读取:检测)为1。如果玩家在坐标(3,3)上,那么坐标为(2,4)的城镇是否足够近?三角形的一侧从3到2,另一侧从3到4。斜边是什么,又称距离?

好的,这是儿童的数学运算,因为您可能会立即看到它,但是让我们看看它背后的数学运算。

let playerXCoordinate = 3;
let playerYCoordinate = 3;

let townXCoordinate = 2;
let townYCoordinate = 4;

let xDifference = playerXCoordinate - townXCoordinate; // 3 - 2
let yDifference = playerYCoordinate - townYCoordinate; // 3 - 4

    // Pythagorean theorem
let hypotenuseAsDistance = Math.sqr( Math.pow(xDifference, 2) + Math.pow(yDifference, 2))
// √(1^2 + 1^2) = √1 = 1

let isWithinDistance = hypotenuseAsDistance <= 1 // true

再举一个例子。这次是位于(5,4)的一个城镇。

let xDifference = 3 - 5;
let yDifference = 3 - 4

let hypotenuseAsDistance = Math.sqr( Math.pow(xDifference, 2) + Math.pow(yDifference, 2))
// √((3-5)^2 + (3-4)^2) = √(2^2+1^2) = √(4+1) = √5 = 2.23606797749979

let isWithinDistance = hypotenuseAsDistance <= 1 // false

但是,较短的版本是Math对象的一部分。

let xDifference = 3 - 5;
let yDifference = 3 - 4;

let hypotenuseAsDistance = Math.hypot(xDifference, yDifference);

以您的示例为例,

let playerXPos = 3; // just an example
let playerXPos = 4; // just an example

let townArrLength = townLocations.x;
let detectionRange = 10;

let townXPos = 0;
let townYPos = 0;
let distance = 0;

for (let i = 0; i < townArrLength; i++) {
  townXPos = townLocations.x[i];
  townYPos = townLocations.y[i];
  distance = Math.hypot(playerXPos - townXPos, playerYPos - townYPos);

  if (distance <= detectionRange) {
     // do something
  }
}

有关更多阅读:
https://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection