2015-10-07 63 views
1
int main() 
{ 
int StrFinal = 10; 
int DefFinal = 20; 
int IntFinal = 40; 
int hp = 10; 


int eStrength = 30; 
int eDefense = 40; 
int eIntelligence = 25; 
int eHP = 10; 

/* 
* Begin Battle Sequence 
* 
*/ 

printf("Battle Start! \n"); 



    while(eHP>0||hp>0) 
{ 
    int act; 

    printf("Player HP: %d Enemy HP: %d \n ", hp, eHP); 
    printf("1 - Attack \n 2 - Magic \n Select Your Move: "); 
    scanf("%d",&act); 

    switch (act) 
    { 
     case 1: 
      eHP = eHP - StrFinal/eDefense*5; 
      printf("You attacked the enemy! \n "); 
      break; 

     case 2: 
      eHP = eHP - IntFinal/eIntelligence*5; 
      printf("You Shocked the enemy! \n "); 
      break; 

     default: 
      printf("Invalid Input"); 

    } 

     printf("The enemy attacked you! \n"); 
     hp = hp - eStrength/DefFinal*5; 
     printf(" Enemy HP: %d \n",eHP); 
     printf(" Your HP: %d \n", hp); 

} 

return 0; 
} 

這是一個簡單的代碼我寫文字遊戲的戰鬥序列。我遇到的問題是用戶和敵人的健康輸出是不正確的。通過數學計算,敵方HP受到攻擊時應該減少1.25 ..從8.75減少到8,但輸出不影響敵方HP。ç簡單的算法....不當數學

如果我要選擇2,輸出會hp = 5敵人hp = 5

我覺得好象是一個愚蠢的錯誤什麼的,我俯瞰。我似乎無法找到它。任何幫助表示讚賞

另外:傷害計算時,敵人的攻擊似乎也不是正確的

回答

1

你的問題就出在這裏 -

StrFinal/eDefense 

你的情況,計算結果爲10/40這將是0.25。由於這兩個變量都是整數,因此該值被截斷爲。

爲了確保其在評估你期待它強制轉換的變量(或兩者)中的任何一個浮動的方式。

(float)StrFinal/eDefense 

StrFinal/(float)eDefense 

你會發現,EHP計算結果爲8,你的預期。

3

所有變量都是INT .. 您需要使用float變量來保存小數 主要針對惠普和EHP

+0

非常感謝您的幫助。我對c是新手,我誤導了我。我讀到這不會是一個問題,並且c會將float值截斷爲int –

+0

@MichaelSciortino,如果您將浮點值賦予int,但Float值將被截斷爲int,但您將錯過精度 – makdu

+0

是的,我理解這個。對於這種特殊情況,精度是不需要的,我希望它被截斷。 –

0

案例1:

eHP = eHP - StrFinal/eDefense*5 = 10 - 10/40*5 = 10 - 0 * 5 = 10; 

這是因爲隱式轉換的。所有數字都是int。如有必要,每個子表達式都會相應地轉換。

10/40導致浮動,但是轉化爲int。因此,您乘以0而不是0.25

只要有一個float類型的計算會導致你的期望。

其他情況是相似的。

而且include <stdio.h>順便說一下,你正在使用scanf(...)