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 <string>
#include <cstdlib>
#include <cmath>
using namespace std;
#include "swordsman.h"
#include "archer.h"
#include "mage.h"
int main()
{
@ -18,6 +21,11 @@ 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
//<!--
player *enemy; // use pointer of base class, convenience for polymorphism
//-->
int tempJob; // temp choice for job selection
do
{
@ -30,6 +38,16 @@ int main()
human=new swordsman(1,tempName); // create the character with user inputted name and job
success=1; // operation succeed
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:
break; // In this case, success=0, character creation failed
}
@ -42,17 +60,27 @@ int main()
nOpp++;
system("cls");
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");
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
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: "<<endl;
cout<<"1 Attack; 2 Special Attack; 3 Use Heal; 4 Use Magic Water; 0 Exit Game"<<endl;
cin>>tempCom;
@ -67,14 +95,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();
@ -86,12 +114,12 @@ 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"<<endl;
human->transfer(enemy); // player got all AI's items
human->transfer(*enemy); // player got all AI's items
}
if (human->death())
{
@ -102,6 +130,9 @@ int main()
return 0;
}
}
//<!--
delete enemy;
//-->
}
delete human;//7_????????? // You win, program is getting to its end, what should we do here?
system("cls");

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

@ -20,6 +20,8 @@ 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;
@ -34,6 +36,9 @@ public:
virtual bool attack(player &p)=0; // normal attack
virtual bool specialatt(player &p)=0; //special attack
virtual void isLevelUp()=0; // level up judgement
//<!--
virtual void AI(player &p)=0; // AI for robot
//-->
/* Attention!
These three methods are called "Pure virtual functions".
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));
cout<<name<<" uses bash, "<<p.name<<"'s HP decreases "<<HPtemp<<endl;
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;
EXP=(int)(EXP+EXPtemp);
//<!-- luck
EXP=(int)(EXP+EXPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
system("pause");
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<<" obtained "<<EXPtemp<<" experience."<<endl;
p.HP=(int)(p.HP-HPtemp);
EXP=(int)(EXP+EXPtemp);
//<!-- luck
EXP=(int)(EXP+EXPtemp*((double)(rand() % 100 + 50) / (double)100));
//-->
system("pause");
}
return 1; // special attack succeed

Binary file not shown.
Loading…
Cancel
Save