C++ | 奥特曼战怪兽(类和对象,堆)

奥特曼战怪兽(类和对象,堆)

时间限制: 1 Sec   内存限制: 128 MB
提交: 402   解决: 209
[ 提交][ 状态][ 讨论版]

题目描述

奥特曼要与一群怪兽群殴。其中奥特曼的属性包含等级、生命、攻击力、经验值,所有属性都与等级有关。生命是等级的100倍,攻击力是等级的10倍,经验值初始为0。奥特曼有攻击、被攻击、升级、逃跑等行为。

1、攻击是输出攻击力,对方接受奥特曼的攻击

2、被攻击是受到怪兽的攻击,生命减少值等于对方攻击力的一半(向下取整,例如2.6就取整2)

3、升级是当经验值是等级的10倍及以上,则奥特曼等级加1,并且更新生命、攻击力等属性,每升一级要减掉相应的经验值。例如当前等级是5,若战斗后经验值是65则升级,升级后等级为6,经验值为15

4、逃跑是当奥特曼生命值小于等于5点时(不管怪兽是否死亡),退出战斗立即逃跑,奥特曼等级掉一级,经验值清0,生命设为1,攻击力按照等级更新。

怪兽也包含类似奥特曼的属性,生命是等级的100倍,攻击力是等级的5倍,经验是等级的平方值,经验不是给怪兽用的,是怪兽被打败后奥特曼获取的经验值。怪兽有反击和被攻击等行为。反击是输出攻击力,对方接受怪兽的攻击;被攻击是受到奥特曼攻击,生命值等于当前生命值减对方的攻击力。

战斗过程采用回合制,每回合奥特曼先攻一次,怪兽反击一次,当怪兽死亡(生命小于等于0),则奥特曼获取怪兽身上的经验值级。奥特曼是与怪兽逐个单挑,如果奥特曼未能战胜所有怪兽(就是逃跑啦),则输出失败信息和奥特曼状态。如果奥特曼打赢所有怪兽,则输出胜利信息和奥特曼状态

怪兽是一群的,采用对象的动态数组方式创建,第一个怪兽是1级,后面的怪兽按每2级递增,即3、5、7.......

请用类、构造函数来构建奥特曼,用动态数组构建怪兽群。

输入

第一行输入t表示有t个实例

第二行输入k,表示第1个实例的奥特曼的开始级别

第三行输入n,表示第1个实例有n个怪兽,用动态数组创建怪兽,并按题目要求初始化

以此类推

输出

输出每个实例中与每个怪兽的的战斗结果

如果奥特曼中途失败则不需要继续后面的战斗

具体输出看样本输出

样例输入

2
1
3
3
3

样例输出

----Fight 1----
victory on monster 1
rank=1 hp=82 damage=10 exp=1
lose on monster 2
rank=0 hp=1 damage=0 exp=0
----Fight 2----
victory on monster 1
rank=3 hp=294 damage=30 exp=1
victory on monster 2
rank=3 hp=231 damage=30 exp=10
victory on monster 3
rank=4 hp=400 damage=40 exp=5

#include 
 
using namespace std;
 
class ATM
{
protected:
    int rank,hp,atk,exp;
 
public:
    ATM(int a){rank=a,hp=a*100,atk=a*10,exp=0;}
    ATM(){}
    void beAtk(int n)
    {
        hp-=n/2;
    }
    void init()
    {
        hp=100*rank;
        atk=10*rank;
    }
    void levelUp()
    {
        exp-=rank++*10;
        init();
    }
    void addExp(int _exp)
    {
        exp+=_exp;
        if(exp>=10*rank)
        {
            levelUp();
        }
    }
    void runAway()
    {
        rank--;
        init();
        hp=1;
        exp=0;
    }
    int getRank(){return rank;}
    int getHp(){return hp;}
    int getAtk(){return atk;}
    int getExp(){return exp;}
};  
 
class Monster : public ATM
{
public:
    Monster(int _rank) {rank=_rank,hp=rank*100,atk=rank*5,exp=rank*rank;}
    Monster(){}
    void beAtk(int a) {hp-=a;}
};
 
 
int main()
{
    int t,time,k,n,i,flag;
 
    cin >> time;
    for(t=1; t <= time; t++)
    {
        cin >> k >> n;
        ATM atm(k);
        Monster **monster = new Monster*[n];
        for(i=0; ibeAtk(atm.getAtk());
                if(monster[i]->getHp()<=0)
                {
                    atm.addExp(monster[i]->getExp());
                    flag=1;
                    break;
                }
                atm.beAtk(monster[i]->getAtk());
                if(atm.getHp()<=5)
                {
                    flag=0;
                    atm.runAway();
                    break;
                }
            }
            if(flag)
            {
                cout<<"victory on monster "<

你可能感兴趣的:(C++,有趣的题目)