1

好的,我还有另一个与乒乓球相关的问题。现在我正在努力改进“AI”。我在互联网上读到我应该预测球的 x 和 y 并在那里移动桨。

这是我的方程式。 在此处输入图像描述

y=ax+b
a1=(y1-y2)/(x1-x2) - a of the circles line, x1, y1 are taken before movent and x2 y2 after.
b1=y1-ax1

然后我使用 pos 0 0 和屏幕高度、宽度等常量计算了桨移动线的坐标。

为了计算交叉点,我做了等式:a1x4+b1=a2x4+b2a1 b1 b2 a2是我之前计算过的东西。它不起作用:P 怎么了?

4

2 回答 2

3

看来您走在正确的轨道上。基本上,您想弄清楚当球到达桨的位置时球的位置。

您可以通过查找 x 和 y 速度并跟踪上壁和下壁的位置来轻松做到这一点。

要找到 x 和 y 速度,您基本上可以找到球在设定的时间间隔内沿 x 方向和 y 方向行进的距离。因此,假设您在 t = 0 时发现位置为 (100(x), 50(y))... 然后您会看到在 t = 1 时球位于 (110, 65) 这意味着球是在 x 方向上每单位时间移动 10(像素),在 y 方向上每单位时间移动 15(像素)。

因此,让我们设置我们的房间大小以供参考。让我们的房间 200(x)乘以 150(y),所以最远的桨在 200 处,最近的桨在 x 上的 0 处……房间的底部在 150 处,顶部是 0,在是的。

如果您的桨位于x = 200,则需要(200-110)(pixels)/10(pixels per time)到达那里。现在您知道球到达桨叶需要多长时间,您可以计算出球在 y 轴上的位置。使用桨在 处x=200,我们发现到达桨需要 9 个多单位的时间。因此,我们只需将时间量乘以 y 方向的变化率,即可得出球在 y 方向上移动的距离。因此,通过快速计算,我们得到球在 y 轴上移动了 135(像素)。

但是,我们回头一看,我们的房间只有 150 像素高。我们开始时y=6565+135 是 200,大于我们的限制 150。所以我们必须在那里有一个反弹。因此,我们可以y = 150通过简单地使用 y=mx+b 形式的线性方程来找到球何时到达。我们的 m 是 y 速度,我们的 b 是起点 y。X 以时间为单位,y 以我们的距离为单位。

所以我们知道我们的 y 发生碰撞的位置,y=150所以我们将它与 m 一起作为我们的旅行速度和我们的 b 是我们原始的 y 位置。

150=(15)(x)+65

我们可以快速求解 x 以获得 5 和 2/3 单位的时间。所以我们现在可以从我们的总时间中减去这个,直到我们击中桨(9 units)-(5 and 2/3 units) = (3 and 1/3 units of time)。在我们的反弹之后,我们现在将有一个负的 y 速度,但假设一个简单的反弹,速度相同。所以我们可以y=mx+b再次使用我们的方程,但现在来确定我们球的最终 y 位置。

y=(-15)(3 and 1/3)+150

y 是球的最终 y 位置,我们的速度 15 现在是负数,我们的时间是从上方反弹后的时间,b 是 150,因为我们从屏幕底部开始。通过快速解决这个问题,我们可以看到我们现在处于 y = 100。

所以我们可以看到,当我们在x = 200,或者桨的 x 位置时,我们的 y 位置将是 100,这是我们可以用桨击球的地方。

希望这一切都是正确的,试着在睡觉前快速完成。我可以回答您对此的任何更多问题。这只是您要理解的数学和物理,您需要将其解释为您打算使用的任何语言。

于 2011-04-05T04:46:34.933 回答
0

几年前,我写了一个函数来计算引导一个移动目标,作为有人写的“导弹指挥”克隆的作弊。您的情况不同,因此此方法并不完全适用,但您的问题相似,因此看到这可能对您有所帮助。

我刚刚搜索了那个旧论坛帖子,令人惊讶的是代码仍然存在:

Function Cheat()
  Color 255,0,0
  For M.Meteor = Each Meteor
    distance#=M\m
    x#=(M\Vector\x*distance)+M\ox
    y#=(M\Vector\y*distance)+M\oy
    For i=1 To 6
      distance=M\m+M\speed*Sqr((x-gunx)*(x-gunx)+(y-guny)*(y-guny))/bulletspeed
      x=(M\Vector\x*distance)+M\ox
      y=(M\Vector\y*distance)+M\oy
    Next
    Oval x,y,4,4
  Next
End Function

(如果该代码真的难以理解,我深表歉意,它是用一种非常晦涩的基本方言编写的。)

基本上,如果我直接向目标射击,我会使用一个小三角函数来计算目标在穿过其路径时的位置。然后我重复计算,但这次要弄清楚如果我在之前计算中确定的位置开火,目标会在哪里。我重复了几次(在上面的代码中重复了 6 次,但是您需要执行的次数会有所不同;足够的次数是准确的,但不要太频繁以至于减慢程序执行速度)在正确的引导上,以确定在哪里射击。在我的代码中,我在该点画了一个红点,但显然,一旦你找出坐标,你就可以对信息做任何你想做的事情。

于 2011-04-06T02:06:12.213 回答