其他分享
首页 > 其他分享> > 实验五 模板与多态

实验五 模板与多态

作者:互联网

 1 #include<iostream>
 2 #include<string>
 3 #include<iomanip>
 4 #include<vector>
 5 #include<fstream>
 6 using namespace std;
 7 class Person{
 8     public:
 9         Person(){};
10         Person (string n,string t,string e=" "):name(n),telephone(t),email(e){}
11         void change_t(string t){
12             telephone=t;
13         }
14         
15         void change_e(string e){
16             email=e;
17         }
18         
19     friend    ostream& operator<<(ostream& out,Person& p)    ;
20     friend    istream& operator>>(istream& in,Person &p)    ;    
21     friend    bool operator==(const Person& p1,const Person& p2);
22     private:
23         string telephone;
24         string name ;
25         string email;
26 }; 
27 ostream& operator<<(ostream& out,Person& p){
28     out<<left<<setw(20)<<p.telephone
29     <<left<<setw(20)<<p.name
30     <<left<<p.email;
31 }
32 istream& operator>>(istream& in,Person &p){
33     getline(in,p.name);
34     getline(in,p.telephone);
35     getline(in,p.email);
36     return in;
37 }
38 bool operator==(const Person& p1,const Person& p2)
39 {
40     return p1.name==p2.name&&
41     p1.telephone==p2.telephone;
42 }
43 int main(){
44     vector<Person>phone_book;
45     Person p;
46     while(cin>>p)
47         phone_book.push_back(p); 
48         
49         
50          
51       for(auto &i: phone_book)
52         cout << i << endl;
53     
54     cout << boolalpha << (phone_book.at(0) == phone_book.at(1)) << endl;
55 
56     ofstream fout;
57 
58     fout.open("phone_book.txt");
59 
60     if(!fout.is_open())
61     {
62         cerr << "fail to open file phone_book.txt\n";
63         return 1;
64     }
65 
66     for(auto &i: phone_book)
67         fout << i << endl;
68     
69     fout.close();
70 }
#ifndef   _CONTAINER
#define  _CONTAINER
class container
{
    protected:
        int numOFHeal;
        int numOFMW;
    public:
        container();
        void set(int heal_n,int mw_n);
        int nOFHeal();
        int nOFMW();
        void display();
        bool useHeal();
        bool useMW();
}
#endif
#include"container.h"
#include<iostream>
using namespace std;
container::container() 
{
    set(0,0)
}
void container::set(int heal_n,int mw_n){
    numOFHeal=heal_n;
    numOFMW=mw_n;
} 
int container::nOFHeal() {
    return numOFHeal;
    
}
int container::nOFMW() {
    return nOFMW; 
}
void display(){
    cout<<"Your bag contains:"<<endl;
    cout<<"Heal (HP+100)"<<numOFHeal<<endl;
    cout<<"Magic Water (MP+80)"<<numMP<<endl;
} 
bool container::useHeal() {
    numOFHeal--;
    return 1;
}
bool container::useMW() {
    numMP--;
    return 1;
}
#ifdef _PLAYER
#define _PLARER
#include <iostream>
#include<iomanip>
#include<time.h>
#include<container.h>
#include<string>
using std::string;
enum job{sw,ar,mg};
class player{
    friend void showinfo(play &p1,player &p2);
    friend class swordsman ;
    protected:
        int HP,HPmax,MP,MPmax,AP,speed, EXP,LV;
        string name;
        job role;
        container bag;
    public:
        virtual bool attack(player &p)=0;
        virtual bool specialatt(player &p)=0;
        virtual void isLevelUp()=0;
        void reFill();
        void death();
        void isDead();
        bool useHeal();
        bool useMW();
        void transfer(player &p);
        void showRole();
    private:
        bool playerdeath;
};
#endif
#include"player.h"
#include"container.h"
#include<iostream>
#include <string>
#include<iomanip>
using std::setw;
using std::cout;
using std::endl;
void player::reFill()
{
    HP=HPmax;
    MP=MPmax;
}
bool player::death(){
    return playerdeath;
}
bool player::isdead()
{
    if(HP<=0)
    {
        cout<<name<<"is Dead."<<endl;
        system("pause");
        playerdeath=1;
    }
}

bool player::useHeal()
{
    if(bag.nOFHeal)
    {
        HP=HP+100;
        if(HP>HPmax) 
        HP=HPmax;        // so assign it to HPmax, if necessary
        cout<<name<<" used Heal, HP increased by 100."<<endl;
        bag.useHeal();        // use heal
        system("pause");
        return 1; 
    }
}
bool player::useMW()
{
    if(bag.nOfMW()>0)
    {
        MP=MP+100;
        if(MP>MPmax)
            MP=MPmax;
        cout<<name<<" used Magic Water, MP increased by 100."<<endl;
        bag.useMW();
        system("pause");
        return 1;    
    }
    else
    {
        cout<<"Sorry, you don't have magic water to use."<<endl;
        system("pause");
        return 0;   
    }
}
void plarer::transfer(player &p)
{
    cout<<name<<"got"<<p.bag.nOFHeal()<<
}
void player::showRole(){
    switch(role)
    {
        case sw:
            cout<<"Swordsman";
            break;
        case ar:
            cout<<"Archer";
            break;
        case mg:
            cout<<"Mage";
        default:
            break;
    }
}
void showinfo(player &p1,player &p2) 
{
     system("cls");
      cout<<"##############################################################"<<endl;
       cout<<"# Player"<<setw(10)<<p1.name<<"   LV. "<<setw(3) <<p1.LV
        <<"  # Opponent"<<setw(10)<<p2.name<<"   LV. "<<setw(3) <<p2.LV<<" #"<<endl;
    cout<<"# HP "<<setw(3)<<(p1.HP<=999?p1.HP:999)<<'/'<<setw(3)<<(p1.HPmax<=999?p1.HPmax:999)
        <<" | MP "<<setw(3)<<(p1.MP<=999?p1.MP:999)<<'/'<<setw(3)<<(p1.MPmax<=999?p1.MPmax:999)
        <<"     # HP "<<setw(3)<<(p2.HP<=999?p2.HP:999)<<'/'<<setw(3)<<(p2.HPmax<=999?p2.HPmax:999)
        <<" | MP "<<setw(3)<<(p2.MP<=999?p2.MP:999)<<'/'<<setw(3)<<(p2.MPmax<=999?p2.MPmax:999)<<"      #"<<endl;
    cout<<"# AP "<<setw(3)<<(p1.AP<=999?p1.AP:999)
        <<" | DP "<<setw(3)<<(p1.DP<=999?p1.DP:999)
        <<" | speed "<<setw(3)<<(p1.speed<=999?p1.speed:999)
        <<" # AP "<<setw(3)<<(p2.AP<=999?p2.AP:999)
        <<" | DP "<<setw(3)<<(p2.DP<=999?p2.DP:999)
        <<" | speed "<<setw(3)<<(p2.speed<=999?p2.speed:999)<<"  #"<<endl;
    cout<<"# EXP"<<setw(7)<<p1.EXP<<" Job: "<<setw(7);
    p1.showRole();
    cout<<"   # EXP"<<setw(7)<<p2.EXP<<" Job: "<<setw(7);
    p2.showRole();
    cout<<"    #"<<endl;
    cout<<"--------------------------------------------------------------"<<endl;
    p1.bag.display();
    cout<<"##############################################################"<<endl;
}
//=======================
//        swordsman.cpp
//=======================
#include"swordsman.h"
#include<iostream>
#include<string>

// constructor. default values don't need to be repeated here
swordsman::swordsman(int lv_in, string name_in)
{
    role=sw;    // enumerate type of job
    LV=lv_in;
    name=name_in;
    
    // Initialising the character's properties, based on his level
    HPmax=150+8*(LV-1);        // HP increases 8 point2 per level
    HP=HPmax;
    MPmax=75+2*(LV-1);        // MP increases 2 points per level
    MP=MPmax;
    AP=25+4*(LV-1);            // AP increases 4 points per level
    DP=25+4*(LV-1);            // DP increases 4 points per level
    speed=25+2*(LV-1);        // speed increases 2 points per level
    
    playerdeath=0;
    EXP=LV*LV*75;
    bag.set(lv_in, lv_in);
}

void swordsman::isLevelUp()
{
    using namespace std;

    if(EXP>=LV*LV*75)
    {
        LV++;
        AP+=4;
        DP+=4;
        HPmax+=8;
        MPmax+=2;
        speed+=2;
        cout<<name<<" Level UP!"<<endl;
        cout<<"HP improved 8 points to "<<HPmax<<endl;
        cout<<"MP improved 2 points to "<<MPmax<<endl;
        cout<<"Speed improved 2 points to "<<speed<<endl;
        cout<<"AP improved 4 points to "<<AP<<endl;
        cout<<"DP improved 5 points to "<<DP<<endl;
        system("pause");
        isLevelUp();    // recursively call this function, so the character can level up multiple times if got enough exp
    }
}

bool swordsman::attack(player &p)
{
    using namespace std;

    double HPtemp=0;        // opponent's HP decrement
    double EXPtemp=0;        // player obtained exp
    double hit=1;            // attach factor, probably give critical attack
    srand((unsigned)time(NULL));        // generating random seed based on system time

    // If speed greater than opponent, you have some possibility to do double attack
    if ((speed>p.speed) && (rand()%100<(speed-p.speed)))        // rand()%100 means generates a number no greater than 100
    {
        HPtemp=(int)((1.0*AP/p.DP)*AP*5/(rand()%4+10));        // opponent's HP decrement calculated based their AP/DP, and uncertain chance
        cout<<name<<"'s quick strike hit "<<p.name<<", "<<p.name<<"'s HP decreased "<<HPtemp<<endl;
        p.HP=int(p.HP-HPtemp);
        EXPtemp=(int)(HPtemp*1.2);
    }

    // If speed smaller than opponent, the opponent has possibility to evade
    if ((speed<p.speed) && (rand()%50<1))
    {
        cout<<name<<"'s attack has been evaded by "<<p.name<<endl;
        system("pause");
        return 1;
    }

    // 10% chance give critical attack
    if (rand()%100<=10)
    {
        hit=1.5;
        cout<<"Critical attack: ";
    }

    // Normal attack
    HPtemp=(int)((1.0*AP/p.DP)*AP*5/(rand()%4+10));
    cout<<name<<" uses bash, "<<p.name<<"'s HP decreases "<<HPtemp<<endl;
    EXPtemp=(int)(EXPtemp+HPtemp*1.2);
    p.HP=(int)(p.HP-HPtemp);
    cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl;
    EXP=(int)(EXP+EXPtemp);
    system("pause");
    return 1;        // Attack success
}

bool swordsman::specialatt(player &p)
{
    using namespace std;

    if(MP<40)
    {
        cout<<"You don't have enough magic points!"<<endl;
        system("pause");
        return 0;        // Attack failed
    }
    else
    {
        MP-=40;            // consume 40 MP to do special attack
        
        //10% chance opponent evades
        if(rand()%100<=10)
        {
            cout<<name<<"'s leap attack has been evaded by "<<p.name<<endl;
            system("pause");
            return 1;
        }
        
        double HPtemp=0;        
        double EXPtemp=0;        
        //double hit=1;            
        //srand(time(NULL));        
        HPtemp=(int)(AP*1.2+20);        // not related to opponent's DP
        EXPtemp=(int)(HPtemp*1.5);        // special attack provides more experience
        cout<<name<<" uses leap attack, "<<p.name<<"'s HP decreases "<<HPtemp<<endl;
        cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl;
        p.HP=(int)(p.HP-HPtemp);
        EXP=(int)(EXP+EXPtemp);
        system("pause");
    }
    return 1;    // special attack succeed
}

// Computer opponent
void swordsman::AI(player &p)
{
    if ((HP<(int)((1.0*p.AP/DP)*p.AP*1.5))&&(HP+100<=1.1*HPmax)&&(bag.nOfHeal()>0)&&(HP>(int)((1.0*p.AP/DP)*p.AP*0.5)))
        // AI's HP cannot sustain 3 rounds && not too lavish && still has heal && won't be killed in next round
    {
        useHeal();
    }
    else
    {
        if(MP>=40 && HP>0.5*HPmax && rand()%100<=30)
            // AI has enough MP, it has 30% to make special attack
        {
            specialatt(p);
            p.isDead();        // check whether player is dead
        }
        else
        {
            if (MP<40 && HP>0.5*HPmax && bag.nOfMW())
                // Not enough MP && HP is safe && still has magic water
            {
                useMW();
            }
            else
            {
                attack(p);    // normal attack
                p.isDead();
            }
        }
    }
}
//=======================
//        main.cpp
//=======================

// main function for the RPG style game

#include <iostream>
#include <string>
using namespace std;

#include "swordsman.h"


int main()
{
    string tempName;
    bool success=0;        //flag for storing whether operation is successful
    cout <<"Please input player's name: ";
    cin >>tempName;        // get player's name from keyboard input
    player *human=NULL;        // use pointer of base class, convenience for polymorphism
    int tempJob;        // temp choice for job selection
    do
    {
        cout <<"Please choose a job: 1 Swordsman, 2 Archer, 3 Mage"<<endl;
        cin>>tempJob;
        system("cls");        // clear the screen
        switch(tempJob)
        {
        case 1:
            human=new swordsman(1,tempName);    // create the character with user inputted name and job
            success=1;        // operation succeed
            break;
        default:
            break;                // In this case, success=0, character creation failed
        }
    }while(success!=1);        // so the loop will ask user to re-create a character

    int tempCom;            // temp command inputted by user
    int nOpp=0;                // the Nth opponent
    for(int i=1;nOpp<5;i+=2)    // i is opponent's level
    {
        nOpp++;
        system("cls");
        cout<<"STAGE" <<nOpp<<endl;
        cout<<"Your opponent, a Level "<<i<<" Swordsman."<<endl;
        system("pause");
        swordsman enemy(i, "Warrior");    // Initialise an opponent, level i, name "Junior"
        human->reFill();                // get HP/MP refill before start fight
        
        while(!human->death() && !enemy.death())    // no died
        {
            success=0;
            while (success!=1)
            {
                showinfo(*human,enemy);                // show fighter's information
                cout<<"Please give command: "<<endl;
                cout<<"1 Attack; 2 Special Attack; 3 Use Heal; 4 Use Magic Water; 0 Exit Game"<<endl;
                cin>>tempCom;
                switch(tempCom)
                {
                case 0:
                    cout<<"Are you sure to exit? Y/N"<<endl;
                    char temp;
                    cin>>temp;
                    if(temp=='Y'||temp=='y')
                        return 0;
                    else
                        break;
                case 1:
                    success=human->attack(enemy);
                    human->isLevelUp();
                    enemy.isDead();
                    break;
                case 2:
                    success=human->specialatt(enemy);
                    human->isLevelUp();
                    enemy.isDead();
                    break;
                case 3:
                    success=human->useHeal();
                    break;
                case 4:
                    success=human->useMW();
                    break;
                default:
                    break;
                }
            }
            if(!enemy.death())        // If AI still alive
                enemy.AI(*human);
            else                            // AI died
            {
                cout<<"YOU WIN"<<endl;
                human->transfer(enemy);        // player got all AI's items
            }
            if (human->death())
            {
                system("cls");
                cout<<endl<<setw(50)<<"GAME OVER"<<endl;
                human->death();        // player is dead, program is getting to its end, what should we do here?
                system("pause");
                return 0;
            }
        }
    }
    human->isLevelUp();        // You win, program is getting to its end, what should we do here?
    system("cls");
    cout<<"Congratulations! You defeated all opponents!!"<<endl;
    system("pause");
    return 0;
}

 

 

标签:string,int,void,多态,player,实验,human,include,模板
来源: https://www.cnblogs.com/617178sjq/p/15691453.html