c语言实现的原神圣遗物评分计算器

由于笔者初学C语言,在代码上难免有疏漏,望各位大佬指正!

attribute.h头文件

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>

//描述一个数据是否合法的结构
typedef struct isValid
{
    int tag;
    int index;
    double num;
} isValid;

typedef struct relicAttributes
{
    double relicElementalCharging; //元素充能效率
    double relicElementalMastery;  //元素精通
    double relicCritDamage;        //暴击伤害
    double relicCritChance;        //暴击率
    double relicHealthPercentage;  //生命值百分比
    double relicHealth;            //生命值
    double relicDefensePercentage; //防御力百分比
    double relicDefense;           //防御力
    double relicAttackPercentage;  //攻击力百分比
    double relicAttack;            //攻击力
} Attributes;

typedef struct yieldWeights
{
    double Charging;               //元素充能效率
    double Mastery;                //元素精通
    double CritDamage;             //暴击伤害
    double CritChance;             //暴击率
    double HealthPercentage;       //生命值百分比
    double Health;                 //生命值
    double DefensePercentage;      //防御力百分比
    double Defense;                //防御力
    double AttackPercentage;       //攻击力百分比
    double Attack;                 //攻击力
} yieldWeights;

//收益权重
yieldWeights* yieldWeightsMultiply(char* role);
//判断输入是否正确
bool isValidValue(isValid* judg);
//输入
Attributes* enterAttributes();
//计算函数
double calculator(Attributes* att, yieldWeights* yie);

algorithm.c源文件

#include "attribute.h"

//判断输入是否正确
bool isValidValue(isValid* judg)
{
    while (getchar() != '\n');
    if (judg->tag == 0)
    {
        printf("输入非法,请重新输入!\n");
        return false;
    }
    else
    {
        if (!((judg->index == -1 && judg->num == 0 || judg->num == 1)
            || (judg->index == -2 && judg->num == 0 || judg->num == 1)
            || (judg->index == 0 && judg->num <= 23.3)
            || (judg->index == 1 && judg->num <= 46.6)
            || (judg->index == 2 && judg->num <= 39)
            || (judg->index == 3 && judg->num <= 140)
            || (judg->index == 4 && judg->num <= 35)
            || (judg->index == 5 && judg->num <= 117)
            || (judg->index == 6 && judg->num <= 35)
            || (judg->index == 7 && judg->num <= 1794)
            || (judg->index == 8 && judg->num <= 43.8)
            || (judg->index == 9 && judg->num <= 140)))
        {
            printf("输入非法,请重新输入!\n");
            return false;
        }
    }
    return true;
}

//输入
double enter(int index)
{
    double num = 0;
    isValid* judg = (isValid*)malloc(sizeof(isValid));
    assert(judg);

    do
    {
        if (index == 0) printf("暴击率      :");//打印说明
        if (index == 1) printf("暴击伤害    :");
        if (index == 2) printf("元素充能效率:");
        if (index == 3) printf("元素精通    :");
        if (index == 4) printf("攻击力百分比:");
        if (index == 5) printf("攻击力      :");
        if (index == 6) printf("生命值百分比:");
        if (index == 7) printf("生命值      :");
        if (index == 8) printf("防御力百分比:");
        if (index == 9) printf("防御力      :");
        judg->tag = scanf("%lf", &num);//输入
        judg->num = num;
        judg->index = index;
    } while (!isValidValue(judg));//判断

    free(judg);
    return num;
}
Attributes* enterAttributes()
{
    double temp[11] = { -1 };//临时存放输入数据
    Attributes* att = (Attributes*)malloc(sizeof(Attributes));
    assert(att);

    for (int i = 0; i < 10; i++)//输入数据
    {
        temp[i] = enter(i);
    }
    
    att->relicCritChance = temp[0];//赋值
    att->relicCritDamage = temp[1];
    att->relicElementalCharging = temp[2];
    att->relicElementalMastery = temp[3];
    att->relicAttackPercentage = temp[4];
    att->relicAttack = temp[5];
    att->relicHealthPercentage = temp[6];
    att->relicHealth = temp[7];
    att->relicDefensePercentage = temp[8];
    att->relicDefense = temp[9];

    return att;
}

//计算函数(核心算法)
double calculator(Attributes* att, yieldWeights* yie)
{
    double critStrikeChance = att->relicCritChance * 2 * yie->CritChance;
    double critDamage = att->relicCritDamage * 1 * yie->CritDamage;
    double elementalMastery = att->relicElementalMastery * 0.33 * yie->Mastery;
    double elementalCharging = att->relicElementalCharging * 1.1979 * yie->Charging;
    double attackPercentage = att->relicAttackPercentage * 1.33 * yie->AttackPercentage;
    double healthPercentage = att->relicHealthPercentage * 1.33 * yie->HealthPercentage;
    double defensePercentage = att->relicDefensePercentage * 1.06 * yie->DefensePercentage;
    double attack = att->relicAttack * 0.398 * 0.5 * yie->Attack;
    double health = att->relicHealth * 0.026 * 0.66 * yie->Health;
    double defense = att->relicDefense * 0.355 * 0.66 * yie->Defense;

    return (critStrikeChance + critDamage + elementalMastery + elementalCharging
        + attackPercentage + healthPercentage + defensePercentage
        + attack + health + defense);
}

yieldWeights.c源文件

#include "attribute.h"

//收益权重
yieldWeights* yieldWeightsMultiply(char* role)
{
    yieldWeights* yie = (yieldWeights*)malloc(sizeof(yieldWeights));
    assert(yie);

    /*
    将角色相同的收益权重归为一类,大大简化代码量
    */

    //暴击率
    if (strcmp(role, "shgxh") == 0)
    {
        yie->CritChance = 0;
    }
    else if (strcmp(role, "yj") == 0 || strcmp(role, "wl") == 0 || strcmp(role, "dan") == 0
        || strcmp(role, "tm") == 0 || strcmp(role, "bbl") == 0 || strcmp(role, "zy") == 0
        || strcmp(role, "bnt") == 0)
    {
        yie->CritChance = 0.5;
    }
    else
    {
        yie->CritChance = 1;
    }

    //暴击伤害
    if (strcmp(role, "shgxh") == 0)
    {
        yie->CritDamage = 0;
    }
    else if (strcmp(role, "yj") == 0 || strcmp(role, "wl") == 0 || strcmp(role, "dan") == 0
        || strcmp(role, "tm") == 0 || strcmp(role, "bbl") == 0 || strcmp(role, "zy") == 0
        || strcmp(role, "bnt") == 0)
    {
        yie->CritDamage = 0.5;
    }
    else
    {
        yie->CritDamage = 1;
    }

    //元素充能效率
    if (strcmp(role, "wl") == 0 || strcmp(role, "bnt") == 0
        || strcmp(role, "dan") == 0 || strcmp(role, "tm") == 0)
    {
        yie->Charging = 1;
    }
    else if (strcmp(role, "ldjj") == 0 || strcmp(role, "mn") == 0)
    {
        yie->Charging = 0.75;
    }
    else if (strcmp(role, "nae") == 0)
    {
        yie->Charging = 0.7;
    }
    else if (strcmp(role, "lyl") == 0 || strcmp(role, "kds") == 0 || strcmp(role, "dl") == 0
        || strcmp(role, "kelai") == 0 || strcmp(role, "yl") == 0 || strcmp(role, "sh") == 0
        || strcmp(role, "fywy") == 0 || strcmp(role, "xq") == 0 || strcmp(role, "zl") == 0
        || strcmp(role, "xl") == 0 || strcmp(role, "wd") == 0 || strcmp(role, "shgxh") == 0
        || strcmp(role, "x") == 0 || strcmp(role, "jtsl") == 0 || strcmp(role, "q") == 0
        || strcmp(role, "bd") == 0 || strcmp(role, "bbl") == 0 || strcmp(role, "lxzc") == 0
        || strcmp(role, "cy") == 0 || strcmp(role, "qq") == 0 || strcmp(role, "zy") == 0
        || strcmp(role, "xy") == 0 || strcmp(role, "st") == 0 || strcmp(role, "jqr") == 0)
    {
        yie->Charging = 0.55;
    }
    else if (strcmp(role, "hlyd") == 0 || strcmp(role, "youla") == 0 || strcmp(role, "sllh") == 0)
    {
        yie->Charging = 0.3;
    }
    else
    {
        yie->Charging = 0;
    }

    //元素精通
    if (strcmp(role, "nxd") == 0 || strcmp(role, "fywy") == 0 || strcmp(role, "zy") == 0
        || strcmp(role, "st") == 0 || strcmp(role, "jqr") == 0)
    {
        yie->Mastery = 1;
    }
    else if (strcmp(role, "nl") == 0 || strcmp(role, "sn") == 0 || strcmp(role, "tnl") == 0
        || strcmp(role, "kelai") == 0 || strcmp(role, "lyypz") == 0 || strcmp(role, "bcsz") == 0 
        || strcmp(role, "xl") == 0 || strcmp(role, "ht") == 0 || strcmp(role, "gy") == 0 
        || strcmp(role, "wd") == 0 || strcmp(role, "mn") == 0 || strcmp(role, "ddly") == 0 
        || strcmp(role, "xg") == 0 || strcmp(role, "kl") == 0 || strcmp(role, "bd") == 0 
        || strcmp(role, "dlk") == 0 || strcmp(role, "lxzc") == 0 || strcmp(role, "lxzl") == 0 
        || strcmp(role, "lxzf") == 0 || strcmp(role, "cy") == 0 || strcmp(role, "yf") == 0 
        || strcmp(role, "ab") == 0 || strcmp(role, "ls") == 0)
    {
        yie->Mastery = 0.75;
    }
    else
    {
        yie->Mastery = 0;
    }

    //攻击
    if (strcmp(role, "sh") == 0 || strcmp(role, "qq") == 0)
    {
        yie->AttackPercentage = 1;
        yie->Attack = 1;
    }
    else if (strcmp(role, "nxd") == 0)
    {
        yie->AttackPercentage = 0.55;
        yie->Attack = 0.55;
    }
    else if (strcmp(role, "hlyd") == 0 || strcmp(role, "wl") == 0 || strcmp(role, "bnt") == 0
        || strcmp(role, "ht") == 0 || strcmp(role, "shgxh") == 0 || strcmp(role, "dan") == 0
        || strcmp(role, "tm") == 0 || strcmp(role, "bbl") == 0 || strcmp(role, "nae") == 0
        || strcmp(role, "zy") == 0)
    {
        yie->AttackPercentage = 0.5;
        yie->Attack = 0.5;
    }
    else if (strcmp(role, "lyl") == 0 || strcmp(role, "nl") == 0 || strcmp(role, "kds") == 0
        || strcmp(role, "yl") == 0 || strcmp(role, "yj") == 0 || strcmp(role, "abd") == 0
        || strcmp(role, "jqr") == 0)
    {
        yie->AttackPercentage = 0;
        yie->Attack = 0;
    }
    else
    {
        yie->AttackPercentage = 0.75;
        yie->Attack = 0.75;
    }

    //生命值
    if (strcmp(role, "lyl") == 0 || strcmp(role, "nl") == 0 || strcmp(role, "kds") == 0
        || strcmp(role, "bnt") == 0 || strcmp(role, "shgxh") == 0 || strcmp(role, "dan") == 0
        || strcmp(role, "tm") == 0 || strcmp(role, "bbl") == 0 || strcmp(role, "jqr") == 0)
    {
        yie->HealthPercentage = 1;
        yie->Health = 1;
    }
    else if (strcmp(role, "yl") == 0 || strcmp(role, "zl") == 0 || strcmp(role, "ht") == 0)
    {
        yie->HealthPercentage = 0.8;
        yie->Health = 0.8;
    }
    else if (strcmp(role, "dl") == 0)
    {
        yie->HealthPercentage = 0.75;
        yie->Health = 0.75;
    }
    else if (strcmp(role, "sllr") == 0)
    {
        yie->HealthPercentage = 0.5;
        yie->Health = 0.5;
    }
    else
    {
        yie->HealthPercentage = 0;
        yie->Health = 0;
    }

    //防御力
    if (strcmp(role, "yj") == 0 || strcmp(role, "hlyd") == 0 || strcmp(role, "wl") == 0
        || strcmp(role, "abd") == 0)
    {
        yie->DefensePercentage = 1;
        yie->Defense = 1;
    }
    else if (strcmp(role, "nae") == 0)
    {
        yie->DefensePercentage = 0.9;
        yie->Defense = 0.9;
    }
    else
    {
        yie->DefensePercentage = 0;
        yie->Defense = 0;
    }

    return yie;
}

mian.c源文件

#include "attribute.h"

int main()
{    
    isValid* judg = (isValid*)malloc(sizeof(isValid));
    assert(judg);

    int Tag = 1;//index == -2
    while (Tag)
    {
        Tag = 0;

        char role[10] = { 0 };
        printf("输入该圣遗物所属角色全称首字母\n(eg:霄宫 ==> xg 注:优菈、科莱要输全拼):");
        scanf("%s", role);
        while (getchar() != '\n');

        int isCrit;//index == -1
        do
        {
            printf("主词条是否为双爆?是 1 否 0 :");
            judg->tag = scanf("%d", &isCrit);
            judg->num = (double)isCrit;
            judg->index = -1;
        } while (!isValidValue(judg));
        
        printf("副词条:\n");
        Attributes* att = enterAttributes();

        if (isCrit == 1)//主词条为双爆
        {
            printf("该圣遗物评分为:%d\n", (int)(20 + calculator(att, yieldWeightsMultiply(role)) + 0.5));
        }
        else if(isCrit == 0)//主词条不为双爆
        {
            printf("该圣遗物评分为:%d\n", (int)(calculator(att, yieldWeightsMultiply(role)) + 0.5));
        }

        do
        {
            printf("是否继续?是 1 否 0:");
            judg->tag = scanf("%d", &Tag);
            judg->num = (double)Tag;
            judg->index = -2;
        } while (!isValidValue(judg));

        printf("\n");
    }
    printf("再见!\n");

    free(judg);
    system("pause");
    return 0;
}

由于笔者能力有限,暂时只能以打印日志的形式实现,学了界面设计后会尝试对其程序进行一波大改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值