task4
pets.hpp
#include<iostream> using namespace std; class MachinePets{ private: string nickname; public: const string get_nickname(){return nickname;} MachinePets(const string s):nickname(s){} virtual string talk() = 0; }; class PetCats:public MachinePets{ public: PetCats(const string s): MachinePets(s){} string talk() { string s = "miao wu~"; return s; } }; class PetDogs:public MachinePets{ public: PetDogs(const string s) :MachinePets(s) {} string talk(){ string s = "wang wang~"; return s; } };
.cpp
#include <iostream> #include "pets.hpp" void play(MachinePets &obj) { std::cout << obj.get_nickname() << " says " << obj.talk() << std::endl; } void test() { PetCats cat("miku"); PetDogs dog("da huang"); play( cat ); play( dog ); } int main() { test(); }
运行结果:
task 5
.hpp:
#pragma once #include<iostream> #include<string> #include<iomanip> using namespace std; class Person { private: string name; string telephone; string email; public: Person(string name="", string telephone = "", string email = "") { this->email = email; this->name = name; this->telephone = telephone; } Person(const Person& obj) { email = obj.email; name = obj.name; telephone = obj.telephone; } void update_telephone() { cin.clear(); string t1; cout << "Enter the telephone number:"; cin >> t1; this->telephone = t1; cout << "telephone number has been updated..."<<endl; } void update_email() { cin.clear(); string e1; cout << "Enter the email address:"; cin >> e1; this->email = e1; cout << "email address has been updated..." << endl; } friend ostream& operator<<(ostream& cout, Person& p1); friend istream& operator>>(istream& cin, Person& p1); friend bool operator==(Person& p1, Person& p2) { if (p1.name ==p2.name && p1.email == p2.email) return true; else return false; } }; ostream& operator<<(ostream& cout, Person& p1) { cout <<left<< setw(10)<<p1.name << left << setw(10) << p1.telephone << left << setw(10) << p1.email<<endl; return cout; } istream& operator>>(istream& cin, Person& p1) { cin >> p1.name>>p1.telephone>>p1.email; return cin; }
.cpp
#include <iostream> #include <fstream> #include <vector> #include "Person.hpp" void test() { using namespace std; vector<Person> phone_book; Person p; cout << "Enter person's contact until press Ctrl + Z" << endl; while (cin >> p) phone_book.push_back(p); cout << "\nupdate someone's contact: \n"; phone_book.at(0).update_telephone(); phone_book.at(0).update_email(); cout << "\ndisplay all contacts' info\n"; for (auto& phone : phone_book) cout << phone << endl; cout << "\ntest whether the same contact\n"; cout << boolalpha << (phone_book.at(0) == phone_book.at(1)) << endl; } int main() { test(); }
测试结果:
task 6:
sm.cpp
//======================= // swordsman.cpp //======================= #include<iostream> #include"swordsman.h" using namespace std; // 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() { 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) { 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) { 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(); } } } }
play.cpp
//======================= // player.cpp //======================= #include<iostream> #include<iomanip> #include"player.h" using namespace std; // character's HP and MP resume void player::reFill() { HP = HPmax; // HP and MP fully recovered MP = MPmax; } // report whether character is dead bool player::death() { return playerdeath; } // check whether character is dead void player::isDead() { if (HP <= 0) // HP less than 0, character is dead { cout << name << " is Dead." << endl; system("pause"); playerdeath = 1; // give the label of death value 1 } } // consume heal, irrelevant to job bool player::useHeal() { if (bag.nOfHeal() > 0) { HP = HP + 100; if (HP > HPmax) // HP cannot be larger than maximum value 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; // usage of heal succeed } else // If no more heal in bag, cannot use { cout << "Sorry, you don't have heal to use." << endl; system("pause"); return 0; // usage of heal failed } } // consume magic water, irrelevant to job 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; // usage of magic water succeed } else { cout << "Sorry, you don't have magic water to use." << endl; system("pause"); return 0; // usage of magic water failed } } // possess opponent's items after victory void player::transfer(player& p) { cout << name << " got" << p.bag.nOfHeal() << " Heal, and " << p.bag.nOfMW() << " Magic Water." << endl; system("pause"); HP += p.bag.nOfHeal(); MP += p.bag.nOfMW(); // set the character's bag, get opponent's items } // display character's job void player::showRole() { switch (role) { case sw: cout << "Swordsman"; break; case ar: cout << "Archer"; break; case mg: cout << "Mage"; break; default: break; } } // display character's job 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; }
container.h;
#pragma once //======================= // container.h //======================= // The so-called inventory of a player in RPG games // contains two items, heal and magic water #ifndef _CONTAINER // Conditional compilation #define _CONTAINER class container // Inventory { protected: int numOfHeal; // number of heal int numOfMW; // number of magic water public: container(); // constuctor void set(int heal_n, int mw_n); // set the items numbers int nOfHeal(); // get the number of heal int nOfMW(); // get the number of magic water void display(); // display the items; bool useHeal(); // use heal bool useMW(); // use magic water }; #endif
container.cpp
//======================= // container.cpp //======================= #include"container.h" #include<iostream> using namespace std; // default constructor initialise the inventory as empty container::container() { set(0, 0); } // set the item numbers void container::set(int heal_n, int mw_n) { numOfHeal = heal_n; numOfMW = mw_n; } // get the number of heal int container::nOfHeal() { return numOfHeal; } // get the number of magic water int container::nOfMW() { return numOfMW; } // display the items; void container::display() { cout << "Your bag contains: " << endl; cout << "Heal(HP+100): " << numOfHeal << endl; cout << "Magic Water (MP+80): " << numOfMW << endl; } //use heal bool container::useHeal() { numOfHeal--; return 1; // use heal successfully } //use magic water bool container::useMW() { numOfMW--; return 1; // use magic water successfully }
main.cpp:
//======================= // main.cpp //============//======================= // main.cpp //======================= // main function for the RPG style game #include <iostream> #include <string> #include "swordsman.h" using namespace std; int main() { string tempName="0"; 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;// use pointer of base class, convenience for polymorphism human = new swordsman(1, tempName); 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: delete human; 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; delete human; // player is dead, program is getting to its end, what should we do here? system("pause"); return 0; } } } delete human; // 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; }=========== // 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; // 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; 6_??????????? // player is dead, program is getting to its end, what should we do here? system("pause"); return 0; } } } 7_????????? // 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; }
标签:cout,success,int,实验,human,include,string From: https://www.cnblogs.com/aomijia/p/16929140.html