finishAwesome IoT Framework Basing on Arduino

master
IoTcat 5 years ago
parent a67d20706d
commit b5e193cfa4
  1. 165
      as2/ex2/archer.cpp
  2. 21
      as2/ex2/archer.h
  3. BIN
      as2/ex2/archer.h.gch
  4. BIN
      as2/ex2/container.h.gch
  5. 165
      as2/ex2/mage.cpp
  6. 20
      as2/ex2/mage.h
  7. BIN
      as2/ex2/mage.h.gch
  8. 55
      as2/ex2/main.cpp
  9. 4
      as2/ex2/player.cpp
  10. 5
      as2/ex2/player.h
  11. BIN
      as2/ex2/player.h.gch
  12. 12
      as2/ex2/swordsman.cpp
  13. BIN
      as2/ex2/swordsman.h.gch

@ -0,0 +1,165 @@
//=======================
// archer.cpp
//=======================
#include "archer.h"
#include <iomanip> // use for setting field width
#include <ctime> // use for generating random factor
#include <stdlib.h>
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, lv_in);
}
void archer::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 archer::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);
//<!-- luck
p.HP=(int)(p.HP-HPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl;
//<!-- luck
EXP=(int)(EXP+EXPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
system("pause");
return 1; // Attack success
}
bool archer::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));
//<!-- // Luck
HPtemp=(int)(AP*1.2*((double)(rand() % 100 + 50) / (double)100)+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 archer::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();
}
}
}
}

@ -0,0 +1,21 @@
//=======================
// archer.h
//=======================
// Derived from base class player
// For the job archer
#include <iostream>
#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
};

Binary file not shown.

Binary file not shown.

@ -0,0 +1,165 @@
//=======================
// mage.cpp
//=======================
#include "mage.h"
#include <iomanip> // use for setting field width
#include <ctime> // use for generating random factor
#include <stdlib.h>
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, lv_in);
}
void mage::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 mage::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);
//<!-- luck
p.HP=(int)(p.HP-HPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl;
//<!-- luck
EXP=(int)(EXP+EXPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
system("pause");
return 1; // Attack success
}
bool mage::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));
//<!-- // Luck
HPtemp=(int)(AP*1.2*((double)(rand() % 100 + 50) / (double)100)+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 mage::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();
}
}
}
}

@ -0,0 +1,20 @@
//=======================
// mage.h
//=======================
// Derived from base class player
// For the job mage
#include <iostream>
#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
};

Binary file not shown.

@ -6,10 +6,13 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <cstdlib>
#include <cmath>
using namespace std; using namespace std;
#include "swordsman.h" #include "swordsman.h"
#include "archer.h"
#include "mage.h"
int main() int main()
{ {
@ -18,6 +21,11 @@ int main()
cout <<"Please input player's name: "; cout <<"Please input player's name: ";
cin >>tempName; // get player's name from keyboard input cin >>tempName; // get player's name from keyboard input
player *human; // use pointer of base class, convenience for polymorphism player *human; // use pointer of base class, convenience for polymorphism
//<!--
player *enemy; // use pointer of base class, convenience for polymorphism
//-->
int tempJob; // temp choice for job selection int tempJob; // temp choice for job selection
do do
{ {
@ -30,6 +38,16 @@ int main()
human=new swordsman(1,tempName); // create the character with user inputted name and job human=new swordsman(1,tempName); // create the character with user inputted name and job
success=1; // operation succeed success=1; // operation succeed
break; break;
//<!--
case 2:
human=new archer(1,tempName); // create the character with user inputted name and job
success=1; // operation succeed
break;
case 3:
human=new mage(1,tempName); // create the character with user inputted name and job
success=1; // operation succeed
break;
//-->
default: default:
break; // In this case, success=0, character creation failed break; // In this case, success=0, character creation failed
} }
@ -42,17 +60,27 @@ int main()
nOpp++; nOpp++;
system("cls"); system("cls");
cout<<"STAGE" <<nOpp<<endl; cout<<"STAGE" <<nOpp<<endl;
cout<<"Your opponent, a Level "<<i<<" Swordsman."<<endl; //<!--
srand((unsigned int)time(NULL));
short t_s = rand() % 3;
cout<<"Your opponent, a Level "<<i<<((t_s == 0)?" Swordsman.":"")<<((t_s == 1)?" Archer.":"")<<((t_s == 2)?" Mage.":"")<<endl;
//-->
system("pause"); system("pause");
swordsman enemy(i, "Warrior"); // Initialise an opponent, level i, name "Junior" //<!--
if(t_s == 0) enemy = new swordsman(i, "Warrior");
if(t_s == 1) enemy = new archer(i, "Warrior");
if(t_s == 2) enemy = new mage(i, "Warrior");
//-->
human->reFill(); // get HP/MP refill before start fight 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; success=0;
while (success!=1) while (success!=1)
{ {
showinfo(*human,enemy); // show fighter's information showinfo(*human,*enemy); // show fighter's information
cout<<"Please give command: "<<endl; cout<<"Please give command: "<<endl;
cout<<"1 Attack; 2 Special Attack; 3 Use Heal; 4 Use Magic Water; 0 Exit Game"<<endl; cout<<"1 Attack; 2 Special Attack; 3 Use Heal; 4 Use Magic Water; 0 Exit Game"<<endl;
cin>>tempCom; cin>>tempCom;
@ -67,14 +95,14 @@ int main()
else else
break; break;
case 1: case 1:
success=human->attack(enemy); success=human->attack(*enemy);
human->isLevelUp(); human->isLevelUp();
enemy.isDead(); enemy->isDead();
break; break;
case 2: case 2:
success=human->specialatt(enemy); success=human->specialatt(*enemy);
human->isLevelUp(); human->isLevelUp();
enemy.isDead(); enemy->isDead();
break; break;
case 3: case 3:
success=human->useHeal(); success=human->useHeal();
@ -86,12 +114,12 @@ int main()
break; break;
} }
} }
if(!enemy.death()) // If AI still alive if(!enemy->death()) // If AI still alive
enemy.AI(*human); enemy->AI(*human);
else // AI died else // AI died
{ {
cout<<"YOU WIN"<<endl; cout<<"YOU WIN"<<endl;
human->transfer(enemy); // player got all AI's items human->transfer(*enemy); // player got all AI's items
} }
if (human->death()) if (human->death())
{ {
@ -102,6 +130,9 @@ int main()
return 0; return 0;
} }
} }
//<!--
delete enemy;
//-->
} }
delete human;//7_????????? // You win, program is getting to its end, what should we do here? delete human;//7_????????? // You win, program is getting to its end, what should we do here?
system("cls"); system("cls");

@ -90,10 +90,10 @@ void player::showRole()
cout<<"Swordsman"; cout<<"Swordsman";
break; break;
case ar: case ar:
cout<<"Archer"; cout<<" Archer ";
break; break;
case mg: case mg:
cout<<"Mage"; cout<<" Mage ";
break; break;
default: default:
break; break;

@ -20,6 +20,8 @@ class player
{ {
friend void showinfo(player &p1, player &p2); friend void showinfo(player &p1, player &p2);
friend class swordsman; friend class swordsman;
friend class archer;
friend class mage;
protected: protected:
int HP, HPmax, MP, MPmax, AP, DP, speed, EXP, LV; int HP, HPmax, MP, MPmax, AP, DP, speed, EXP, LV;
@ -34,6 +36,9 @@ public:
virtual bool attack(player &p)=0; // normal attack virtual bool attack(player &p)=0; // normal attack
virtual bool specialatt(player &p)=0; //special attack virtual bool specialatt(player &p)=0; //special attack
virtual void isLevelUp()=0; // level up judgement virtual void isLevelUp()=0; // level up judgement
//<!--
virtual void AI(player &p)=0; // AI for robot
//-->
/* Attention! /* Attention!
These three methods are called "Pure virtual functions". These three methods are called "Pure virtual functions".
They have only declaration, but no definition. They have only declaration, but no definition.

Binary file not shown.

@ -83,9 +83,13 @@ bool swordsman::attack(player &p)
HPtemp=(int)((1.0*AP/p.DP)*AP*5/(rand()%4+10)); HPtemp=(int)((1.0*AP/p.DP)*AP*5/(rand()%4+10));
cout<<name<<" uses bash, "<<p.name<<"'s HP decreases "<<HPtemp<<endl; cout<<name<<" uses bash, "<<p.name<<"'s HP decreases "<<HPtemp<<endl;
EXPtemp=(int)(EXPtemp+HPtemp*1.2); EXPtemp=(int)(EXPtemp+HPtemp*1.2);
p.HP=(int)(p.HP-HPtemp); //<!-- luck
p.HP=(int)(p.HP-HPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl; cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl;
EXP=(int)(EXP+EXPtemp); //<!-- luck
EXP=(int)(EXP+EXPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
system("pause"); system("pause");
return 1; // Attack success return 1; // Attack success
} }
@ -119,7 +123,9 @@ bool swordsman::specialatt(player &p)
cout<<name<<" uses leap attack, "<<p.name<<"'s HP decreases "<<HPtemp<<endl; cout<<name<<" uses leap attack, "<<p.name<<"'s HP decreases "<<HPtemp<<endl;
cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl; cout<<name<<" obtained "<<EXPtemp<<" experience."<<endl;
p.HP=(int)(p.HP-HPtemp); p.HP=(int)(p.HP-HPtemp);
EXP=(int)(EXP+EXPtemp); //<!-- luck
EXP=(int)(EXP+EXPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
system("pause"); system("pause");
} }
return 1; // special attack succeed return 1; // special attack succeed

Binary file not shown.
Loading…
Cancel
Save