【发布时间】: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 的神经网络的训练数据。但我目前无法记录游戏中的输入数据,以下是我所做的总结:
- 定义了一个名为“trainingData”的全局变量,并将其设置为一个空数组;
- 定义了一个名为“input”的全局变量,并将其设置为一个长度为4的新数组;
- 定义了一个名为“output”的全局变量并将其设置为未定义。
- 每次球击中球拍时,我将 输入 变量设置为等于其位置和速度的 X 和 Y 值,这 4 个值是计算预测所需输出的必要值。李>
- 每次球击中对面的桨时,我将 输出 变量设置为等于它的 Y 位置。 (注意:Paddle 仅向上和向下移动,这解释了为什么球的 Y 位置仅作为所需的输出值返回。)
- 在为 output 变量赋值后,我将 input 和 output 推送到 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 步而编写的代码以及从中获得的训练数据:
Step 4 done using the first approach
Step 4 done using the second approach
我可能做错了什么?能够理解我目前遇到的错误将对我个人学习 JavaScript 有很大的帮助,所以是的,非常感谢任何试图回答的人。
【问题讨论】:
标签: javascript arrays class oop neural-network