题目要求你为一款战舰游戏制作血量统计程序。
一部分参数详解:
船只类型:CV CA CL BB DD
弹药类型:AP HE ST DT
HE弹药:完全穿透时造成100%最高伤害,穿深大于装甲厚度,小于130%装甲厚度时为50%伤害,其他情况不造成伤害。不会跳弹。
AP弹药:装甲厚度小于40%穿深时造成25%伤害,装甲厚度大于50%穿深小于100%穿深时造成100%伤害,未击穿不造成伤害。在入射角小于30度时跳弹,不造成伤害。
ST弹药:无视装甲厚度,但是受鱼雷伤害减免影响。入射角小于10度时跳弹。
DT弹药:无视装甲厚度,但是受鱼雷伤害减免影响。入射角小于10度时跳弹。只能攻击CV/CA/BB,对CL/DD无伤害。
第一行为战舰信息,格式为
船只类型 装甲厚度 最大血量 鱼雷伤害减免(百分比)
此后有n(n<20)行攻击信息,格式为
弹药类型 伤害 穿深(鱼雷为32767) 入射角(仅供计算跳弹使用)
以0 0 0 0标记输入结束,题目保证所有数据在int范围内。
代码很长,函数很多,尽量OOP。
#include<cstdio>
#include<cstring>
class ship_info
{
public:
int HP; /* 血量 */
enum type_{CV,CA,CL,BB,DD} type; /* 船只类型 */
int armor_thickness; /* 装甲厚度 */
double damage_reduction; /* 鱼雷伤害减免 */
inline void typeSet_(const char*);
inline bool sinked();
inline void heat(const class ammo_info);
};
class ammo_info
{
public:
enum type_{AP,HE,ST,DT} type; /* 弹药类型 */
int hurt; /* 伤害 */
int PD; /* 穿深 */
int AOI; /* 入射角 */
void typeSet_(const char*);
};
/* 想什么呢,你以为我会给你标程?自己去写函数定义! */
int main()
{
using namespace std;
ship_info ship;
ammo_info ammo;
char a[3];
scanf("%s %d %d %lf", a, &ship.armor_thickness, &ship.HP, &ship.damage_reduction);
ship.damage_reduction /= 100;
ship.typeSet_(a);
while (getchar() != EOF)
{
scanf("%s %d %d %d", a, &ammo.hurt, &ammo.PD, &ammo.AOI);
if (!strcmp(a, "0")) break;
ammo.typeSet_(a);
ship.heat(ammo);
}
if (ship.sinked()) puts("The ship has been sunk");
else printf("%d\n", ship.HP);
return 0;
}