首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数学难度大的Pong AI

数学难度大的Pong AI
EN

Stack Overflow用户
提问于 2012-07-13 05:50:27
回答 3查看 1.3K关注 0票数 2

我正在为我的Pong克隆编写一些困难,我正在编写以熟悉SFML和Xcode。对于最难的难度,我想创建一个AI级别,在这个级别上,计算机可以立即知道球将去哪里。所以,如果我有我的xVelocity和yVelocity,我可以有效地得到斜率。问题是,每次球打到顶部或底部,yVelocity就会反转。所以从本质上讲,我有一个代数斜率问题,每当墙被击中时,它都会做相反的事情。

现在,我的屏幕高度是600像素,命中检测在顶部和底部是5像素,空间是590像素。

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

如果我可以简化这件事,请告诉我。再一次,我知道如何通过计算它,比方说,如果球弹了4次,4次,但我想知道是否有一种方法可以计算出,在边界处有y速度开关。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-13 06:10:21

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

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

现在我们想知道当x是770-30位时y将等于什么,所以做一下数学运算:

代码语言:javascript
复制
y = (1.45)(740) + (240) = 1313

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

代码语言:javascript
复制
y/height = floor(1313/590) = 2 times

这意味着坡度仍在向上移动,它将在

代码语言:javascript
复制
y mod height = 1313 mod 590 or 133

如果它反映了奇数次的(floor(y/2) %2 == 1),那么您必须使用以下公式来计算它

代码语言:javascript
复制
MAX_HEIGHT - (y mod height) = 590 - (1903 mod 590) = 590 - 133 = 457

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

代码语言:javascript
复制
--------------------------------------------------------------------
|
|
|
|                                                 ball ends up here (*)
|                                                                *
|                                                            *
|                                                        *
------------------------(reflection  two)------------*---------------
|                                                *
|                                            *
|                                        *
|                                    *
|                                *
|                            *
|                        *
---------------------*---------(reflection 1)------------------------------
|                *
|            *
|        *
|    *
|*ball hit here
| 
|
-----------------------------------------------------------------------

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

票数 7
EN

Stack Overflow用户

发布于 2012-07-13 05:59:40

我没有试过,但是如果你知道它在“y轴”上的位置和斜率,你就会有一个斜率截距公式。插入到另一边的距离,你就可以知道它是在屏幕上方、下方还是内部。如果它会高于或低于,计算当y到达顶部或底部时,x将是多少,从总x中减去,然后重复。

票数 1
EN

Stack Overflow用户

发布于 2014-08-09 13:17:01

如果你遇到了数学问题,这里是一个编程上不那么优雅(也更慢,在大多数pong实现中无关紧要)的解决方案:

代码语言:javascript
复制
    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;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11461249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档