#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

Class Devil{                //個人的にメガテンが好きなので悪魔クラス
   private:
      int HP;             //RPGキャラって大抵HPとか攻撃力は持ってるよね〜
      int attack;
      int defense;
      int toal;            //これは完全に内部処理用の変数
   public;
      Devil();            //コンストラクタ
      char name[41];
      void SetName();      //Set〜は能力値設定用関数
      void SetHP();
      void SetAttack();
      void setDefense();
      void ShowStates();    //設定した能力を表示する関数
      int Attack();        //戦闘中は攻撃もするし・・・
      int Damage(int x);    //攻撃されるのがゲームキャラ
};

Devil::Devil(){             //コンストラクタなのでデータメンバを設定するようにしました。
   total = 200;
   HP = 0;
   attack = 0;
   defense = 0;
   SetName();
   SetHP();             //set関数の処理順を変えるとひどいことになりますよ、多分
   SetAttack();
   SetDefense();
}

void Devil::SetName(){       //名づけ関数
   cout << "名前を入力してください。\n";
   cin >> name;
}

void Devil::SetHP(){        //HP設定関数
   int chkHP;
   for(int i = 0; i < 2; i++){
      cout << "HPを150以内に設定してください。\n";
      cin >> chkHP;
      if(chkHP <= 150 && chkHP >0){
         HP = chkHP;
         total -= HP;
         i = 2;
      }else{
         cout << "正しい値を設定してください。\n";
         i = 0;
      }
   }
}

void Devil::SetAttack(){     //攻撃力設定関数
   int chkAttack;
   for(int i = 0; i < 2; i++){
      cout << "攻撃力を" << total - 1 << "以内に設定してください。\n";
      cin >> chkAttack;
      if(chkAttack <= total - 1 && chkAttack >0){
         attack = chkAttack;
         total -= attack;
         i = 2;
      }else{
         cout << "正しい値を設定してください。\n";
         i = 0;
      }
   }
}

void Devil::SetDeffense(){     //守備力設定関数は残り物なので処理の順番をミスると・・・
   defense = total;
}

void Devil::ShowStates(){     //設定能力値表示関数
   cout << name << "\n";
   cout << "HP :" << HP << "\n";
   cout << "攻撃力:" << attack << "\n";
   cout << "守備力:" << defense << "\n";
}

int Devil::Attack(){         //攻撃関数、実は乱数におとし穴が・・・!
   int damage;
   int randam;
   randam = rand() % 8;
   switch(randam){
      case 1:
         damage = 0;
         break;
      case 2:
         damage = (int)(attack * 0.8);
         break;
      case 3:
         damage = (int)(attack * 0.9);
         break;
      case 4:
         damage = attack;
         break;
      case 5:
         damage = (int)(attack * 1.1);
         break;
      case 6:
         damage = (int)(attack * 1.2);
         break;
      case 7:
         damage = attack * 2;
         break;
   }
   cout << name << "の攻撃!\n";
   return damage;
}

int Devil::Damage(int x){          //被攻撃関数
   int damage;
   damage = x - defense;
   if(damage < 0){
      damage = 0;
   }
   HP -= damage;
   cout << name << "に" << damage << "のダメージ!\n";
   if(HP <= 0){
      cout << name << "は倒れた。\n";
      return 1;
   }else{
      return 0;
   }
}

void main(){
   Devil A;            //オブジェクトの作成
   Devil B;            //この2行で2体の悪魔が作成されます。
   A.ShowStates();
   B.ShowStates();
   int i = 0;
   while(i == 0){         //このへんが2体の悪魔の殴り合い
      i = B.Damage(A.Attack());
      if(i != 1){
         i = A.Damage(B.Attack());
      }
   }
}