【问题标题】:Setting a variable equal to a class property and pushing it to an array each time it changes also updates all the values that was pushed to the array?将变量设置为等于类属性并在每次更改时将其推送到数组也会更新推送到数组的所有值?
【发布时间】:2021-10-19 22:20:01
【问题描述】:

因此,我使用 HTML Canvas 和一个 AI 创建了一个 Pong 游戏,该 AI 在球击中对面的球拍的瞬间计算并预测球的位置。由于没有更好的名称 lmao,我将其称为“PONG-BEAST v1.0”。你甚至可以在这个链接上玩这个游戏的第一个版本:https://yurokazuma08.github.io/PONG-BEAST/

计算结果实际上相当不错,但仍然存在一些与球的速度成比例的误差。我尝试修复我的计算,但无法真正将其清理到完美,于是我开始观看有关神经网络的视频并了解它们。

这实际上是我第一次使用 Brain.js 和神经网络,我只是认为我创建的这个 Pong AI 将是我了解更多有关它的一个很好的起点。从技术上讲,我想收集游戏中的所有数据,现在是作为使用 Brain.js 的神经网络的训练数据。但我目前无法记录游戏中的输入数据,以下是我所做的总结:

  1. 定义了一个名为“trainingData”的全局变量,并将其设置为一个空数组;
  2. 定义了一个名为“input”的全局变量,并将其设置为一个长度为4的新数组;
  3. 定义了一个名为“output”的全局变量并将其设置为未定义。
  4. 每次球击中球拍时,我将 输入 变量设置为等于其位置和速度的 X 和 Y 值,这 4 个值是计算预测所需输出的必要值。李>
  5. 每次球击中对面的桨时,我将 输出 变量设置为等于它的 Y 位置。 (注意:Paddle 仅向上和向下移动,这解释了为什么球的 Y 位置仅作为所需的输出值返回。)
  6. 在为 output 变量赋值后,我将 inputoutput 推送到 trainingData 数组,然后不断循环回到步骤 4 以填充 trainingData 数组

下面是我在使用这种方法时遇到的问题:

我实际上以 2 种不同的方式执行了第 4 步(根据上述过程),并在此过程中遇到了 2 个不同的错误。第一种方法是这样的:

input = [
    (pong.position.x - pong.radius - player1.position.x - player1.width) / (player2.position.x - player1.position.x - player1.width - (pong.radius * 2)),
    (pong.position.y - pong.radius) / (canvas.height - (pong.radius * 2)),
    (pong.velocity.x + 25) / 50,
    (pong.velocity.y + 25) / 50
]

使用这种方法会导致 AI 计算出现问题,并且似乎影响并更改了我代码中某处的值,这导致我尝试第二种方法:

input[0] = (pong.position.x - pong.radius - player1.position.x - player1.width) / (player2.position.x - player1.position.x - player1.width - (pong.radius * 2));
input[1] = (pong.position.y - pong.radius) / (canvas.height - (pong.radius * 2));
input[2] = (pong.velocity.x + 25) / 50;
input[3] = (pong.velocity.y + 25) / 50;

这似乎解决了第一种方法引起的问题,但它产生了另一个我似乎无法理解发生了什么的错误。每次我将新的 input 推送到 trainingData 数组时,所有其他输入似乎都复制了已推送到数组中的最新输入数据的值,但它输出数据不这样做。我真的不明白发生了什么,为什么推送另一个输入数据会改变所有已经预先推送的输入。

以下是乒乓球比赛的照片、我为执行第 4 步而编写的代码以及从中获得的训练数据:

PONG-BEAST v1.0

Step 4 done using the first approach

Step 4 done using the second approach

trainingData

我可能做错了什么?能够理解我目前遇到的错误将对我个人学习 JavaScript 有很大的帮助,所以是的,非常感谢任何试图回答的人。

【问题讨论】:

    标签: javascript arrays class oop neural-network


    【解决方案1】:
    1. 如果是错误,请尝试复制位置的实际值而不是参考值。
    2. console.log(object)方法中。它只有在你实际观察时才能访问对象的当前值。
    3. 使用debugger 而不是console.log(object)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多