2014年12月2日火曜日

クラスとはなんぞやをRPGで例えてみた

クラスとは何なのか?
なぜ必要なのか?
そう思う人も多いでしょう。

そこで具体例として、RPGでモンスターとの戦闘を作る場合について考えてみましょう。

まず、モンスターにどのようなステータスが必要か決めなければならない。
例えば、「名前、HP、攻撃力、防御力、素早さ」が要るとする。

それをプログラムで書くとこんな感じ。

String  name = "スライム"; //名前
   int  hp = 5;            //HP
   int  attack = 12;       //攻撃
   int  defense = 8;       //防御
   int  agility = 10;      //素早さ

モンスターが複数現れた場合はこれをたくさん書かなければならない。

String  name2 = "ドラゴン"; //名前
   int  hp2 = 150;          //HP
   int  attack2 = 220;      //攻撃
   int  defense2 = 180;     //防御
   int  agility2 = 45;      //素早さ


はっきり言って超メンドクサイ!!

ならば、これらのステータスをモンスタークラスとしてまとめてしまおう!
各ステータスをインスタンス変数にして、そこに値を設定するコンストラクタを作成する。

class Monster {

  String  name;    //名前
     int  hp;      //HP
     int  attack;  //攻撃
     int  defense; //防御
     int  agility; //素早さ

  //コンストラクタ、引数は(名前,HP,攻撃力,防御力,素早さ)
  Monster(String name, int hp, attack, defense, agility) {
    this.name = name;       //名前を設定
    this.hp = hp;           //HPを設定
    this.attack = attack;   //攻撃を設定
    this.defense = defense; //防御を設定
    this.agility = agility; //素早さを設定
  }
}


このクラスを作って先ほどのモンスター2体を表現すると

Monster slime = new Monster("スライム", 5, 12, 8, 10);
Monster dragon = new Monster("ドラゴン", 150, 220, 180, 45);


モンスター2体を2つの変数で表現できてシンプルでわかり易い!
このようにクラスを使った方が便利ですねえ。

さらにMonsterクラスに攻撃された場合のメソッドをつくると…

int attacked(int hit) {

  //被弾値-防御=ダメージ
  int damage = hit - defense;

  //ダメージを受けた場合
  if (damege > 0) {
    //HPからダメージを引く
    hp -= damage - defense;
  } else {
    damege = 0;
  }
  return damege;
}


そうすると、モンスターを攻撃した場合の処理は…

//スライムを生成
Monster slime = new Monster("スライム", 5, 12, 8, 10);

//スライムに攻撃力40で攻撃
int damege = slime.attacked(40);

//32のダメージを与えた
System.out.printf("%dのダメージを与えた", damege);


と直感的にわかりやすくなる。



このようにクラスとはモンスターを作るのに決めなければならない項目の集まりである。

モンスターには攻撃力や防御力などのステータスが必要!
だから、フィールドにそれらを持たせる。

モンスターを攻撃したときにHPを減らしたい!
だから、メソッドとしてそういう機能を作る。

そうすることで、モンスターを生成し攻撃してダメージを与えるという処理が直感的で簡潔にコーディングすることができるわけです。
クラスって便利ですよね?

0 件のコメント:

コメントを投稿