#include <iostream>
#include <string>
using namespace std;
namespace config {
const int MAX_SIZE = 19;
int lvlhp[MAX_SIZE] = {25, 52, 84, 107, 155, 205, 259, 304, 349, 403, 460, 510, 670, 790, 800, 940, 1080, 1200};
int lvlexp[MAX_SIZE] = {40, 65, 90, 125, 140, 200, 280, 340, 400, 460, 590, 700, 850, 999, 1100, 1250, 1490, 1700};
int lvlatk[MAX_SIZE] = {3, 5, 7, 9, 11, 14, 17, 20, 24, 28, 32, 36, 40, 45, 50, 55, 60, 65};
int lvldef[MAX_SIZE] = {1, 3, 5, 7, 9, 12, 14, 18, 22, 26, 28, 33, 37, 42, 47, 51, 57, 63};
}
class dragon {
private:
string name;
int atk, def, acc;
int type, lvl, hp, hpmax, exp, expmax;
int out;
public:
dragon(string str = "wild dragon", int level = 5);
string getname(){return name;};
int gethp(){ return hp;};
int gethpmax(){ return hpmax;};
int getexpmax(){ return expmax;};
int getatk(){return atk;};
int getdef(){return def;};
int getexp(){return exp;};
int getacc(){return acc;};
int getout(){return out;};
int getlvl(){return lvl;};
void changehp(int s);
void setname(string str) { name = str; };
void sethpmax(){hpmax = config::lvlhp[lvl - 1];};
void setexpmax(){expmax = config::lvlexp[lvl - 1];};
void setatk();
void setdef();
void setout(int s){ out = s;};
void setacc(){acc += 5;};
void setlvl(int level){ lvl = level; };
void attack(dragon*, dragon*);
};
dragon::dragon(string str,int level) {
name = str;
int tp = ((rand() % 6) + 1);
type = tp;
lvl = level;
atk = config::lvlatk[level-1];
def = config::lvldef[level-1];
setatk();
setdef();
setexpmax();
sethpmax();
hp = hpmax;
setacc();
setout(false);/* set to conscious */
}
void dragon::changehp(int s)
{
if((hp + s) != hpmax)
{
hp += s;
}else if(hp < 0)
{
hp = 0;
setout(true);
}
}
void dragon::attack(dragon *d1, dragon *d2)
{
if(d1->getdef() < d2->getatk())
{
d1->changehp(- ( d2->getatk() - d1->getdef() ) );
}else if(d2->getdef() < d1->getatk())
{
d2->changehp(- (d1->getatk() - d2->getdef() ) );
}
if(d1->gethp() == 0)
d1->setout(true); /* set to unconscious */
}
void dragon::setatk()
{
int dif;
dif = config::lvlatk[lvl - 1] - config::lvlatk[lvl - 2];
if(atk > config::lvlatk[lvl - 2]){
atk = config::lvlatk[lvl - 1];
}
else{
atk += dif;
}
}
void dragon::setdef()
{
int dif;
dif = config::lvldef[lvl - 1] - config::lvldef[lvl - 2];
if(def > config::lvldef[lvl - 2]){
def = config::lvldef[lvl - 1];
}
else{
def += dif;
}
}
int main()
{
dragon d1, d2;
dragon *pt = &d1;
dragon *pd = &d2;
pt->attack(pt, pd);
cout << "onehp: " << pt->gethp()<< " twohp = " << pd->gethp()<< endl;
pt->attack(pt, pd);
cout << "onehp: " << pt->gethp()<< " twohp = " << pd->gethp()<< endl;
pt->attack(pt, pd);
cout << "onehp: " << pt->gethp()<< " twohp = " << pd->gethp()<< endl;
cin.get();
return 0;
}