实验五 模板与多态
作者:互联网
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