2017-04-10 91 views
1

我正在學習基礎知識,並正在使用我的uni提供的基本圖形庫進行簡單的遊戲。while循環不能在C中使用bool語句(初學者!)

  • 有甩彈(其路徑的繪製)
  • 障礙物(牆) - 這彈丸不能通過所以必須越過
  • 和目標(絕還出現固體所以當它擊中行停止正在繪製)

  • 現在我的彈丸被穿牆右側拋出

  • 問題是與while循環

  • 我添加的任何條件((y_displacement < FLOOR_HEIGHT)之後)有任何作用

(這個彈丸自身停止繪圖時y_displacement => FLOOR_HEIGHT(Y軸反轉),但任何添加bool語句或試圖使用bool(在#including之後)停止被繪製的彈道線不做任何改變。

受審BOOL FOR WALL(不會改變任何東西):

bool hit_wall = false; 


     while ((y_displacement < FLOOR_HEIGHT) && (hit_wall == false)) 
     { 
       time = (x_displacement - X_HAND)/x_velocity; //speed = distance/time 
       y_displacement = (Y_HAND - y_velocity * time) - (GRAVITY * pow(time, 2)/2); 
       GFX_DrawLineTo(x_displacement, y_displacement, 3); 
       x_displacement += 1; 

       if ((x_displacement == (X_MAX/2.5)) && ((y_displacement > (Y_MAX/2)))) 
        { 
         hit_wall = true; 
        } 
     } 

}

如果我能設法排序了這一點那麼我應該能爲我的目標做同樣的..

我在做什麼有什麼問題?

背景:

完整的功能是這樣的:

void throwBall(int(x_position), int(y_position)) 
{ 
    GFX_SetColour(YELLOW); 

    int x_mouse; 
    int y_mouse; 

    int x_distance; 
    int y_distance; 

    double angle; 

    float initial_velocity; 

    float x_velocity; 
    float y_velocity; 

    float time; 

    GFX_MoveTo(X_HAND, Y_HAND); 

    GFX_GetMouseCoordinates(&x_mouse, &y_mouse); 

    x_distance = x_mouse - X_HAND; 
    y_distance = y_mouse - Y_HAND; 

    angle = getAngle(x_distance, y_distance); 

    initial_velocity = sqrt(pow(x_distance, 2) + pow(y_distance, 2)); 

    //these have been divided by 5 as the magnitude was too large for the window 
    y_velocity = (initial_velocity * sin (angle) - GRAVITY * time)/(X_MAX/256); 
    x_velocity = (initial_velocity * cos (angle))/(X_MAX/256); 

    float y_displacement; 
    float x_displacement; 

    x_displacement = X_HAND; 
    y_displacement = Y_HAND; 


    bool hit_wall = false; 


      while ((y_displacement < FLOOR_HEIGHT) && (hit_wall == false)) 
      { 
        time = (x_displacement - X_HAND)/x_velocity; //speed = distance/time 
        y_displacement = (Y_HAND - y_velocity * time) - (GRAVITY * pow(time, 2)/2); 
        GFX_DrawLineTo(x_displacement, y_displacement, 3); 
        x_displacement += 1; 

        if ((x_displacement == (X_MAX/2.5)) && ((y_displacement > (Y_MAX/2)))) 
         { 
          hit_wall = true; 
         } 
      } 
} 
+0

注:不要直接比較的布爾類型使用。自我記錄的名字(通常是形容詞),只是測試,例如'if(!hit_wall)'Wrt你的問題:閱讀[問]並提供[mcve] – Olaf

+1

我不認爲我完全理解你在問什麼。你寫的是「仍然有效」,那麼什麼是行不通的?你的程序的預期行爲和觀察行爲是什麼? –

+0

這是一個可能的問題:'x_displacement ==(X_MAX/2.5)'。計算浮點數(或浮點數和整數)以獲得相等性。請不要這樣做。使用epsilon或使用> =/<= – Arkadiy

回答

0

擴大對有關浮點等價以前的答案和舍入誤差,另一種方式來做到這一點是增加你floatdouble的值由某個因子10將小數點向右移動,然後將其轉換爲intlong it。然後你可以做一個布爾比較,它將在整數這將可靠地工作。我之所以提到這一點是因爲它有時可能更容易編碼,而且比其他答案中描述的使用epilson方法(您也必須對其做一個絕對值)更容易。

要認識的重要因素是乘以或設置epsilon的10倍。

不要發瘋,並通過類似1E9乘或設置epsilon = 1e-9當你並不需要,因爲可以重新引入了同樣的問題。

例如,如果你的距離變量在那麼你需要認識到你不需要大於???的分辨率。以1/100毫米爲例......就你而言,1.230mm == 1.230456789mm。所以然後乘以1e5然後投到int或做epsilon=1e-5;。同樣的原則也適用於單位爲英寸,你通常不需要分辨率大於0.0001" 對任何如此乘以1E4或ε= 1E4

/* example */ 

# define D2I 1e2 /* dbl to int factor, 0.01mm resolution */ 

double x_displacement; /* units of millimeters for this example*/ 
double y_displacement; /* units of millimeters for this example*/ 


/* whatever previous calculations result in... 
    x_displacement having value of 3.00000249687738566 
    y_displacement having value of 120.00000085639820699 
    out past 6 or so decimal places a float or double will have arbitrary numbers, so don't multiply by some huge 1e12 number 
*/ 


if (((int)(x_displacement * D2I) == (int)((X_MAX/2.5) * D2I)) && 
    ((int)(y_displacement * D2I) > (int)((Y_MAX/2 ) * D2I)) 
    ) 
{ 
    hit_wall = true; 
} 
1
if ((x_displacement == (X_MAX/2.5)) && ((y_displacement > (Y_MAX/2)))) 
{ 
     hit_wall = true; 
} 

您使用flaot值,以及由於某種原因(值aprroximatelly),你幾乎從來沒有在這一點,如果得到。

你應該使用>>=<<= poerators,但它也不會幫助你的情況下的100%。

最好的選擇將是使用epsilon(觀測誤差,鄰居)

float eps = 0,0000001f; 

if (abs(x_displacement - (X_MAX/2.5)) < eps 
         && y_displacement > ((Y_MAX/2) - eps)) 
{ 
    hit_wall = true; 
} 
+0

'epsilon'是它是如何拼寫的:)這是一個希臘字母,所以我們不要傳播錯誤的變量名稱。 –