C语言实例_3之分段计算加成

1. 题目

玩游戏时,当攻击力高于某一阶段时,会获得额外战斗力加成,当然攻击力越高,提升越少,不然就破坏游戏平衡了。

规则如下:
规则1:攻击力低于或等于10万时,战斗力额外可提升10%;
规则2:攻击力高于10万,低于20万时,低于10万的部分按规则1,高于10万的部分,战斗力额外可提升7.5%;
规则3:20万到40万之间时,低于20万的部分按规则2,高于20万的部分,战斗力额外可提升5%;
规则4:40万到60万之间时,低于40万的部分按规则3,高于40万的部分,战斗力额外可提升3%;
规则5:60万到100万之间时,低于60万的部分按规则4,高于60万的部分,战斗力额外可提升1.5%;
规则6:高于100万时,低于100万的部分按规则5,高于100万的部分,战斗力额外可提升1%.

玩家可从键盘输入角色攻击力,求额外战斗力加成是多少?

2. 分析

这需要根据规则进行分段计算。

3. 实例代码之if计算

cpp 复制代码
#include <stdio.h>

int main() {
    double attackPower;
    double extraBonus = 0;

    // 从键盘输入角色攻击力
    printf("请输入角色的攻击力:");
    scanf("%lf", &attackPower);

    if (attackPower <= 100000) {
        extraBonus = attackPower * 0.1;
    } else if (attackPower > 100000 && attackPower < 200000) {
        extraBonus = 100000 * 0.1 + (attackPower - 100000) * 0.075;
    } else if (attackPower >= 200000 && attackPower < 400000) {
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + (attackPower - 200000) * 0.05;
    } else if (attackPower >= 400000 && attackPower < 600000) {
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (attackPower - 400000) * 0.03;
    } else if (attackPower >= 600000 && attackPower < 1000000) {
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (attackPower - 600000) * 0.015;
    } else if (attackPower >= 1000000) {
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (attackPower - 1000000) * 0.01;
    }

    printf("额外战斗力加成是:%lf\n", extraBonus);

    return 0;
}

以上代码就是根据业务,硬编程,便于理解。

以下是使用switch实现

4. 实例代码之switch计算

cpp 复制代码
#include <stdio.h>

int main() {
    double attackPower;
    double extraBonus = 0;

    // 从键盘输入角色攻击力
    printf("请输入角色的攻击力:");
    scanf("%lf", &attackPower);

    // 根据攻击力范围确定初始区间索引
    int intervalIndex;
    if (attackPower <= 100000) {
        intervalIndex = 1;
    } else if (attackPower <= 200000) {
        intervalIndex = 2;
    } else if (attackPower <= 400000) {
        intervalIndex = 3;
    } else if (attackPower <= 600000) {
        intervalIndex = 4;
    } else if (attackPower <= 1000000) {
        intervalIndex = 5;
    } else {
        intervalIndex = 6;
    }

    switch (intervalIndex) {
    case 1:
        extraBonus = attackPower * 0.1;
        break;
    case 2:
        extraBonus = 100000 * 0.1 + (attackPower - 100000) * 0.075;
        break;
    case 3:
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + (attackPower - 200000) * 0.05;
        break;
    case 4:
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + (attackPower - 400000) * 0.03;
        break;
    case 5:
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + (attackPower - 600000) * 0.015;
        break;
    case 6:
        extraBonus = 100000 * 0.1 + 100000 * 0.075 + 200000 * 0.05 + 200000 * 0.03 + 400000 * 0.015 + (attackPower - 1000000) * 0.01;
        break;
    default:
        printf("输入有误,请重新输入有效攻击力值。\n");
        break;
    }

    printf("额外战斗力加成是:%lf\n", extraBonus);

    return 0;
}

这个和if计算类似。

5. 实例代码之switch穿透现象计算

cpp 复制代码
#include <stdio.h>

int main() {
    double attackPower;
    double extraBonus = 0.0;
    int nBaseNo = 100000;

    // 从键盘输入角色攻击力
    printf("请输入角色的攻击力:");
    scanf("%lf", &attackPower);

    int nFlag;
    nFlag = (int)(attackPower / nBaseNo);
    nFlag = nFlag > 10 ? 10 : nFlag;

    switch (nFlag) {
    case 10:
        extraBonus += (attackPower - 10 * nBaseNo) * 0.01;
        attackPower = 10 * nBaseNo;
    case 9:
    case 8:
    case 7:
    case 6:
        extraBonus += (attackPower - 6 * nBaseNo) * 0.015;
        attackPower = 6 * nBaseNo;
    case 5:
    case 4:
        extraBonus += (attackPower - 4 * nBaseNo) * 0.03;
        attackPower = 4 * nBaseNo;
    case 3:
    case 2:
        extraBonus += (attackPower - 2 * nBaseNo) * 0.05;
        attackPower = 2 * nBaseNo;
    case 1:
        extraBonus += (attackPower - nBaseNo) * 0.075;
        attackPower = nBaseNo;
    case 0:
        extraBonus += attackPower * 0.1;
    }

    printf("额外战斗力加成是:%lf\n", extraBonus);

    return 0;
}

除此之外,还可以使用 数组、递归、链表等方式实现。主要是分析方式,实现就多了。

相关推荐
OpenAnolis小助手41 分钟前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界43 分钟前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
ForteScarlet1 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖1 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
菜鸟~noob2332 小时前
【电子战】 第01篇:噪声、门限与虚警/检测概率(PFA/PD)【含matlab代码】
开发语言·matlab
奇牙coding1232 小时前
GPT-6-Astra API 接入教程:OpenRouter 路由配置 + Python/curl 示例 + 静默降级踩坑
开发语言·python·gpt·ai
lzx_0023 小时前
C++11(一)
开发语言·c++·算法
未来之窗软件服务3 小时前
计算机二级[英文]-C 字符串移动—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟
Wang's Blog3 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring
谢尔登4 小时前
01_Java基础速通
java·开发语言