数学 - 困难的Pong AI

时间:2012-07-12 21:50:27

标签: math algebra

我正在为我的Pong克隆编写一些困难,我正在编写以熟悉SFML和Xcode。对于最难的困难,我想创建一个AI级别,计算机可以立即知道球的位置。所以,如果我有xVelocity和yVelocity,我可以有效地获得斜率。问题是,每次球击中顶部或底部时,yVelocity都会反转。所以基本上,我有一个代数斜率问题,每当墙被击中时都会出现相反的情况。

现在,我的屏幕高度为600像素,顶部和底部的点击检测为5像素,空间为590像素。

我的问题:是否存在包含所有这些因素的公式。比如说,球在x = 30和y = 240时被击中,斜率为1.45,我想得到当x = 770时它将达到的y值。

如果我可以简化这一点,请告诉我。再一次,我知道如果通过计算4次,如果球反弹4次,我怎么能算出来,但我想知道是否有办法在边界处进行y速度切换。

谢谢!

3 个答案:

答案 0 :(得分:7)

编辑:只是读取你的屏幕实际上是590像素高,这改变了数学而不是公式

计算球击中忽略碰撞的位置。如果(0,0)是你竞技场的左上角,取y = mx + b,其中b是你的y偏移(球在y = 240时被击中),m是你的斜率(1.45)

现在我们想知道当x 770-30进一步放置时y将相等,所以算一算:

y = (1.45)(740) + (240) = 1313

这显然超出了你的范围。它会反映

y/height = floor(1313/590) = 2 times

意味着斜率仍在向上移动,并且会在

处达到
y mod height = 1313 mod 590 or 133

如果它反映了奇数次(floor(y/2) %2 == 1),那么您将不得不使用以下内容来计算它

MAX_HEIGHT - (y mod height) = 590 - (1903 mod 590) = 590 - 133 = 457

您可以通过将多个590高度字段堆叠在一起来显示这一点,其中一个是您开始的位置:

--------------------------------------------------------------------
|
|
|
|                                                 ball ends up here (*)
|                                                                *
|                                                            *
|                                                        *
------------------------(reflection  two)------------*---------------
|                                                *
|                                            *
|                                        *
|                                    *
|                                *
|                            *
|                        *
---------------------*---------(reflection 1)------------------------------
|                *
|            *
|        *
|    *
|*ball hit here
| 
|
-----------------------------------------------------------------------

同样的想法应该适用于下行。计算位置,计算出反射次数,使用mod或590 - mod来确定它应该在哪里。

答案 1 :(得分:1)

我没有尝试过这个但是如果你知道它在“y轴”上的位置和斜率,你就会得到一个斜率截距公式。插入到另一侧的距离,您可以判断它是在屏幕的上方,下方还是内部。如果它将高于或低于,则计算当y到达顶部或底部时x将是什么,从总x减去并重复。

答案 2 :(得分:0)

如果数学来到你这里是一个程序性不那么优雅 (而且速度较慢,而不是大多数pong实现中的那个问题)解决方案:

    tempX = ball.x;
    tempY = ball.y;
    tempXVel = ball.hspeed;
    tempYVel = ball.vspeed;

    while(tempX < x) //Assumes ball is traveling at you and you are right paddle
    {                //in a X = 0 = left hand side scenario
     tempX += tempXVel;
     tempY += tempYVel; 

     if (tempY > 480 or tempY < 0)
        tempYVel *= -1; //Y Velocity Switch at boundaries
    }

    target_Y = tempY;

基本上只是在循环中对球进行相同的逻辑,然后将其设置为目标。