ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

实验五 模板与多态

2021-12-15 10:34:12  阅读:158  来源: 互联网

标签:string int void 多态 player 实验 human include 模板


 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有