2013-06-01 173 views
2

我想寫一個簡單的C++程序,輸出一個對象當前的高度,一旦它擊中一個特定的點。我試圖完成的目標是,你有一個物體,從一個不同的位置開始,在重力附加的隨機速度下移動。如果球與牆壁或其他物體碰撞,它應該向後移動,沒有能量損失,但由於重力而仍然繼續下落。一旦球達到特定高度,輸出該值。現在C++邏輯問題

,所有我想現在要做的是檢查,看看是否我的球已經超越了我的寬度範圍。但對於我的生活,我不明白爲什麼我最後一條底部的陳述不會打電話。

我錯過/正在做一些非常愚蠢的事情嗎?

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; 
} 
+1

你應該在'while'中有'targetHeight'而不是'target'嗎? – ChiefTwoPencils

+2

你不應該再檢查距離== 0來看它是否碰到另一面牆嗎?另外,如果球移動速度足夠快以至於穿過牆壁?您應該檢查是否(距離> =寬度或距離<= 0) – Chachmu

+0

遇到「浮點」相等測試時,我總是很震驚! – xtofl

回答

3

你最終if聲明if(distance == width)如果距離已經超出了寬度不測試。你可能想要if(distance >= width)。在你的運動循環中,似乎沒有任何距離的測試,所以距離可能會比寬度更大,從而導致你的如果不成立。

1

以相同的速度向後移動:velocity = -velocity;。當然,如果它向後移動,它可能會撞到另一面牆,所以你可能也想檢查distance == 0;。 (因爲它是浮點數,我還建議你用>=<=而不是精確比較,或者你可能會發現球落在牆上一微米處,然後持續到撞擊太陽,或者數學運算結束,或者無論發生什麼事,如果你繼續前進)。

我會進一步建議,你需要的「房間」球是蹦跳着的寬度和廣度,因此,總需要X,Y,和球的Z座標。

1

注意:您永遠的時間增加,這意味着直接計算的高度和距離(一個說distance = f(time);),但你積累。

所以大概要的分配代替增量distanceheight變量:

​​

下一步,你可能要檢查的旅行distance是否超過的距離(與float平等很不可能,加上不準確)。

一些文體建議:將這些方程式放在它們自己的函數中。