我正在尝试编写一个简单的c ++程序,一旦遇到特定点就会输出对象的当前高度。我想要完成的目标是你有一个物体,它从一个不同的位置开始,随着重力附着在一个随机的速度下移动。如果球与墙壁或其他物体碰撞,它应向后移动,没有能量损失,但仍然会因重力而继续下落。一旦球到达特定高度,输出该值。
现在,我正在努力做的就是检查我的球是否超出了我的宽度范围。但是对于我的生活,我不明白为什么我最后的if语句不会打电话。
我是否缺少/做一些非常愚蠢的事情?
int _tmain(int argc, _TCHAR* argv[])
{
float velocity;
float height, targetHeight;
float gravity;
float time;
float angle;
float width;
float move;
float distance;
gravity = 9.80f;
time = 0;
distance = 0;
cout << "Set Height\n";
cin >> height;
cout << "Set target height\n";
cin >> targetHeight;
cout << "Set Angle ( 0 - 90 ): \n";
cin >> angle;
angle *= 3.14 * 180; // convert to radians
cout << "Set velocity (0 - 100): \n";
cin >> velocity;
cout << "Set Play field Width: \n";
cin >> width;
while( height >= target )
{
time++;
distance += velocity * cos(angle) * time;
height += (velocity * sin(angle) * time) - (gravity * pow(time, 2) ) / 2;
}
if( distance == width)
{
cout << "You've hit the wall\n";
}
return 0;
}
答案 0 :(得分:3)
您的最终if
声明if( distance == width )
不会测试距离是否超出宽度。你可能想要if( distance >= width )
。似乎没有对你的运动循环内行进的距离进行任何测试,因此距离可能很容易大于宽度,从而导致你的情况不真实。
答案 1 :(得分:1)
以相同的速度向后移动:velocity = -velocity;
。当然,如果它向后移动,它可能会碰到另一面墙,所以你可能也想查看distance == 0;
。 (因为它是浮点数,我还建议你使用>=
和<=
而不是精确的比较,或者你可能会发现球是一个微米过去的墙,然后继续直到它击中太阳,或者你的数学用完了,或者如果你永远继续下去就会发生其他事情。)
我会进一步建议您需要球在其中弹跳的“房间”的宽度和宽度。因此,总共需要球的X,Y和Z坐标。
答案 2 :(得分:1)
注意:你的时间有所增加,这意味着高度和距离的直接公式(一个说distance = f(time);
),但你正在积累。
所以你可能希望分配而不是增加你的distance
和height
变量:
distance = velocity * cos(angle) * time;
height = (velocity * sin(angle) * time) - (gravity * pow(time, 2) ) / 2;
接下来,您可能想要检查行进的distance
是否超过到墙的距离(与float
的相等是非常不可能的,加上不准确)。
一些风格建议:将这些方程式放在自己的函数中。