程设:魔兽世界装备之二

魔兽世界第二次的小作业,添加了soldier类和指针数组,为后面用多态做准备吧。算法上没有什么难度,因此直接贴代码吧。

#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
using namespace std;

int soldier_HP[5];
char soldier_name[5][20] = {"iceman", "lion", "wolf", "ninja", "dragon"};
char weapon_name[3][20] = {"sword", "bomb", "arrow"};
//different soldier class
class csoldier
{
public:
    int HP;
    csoldier(int n = 0):HP(n){}
    ~csoldier(){}
    friend class player;
};
class dragon:public csoldier
{
private:
    friend class player;
    int weapon;
    double morale;
    //constructor
    dragon(int n, int p_hp)
    {
        weapon = n % 3;
        morale = 1.0 * p_hp / soldier_HP[4];
       // cout << morale << endl;
        printf("It has a %s,and it's morale is %.2f\n", weapon_name[weapon], morale);
    }
    //destructor
    ~dragon(){}
};

class ninja:public csoldier
{
private:
    friend class player;
    int weapon[2];
    ninja(int n)
    {
        weapon[0] = n % 3;
        weapon[1] = (n + 1) % 3;
        printf("It has a %s and a %s\n", weapon_name[weapon[0]], weapon_name[weapon[1]]);
    }
    ~ninja(){}
};

class iceman:public csoldier
{
private:
    friend class player;
    int weapon;
    iceman(int n)
    {
        weapon = n % 3;
        printf("It has a %s\n", weapon_name[weapon]);
    }
};

class lion:public csoldier
{
private:
    friend class player;
    int loyalty;
    lion(int p_hp)
    {
        loyalty = p_hp;
        printf("It's loyalty is %d\n", loyalty);

    }
};

class wolf:public csoldier
{
private:
    friend class player;
};

class player
{
private:
    int time, soldier_total, cur;
    int HP;
    char name[20];
    bool produce_end;//if production is carrying on, it is false, if else it is true
    csoldier *head[10000];
    int soldier[5];//in the order of iceman¡¢lion¡¢wolf¡¢ninja¡¢dragon
public:
    int arr[5] = {0, 1, 2, 3, 4};
    int arr2[5] = {1, 4, 3, 0, 2};
    player(const char* p, int n):HP(n), time(-1), produce_end(true), soldier_total(0), cur(-1)
    {
        strcpy(name, p);
        if(strcmp(name, "blue") == 0)
        {
            for(int i = 0; i < 5; ++i)
                arr[i] = arr2[i];
        }
        memset(soldier, 0, sizeof(soldier));
    };
    //player(): HP(0),time(-1), produce_end(true),soldier_total(0){memset(soldier, 0, sizeof(soldier));};
    int gettime()
    {
        return time;
    }
    bool run()
    {
        if(produce_end == false)
            return false;
        ++time;
        cur = (cur + 1) % 5;
        int t = arr[cur];
        if(HP >= soldier_HP[t])
        {
            HP -= soldier_HP[t];
            soldier[t]++;
            soldier_total++;
            cout << setfill('0') << setw(3) << time << ' ' << name << ' ' << soldier_name[t] <<
            ' ' << soldier_total << " born with strength " << soldier_HP[t] << ',' << soldier[t] << ' ' <<
            soldier_name[t] << " in " << name << " headquarter" << endl;
            switch(t)
            {
                case 0: head[soldier_total] = new iceman(soldier_total);break;
                case 1: head[soldier_total] = new lion(HP);break;
                case 2: head[soldier_total] = new wolf();break;
                case 3: head[soldier_total] = new ninja(soldier_total);break;
                case 4: head[soldier_total] = new dragon(soldier_total, HP);break;
            }

            return true;
        }
        else
        {
            int i, t;
            for(i = 1; i < 5; ++i)
            {
                cur++;
                t = arr[cur % 5];
                if(HP >= soldier_HP[t])
                {
                    HP -= soldier_HP[t];
                    soldier[t]++;
                    soldier_total++;
                cout << setfill('0') << setw(3) <<time << ' ' << name << ' ' << soldier_name[t] <<
                ' ' << soldier_total << " born with strength " << soldier_HP[t] << ',' << soldier[t] << ' ' <<
                soldier_name[t] << " in " << name << " headquarter" << endl;
                switch(t)
                {
                    case 0: head[soldier_total] = new iceman(soldier_total);break;
                    case 1: head[soldier_total] = new lion(HP);break;
                    case 2: head[soldier_total] = new wolf();break;
                    case 3: head[soldier_total] = new ninja(soldier_total);break;
                    case 4: head[soldier_total] = new dragon(soldier_total, HP);break;
                }
                    return true;
                }

            }
            if(i == 5)
            {
                cout << setfill('0') << setw(3) <<time << ' ' << name;
                cout << " headquarter stops making warriors" << endl;
                produce_end = false;
                return false;
            }
        }
    }
};
int main()
{
    int n, hp, cnt = 0;
    cin >> n;
    while(n--)
    {
        cin >> hp;
//        const char *p = "Hello world";
//        cout << p << endl;
        player R("red", hp), B("blue", hp);
        cin >> soldier_HP[4] >> soldier_HP[3] >> soldier_HP[0] >> soldier_HP[1] >> soldier_HP[2];
        bool f[2];
        //f[0] = true;
        cout << "Case:" << ++cnt << endl;
        f[0] = R.run();
        f[1] = B.run();
        while(f[0] || f[1])
        {
            f[0] = R.run();
            f[1] = B.run();
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40841416/article/details/79678505
今日推荐