diff --git a/as2/ex2/archer.cpp b/as2/ex2/archer.cpp deleted file mode 100644 index c1b860a..0000000 --- a/as2/ex2/archer.cpp +++ /dev/null @@ -1,174 +0,0 @@ -//======================= -// archer.cpp -//======================= -#include "archer.h" -#include // use for setting field width -#include // use for generating random factor -#include -using namespace std; -// constructor. default values don't need to be repeated here -archer::archer(int lv_in, string name_in) -{ - role=ar; // 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*(rand()%2), lv_in*(rand()%2)); -} - -void archer::isLevelUp() -{ - if(EXP>=LV*LV*75) - { - LV++; - AP+=4; - DP+=4; - HPmax+=8; - MPmax+=2; - speed+=2; - bag.set(bag.nOfHeal()+LV, bag.nOfMW()+LV); - cout<p.speed) && (rand()%100<(speed-p.speed))) // rand()%100 means generates a number no greater than 100 - { - HPtemp=(int)((attack)*AP*5/(rand()%4+10)); // opponent's HP decrement calculated based their AP/DP, and uncertain chance - cout< - cout< - - } - - - cout< - system("pause"); - return 1; // Attack success -} - -bool archer::specialatt(player &p) -{ - if(MP<40) - { - cout<<"You don't have enough magic points!"< - EXPtemp=(int)(HPtemp*1.5); // special attack provides more experience - cout<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(); - } - } - } -} - diff --git a/as2/ex2/archer.h b/as2/ex2/archer.h deleted file mode 100644 index 3eac379..0000000 --- a/as2/ex2/archer.h +++ /dev/null @@ -1,21 +0,0 @@ -//======================= -// archer.h -//======================= - -// Derived from base class player -// For the job archer -#include -#include "player.h" -class archer : public player // subclass archer publicly inherited from base player -{ -public: - archer(int lv_in=1, std::string name_in="Not Given"); - // constructor with default level of 1 and name of "Not given" - void isLevelUp(); - bool attack (player &p); - bool specialatt(player &p); - /* These three are derived from the pure virtual functions of base class - The definition of them will be given in this subclass. */ - void AI(player &p); // Computer opponent - -}; diff --git a/as2/ex2/archer.h.gch b/as2/ex2/archer.h.gch deleted file mode 100644 index 09907be..0000000 Binary files a/as2/ex2/archer.h.gch and /dev/null differ diff --git a/as2/ex2/container.cpp b/as2/ex2/container.cpp index 4f1719c..620712e 100644 --- a/as2/ex2/container.cpp +++ b/as2/ex2/container.cpp @@ -1,9 +1,7 @@ //======================= // container.cpp //======================= -#include "container.h" -using namespace std; // default constructor initialise the inventory as empty container::container() { @@ -40,7 +38,7 @@ void container::display() //use heal bool container::useHeal() { - numOfHeal--; + 2_???????? return 1; // use heal successfully } diff --git a/as2/ex2/container.h b/as2/ex2/container.h index 33e27be..a98dc00 100644 --- a/as2/ex2/container.h +++ b/as2/ex2/container.h @@ -5,11 +5,9 @@ // The so-called inventory of a player in RPG games // contains two items, heal and magic water -#ifndef _CONTAINER // Conditional compilation +1_????????????? // Conditional compilation #define _CONTAINER -#include - class container // Inventory { protected: diff --git a/as2/ex2/container.h.gch b/as2/ex2/container.h.gch deleted file mode 100644 index eea46dd..0000000 Binary files a/as2/ex2/container.h.gch and /dev/null differ diff --git a/as2/ex2/mage.cpp b/as2/ex2/mage.cpp deleted file mode 100644 index 637b30e..0000000 --- a/as2/ex2/mage.cpp +++ /dev/null @@ -1,174 +0,0 @@ -//======================= -// mage.cpp -//======================= -#include "mage.h" -#include // use for setting field width -#include // use for generating random factor -#include -using namespace std; -// constructor. default values don't need to be repeated here -mage::mage(int lv_in, string name_in) -{ - role=mg; // 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*(rand()%2), lv_in*(rand()%2)); -} - -void mage::isLevelUp() -{ - if(EXP>=LV*LV*75) - { - LV++; - AP+=4; - DP+=4; - HPmax+=8; - MPmax+=2; - speed+=2; - bag.set(bag.nOfHeal()+LV, bag.nOfMW()+LV); - cout<p.speed) && (rand()%100<(speed-p.speed))) // rand()%100 means generates a number no greater than 100 - { - HPtemp=(int)((attack)*AP*5/(rand()%4+10)); // opponent's HP decrement calculated based their AP/DP, and uncertain chance - cout< - cout< - - } - - - cout< - system("pause"); - return 1; // Attack success -} - -bool mage::specialatt(player &p) -{ - if(MP<40) - { - cout<<"You don't have enough magic points!"< - EXPtemp=(int)(HPtemp*1.5); // special attack provides more experience - cout<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(); - } - } - } -} - diff --git a/as2/ex2/mage.h b/as2/ex2/mage.h deleted file mode 100644 index 92572db..0000000 --- a/as2/ex2/mage.h +++ /dev/null @@ -1,20 +0,0 @@ -//======================= -// mage.h -//======================= - -// Derived from base class player -// For the job mage -#include -#include "player.h" -class mage : public player // subclass mage publicly inherited from base player -{ -public: - mage(int lv_in=1, std::string name_in="Not Given"); - // constructor with default level of 1 and name of "Not given" - void isLevelUp(); - bool attack (player &p); - bool specialatt(player &p); - /* These three are derived from the pure virtual functions of base class - The definition of them will be given in this subclass. */ - void AI(player &p); // Computer opponent -}; diff --git a/as2/ex2/mage.h.gch b/as2/ex2/mage.h.gch deleted file mode 100644 index d4ef493..0000000 Binary files a/as2/ex2/mage.h.gch and /dev/null differ diff --git a/as2/ex2/main.cpp b/as2/ex2/main.cpp index da70dfa..0a60ef9 100644 --- a/as2/ex2/main.cpp +++ b/as2/ex2/main.cpp @@ -6,13 +6,10 @@ #include #include -#include -#include using namespace std; #include "swordsman.h" -#include "archer.h" -#include "mage.h" + int main() { @@ -21,11 +18,6 @@ int main() 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 { @@ -38,16 +30,6 @@ int main() 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 } @@ -60,27 +42,17 @@ int main() nOpp++; system("cls"); cout<<"STAGE" < + cout<<"Your opponent, a Level "< - + 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 + while(!human->death() && !enemy.death()) // no died { success=0; while (success!=1) { - showinfo(*human,*enemy); // show fighter's information + showinfo(*human,enemy); // show fighter's information cout<<"Please give command: "<>tempCom; @@ -95,14 +67,14 @@ int main() else break; case 1: - success=human->attack(*enemy); + success=human->attack(enemy); human->isLevelUp(); - enemy->isDead(); + enemy.isDead(); break; case 2: - success=human->specialatt(*enemy); + success=human->specialatt(enemy); human->isLevelUp(); - enemy->isDead(); + enemy.isDead(); break; case 3: success=human->useHeal(); @@ -114,27 +86,24 @@ int main() break; } } - if(!enemy->death()) // If AI still alive - enemy->AI(*human); + if(!enemy.death()) // If AI still alive + enemy.AI(*human); else // AI died { cout<<"YOU WIN"<transfer(*enemy); // player got all AI's items + human->transfer(enemy); // player got all AI's items } if (human->death()) { system("cls"); cout< } - delete human;//7_????????? // You win, program is getting to its end, what should we do here? + 7_????????? // You win, program is getting to its end, what should we do here? system("cls"); cout<<"Congratulations! You defeated all opponents!!"<bag.set(this->bag.nOfHeal() + p.bag.nOfHeal(), this->bag.nOfMW() + p.bag.nOfMW()); + 3_??????????? // set the character's bag, get opponent's items } @@ -90,10 +87,10 @@ void player::showRole() cout<<"Swordsman"; break; case ar: - cout<<" Archer "; + cout<<"Archer"; break; case mg: - cout<<" Mage "; + cout<<"Mage"; break; default: break; @@ -102,7 +99,7 @@ void player::showRole() // display character's job -void showinfo(player &p1, player &p2) +4_?????????????? { system("cls"); cout<<"##############################################################"< #include // use for setting field width #include // use for generating random factor -#include #include "container.h" enum job {sw, ar, mg}; /* define 3 jobs by enumerate type @@ -20,14 +18,11 @@ class player { friend void showinfo(player &p1, player &p2); friend class swordsman; - friend class archer; - friend class mage; protected: int HP, HPmax, MP, MPmax, AP, DP, speed, EXP, LV; // General properties of all characters -protected: - std::string name; // character name + string name; // character name job role; /* character's job, one of swordman, archer and mage, as defined by the enumerate type */ container bag; // character's inventory @@ -36,9 +31,6 @@ public: virtual bool attack(player &p)=0; // normal attack virtual bool specialatt(player &p)=0; //special attack virtual void isLevelUp()=0; // level up judgement -// /* Attention! These three methods are called "Pure virtual functions". They have only declaration, but no definition. @@ -50,8 +42,8 @@ public: void isDead(); // check whether character is dead bool useHeal(); // consume heal, irrelevant to job bool useMW(); // consume magic water, irrelevant to job - void showRole(); // display character's job void transfer(player &p); // possess opponent's items after victory + void showRole(); // display character's job private: bool playerdeath; // whether character is dead, doesn't need to be accessed or inherited diff --git a/as2/ex2/player.h.gch b/as2/ex2/player.h.gch deleted file mode 100644 index 5cb5eaf..0000000 Binary files a/as2/ex2/player.h.gch and /dev/null differ diff --git a/as2/ex2/swordsman.cpp b/as2/ex2/swordsman.cpp index d75536b..67a1fba 100644 --- a/as2/ex2/swordsman.cpp +++ b/as2/ex2/swordsman.cpp @@ -1,11 +1,7 @@ //======================= // swordsman.cpp //======================= -#include "swordsman.h" -#include // use for setting field width -#include // use for generating random factor -#include -using namespace std; + // constructor. default values don't need to be repeated here swordsman::swordsman(int lv_in, string name_in) { @@ -29,115 +25,100 @@ swordsman::swordsman(int lv_in, string name_in) void swordsman::isLevelUp() { - if(EXP>=LV*LV*75) - { - LV++; - AP+=4; - DP+=4; - HPmax+=8; - MPmax+=2; - speed+=2; - bag.set(bag.nOfHeal()+LV, bag.nOfMW()+LV); - cout<=LV*LV*75) + { + LV++; + AP+=4; + DP+=4; + HPmax+=8; + MPmax+=2; + speed+=2; + cout<p.speed) && (rand()%100<(speed-p.speed))) // rand()%100 means generates a number no greater than 100 - { - HPtemp=(int)((attack)*AP*5/(rand()%4+10)); // opponent's HP decrement calculated based their AP/DP, and uncertain chance - cout< - cout< + // 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< - system("pause"); - return 1; // Attack success + // Normal attack + HPtemp=(int)((1.0*AP/p.DP)*AP*5/(rand()%4+10)); + cout< - EXPtemp=(int)(HPtemp*1.5); // special attack provides more experience - cout< + #include "player.h" -class swordsman : public player // subclass swordsman publicly inherited from base player +class swordsman : 5_????????? // subclass swordsman publicly inherited from base player { public: - swordsman(int lv_in=1, std::string name_in="Not Given"); + swordsman(int lv_in=1, string name_in="Not Given"); // constructor with default level of 1 and name of "Not given" void isLevelUp(); bool attack (player &p); diff --git a/as2/ex2/swordsman.h.gch b/as2/ex2/swordsman.h.gch deleted file mode 100644 index f15f698..0000000 Binary files a/as2/ex2/swordsman.h.gch and /dev/null differ