由于笔者初学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;
}
由于笔者能力有限,暂时只能以打印日志的形式实现,学了界面设计后会尝试对其程序进行一波大改。