【问题标题】:C simple algorithm .... improper mathC简单算法....不正确的数学
【发布时间】:2015-10-07 03:33:50
【问题描述】:
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

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

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

【问题讨论】:

    标签: c algorithm math


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的帮助。我是c新手,我被误导了。我读到这不是问题,并且 c 会将浮点值截断为 int
    • @MichaelSciortino ,如果将浮点值分配给 int,浮点值将被截断为 int,但您会错过精度
    • 是的,我明白这一点。对于这种特殊情况,不需要精度,我希望它被截断。
    • @MichaelSciortino 根本没有浮点值 - 当您进行除法时,它会立即截断。
    【解决方案2】:

    你的问题就在这里-

    StrFinal/eDefense
    

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

    为了确保它以您期望的方式进行评估,它将任何变量(或两者)类型转换为浮动。

    (float)StrFinal/eDefense
    

    StrFinal/(float)eDefense
    

    您会发现 eHP 的计算结果与您预期的一样为 8。

    【讨论】:

      【解决方案3】:

      案例一:

      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(...)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        相关资源
        最近更新 更多