#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using std::rand;using std::cin;using std::cout;using std::endl;using std::string;int r_gen(int);
class Player {int hp,lv,exp;public:Player(){hp=20;lv=1;exp=0;}int level(){ return lv;}bool isalive(){
return hp>0;}void addHp(int d){hp+=d; if(hp>lv*20)hp=lv*20;}bool lowHp(){return hp<lv*20;}void levelUp();
void gain(int d);void damaged(int d);void displayCondition();};class Time { int hour; int day; public:
Time(){hour=0;day=1;}int getDay(){return day;}void spends(int h);};class State {public: virtual State*
process(const string command, Player& p, Time& t)=0;virtual string message()=0;}; class Field : public State {
public: Field(){} State* process(const string command, Player& player, Time& t);string message(){
return "Now, you are in the field.";}};class Fighting : public State { int monster,lv,hp;public:
Fighting(int level){lv=r_gen(4)+level;hp=lv*3+r_gen(3);} string message(){return "Now, you are fighting!!!";}
string getName(){ const std::string name[]={"Slime","Draky","Ghost","Skelton","Scorpion", "Knight","Golem",
"Dragon"};return name[lv-1];}int level(){return lv;}int getHp(){return hp;}void displayCondition();
void damage(int d); bool defeated(){return hp<=0;} bool playersTurn(Player& player);
void enemiesTurn(Player& player);State* process(const string command, Player& player,Time& t);};
int r_gen(int range){return (int) ((double)range*rand()/(RAND_MAX+1.0));}void Player::gain(int d){
cout << "You have gotten " << d << ((d>1)?" points ":" point " ) << "of experience!!" << endl; exp+=d;
if(lv<=exp/20) levelUp();}void Player::levelUp(){cout << "LEVEL UP!!" << endl; lv++; if(lv<6)
cout << "You're now a Level " << level() << " Sword Master wannabe !! (max HP=" << level()*20 << ")" << endl;}