C简单算法....数学不正确

时间:2015-10-07 03:33:50

标签: c algorithm math

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

我觉得这是一个愚蠢的错误或我忽略的东西。我似乎无法找到它。任何帮助表示赞赏

另外:敌人攻击时的伤害计算似乎也不正确

3 个答案:

答案 0 :(得分:3)

所有变量都是int .. 您需要使用浮点变量来保存小数 主要针对hp和ehp

答案 1 :(得分:1)

你的问题就在这里 -

StrFinal/eDefense

在您的情况下,评估为 10/40 0.25 。由于两个变量都是整数,因此该值被截断为 0

确保它按照您期望的方式评估任何变量(或两者)的浮点数。

(float)StrFinal/eDefense

StrFinal/(float)eDefense

您会发现eHP按预期评估为8。

答案 2 :(得分: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(...)