好的,我有另一个与乒乓相关的问题。现在我正在努力改进“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和屏幕高度,宽度等常量来计算桨叶移动线的坐标。
为了计算inteetcion点,我做了等式:a1x4+b1=a2x4+b2
。 a1 b1 b2 a2
是我之前计算过的东西。它不起作用:P出了什么问题?
答案 0 :(得分: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=65
开始,65 + 135是200,这超过我们的限制150.所以我们必须在那里反弹。因此,我们可以通过简单地使用y = mx + b形式的线性方程式找到球何时进入y = 150
。我们的m是y速度,而b是起始y点。 X以时间为单位测量,y以我们的距离单位表示。
所以我们知道发生碰撞的地方是y=150
,所以我们将其与m一起作为我们的旅行速度和我们的原始y位置b。
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,这是我们可以用桨来击球的地方。
希望这一切都是正确的,试着在睡觉前快速完成。我可以回答你的任何问题。这只是你理解的数学和物理,你需要将它解释为你想要使用的任何语言。
答案 1 :(得分: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次,但你需要做的次数会有所不同;有足够的时间来准确,但不是太频繁,以至于你减慢了程序的执行速度)在正确的领先,确定在哪里拍摄。在我的代码中,我在现场绘制了一个红点,但显然你可以在找到坐标后用信息做任何你想做的事。