カプセル化サンプルコード - 萌えJava超入門
第十六章 インスタンス

カプセル化サンプルコード

カプセル化の実例を
少しだけ実践的なサンプルコードで紹介します。


カプセル化サンプルコード

この章で習ったことを使ったサンプルです。
読み解いてみてください。
RPG風のサンプルコードだ。
ちょっと長いが、きみたちには
それほど難しくははないと思う。
先ずはざっと目を通してみてくれ。
//Member_A.java
class Member_A {

  private String name;//名前
  private int hp;//HP(ヒットポイント)
  private int attack;//攻撃力
  private int defense;//防御力

  /*コンストラクタ*/
  public Member_A(String name, int hp, int attack, int defense) {

    this.name = name;
    this.hp = hp;
    this.attack = attack;
    this.defense= defense;
    printState();
  }
  /*hitメソッドの引数時に使用*/
  public int getAttack(){
    return attack;
  }
  /*レベルアップ*/
  public void levlUp() {
    System.out.println(name + " Levl Up");
    hp += 3;
    attack += 2;
    defense+= 1;
    printState();
  }

  /*敵の攻撃*/
  public boolean hit(Member_A ene) {
    int damage = ene.getAttack() - defense;
    damage = damage<0 ? 0 : damage;
    hp -= damage;
    return hp>0;
  }
  /*ステータスの表示*/
  public void printState() {
    System.out.println("--------------");
    System.out.println("name\t"+name);
    System.out.println("hp\t"+hp);
    System.out.println("attack\t"+attack);
    System.out.println("defense\t"+defense);
    System.out.println("--------------");
  }
  /*HPの表示*/
  public void printHp() {
    System.out.println("--------------");
    System.out.println("name\t" + name + "\tHP: "+hp);
    System.out.println("--------------");
  }
}

サンプルコードの解説

Member_Aクラス
Member_Aクラスは、ロールプレイングゲームなどによく使われるキャラクターのクラスをモデルに作成したサンプルです。
Member_Aクラスのインスタンスが、
一人一人のキャラクターになるわけです。
(下の Driver_Aクラスで生成した p_01p_02)

Member_Aクラスは、インスタンスの生成を前提として作られています。
つまり、このクラスはインスタンスメンバで構成されています。
変数には、インスタンス外から直接操作されないように、private修飾子が付与されています。
このクラスには、自身のインスタンス変数を操作するためのメソッドがすべて収められています。



//Driver_A.java
class Driver_A{

    public static void main(String[] args){
      Member_A p_01 = new Member_A("Kazuma",10,5,2);//インスタンス生成

      Member_A p_02 = new Member_A("Aqua", 8,8,3);//インスタンス生成

      boolean life = true;

      for(int i=0; i<5; i++){
        System.out.println("\nround_" + (i+1));
        life = p_01.hit(p_02); //殴られた hp>0 で life==true 
        p_01.printHp();
        p_02.printHp();
        p_01.levlUp(); //レベルアップ
        if(!life)break;
      }
      if(life){
        System.out.println("kazuma is alive.");
      }else{
        System.out.println("kazuma is dead.");
      }
    }
}

サンプルコードの解説

Driver_Aクラス
Driver_Aクラスでは、Member_Aクラスのインスタンスを二つ作っています。
同じクラスから生成したインスタンス同士であっても、
お互いのインスタンス変数にアクセスすることはできません。

Kazuma(p_01) が Aqua(p_02) に一方的に殴られて、その度に Kazumaはレベルアップします。
Kazuma の HP が 0 になるか、攻撃を5回耐えればプログラムが終了します。
最後に Kazuma HP が評価されます。
乱数が設定されているわけではないので
何度やっても結果は同じだけどね。


コマンドライン
>cd ws
ws>javac -encoding UTF-8 Driver_A.java
ws>java Driver_A
--------------
name    Kazuma
hp      10
attack  5
defense 2
--------------
--------------
name    Aqua
hp      8
attack  8
defense 3
--------------

round_1
--------------
name    Kazuma  HP: 4
--------------
--------------
name    Aqua    HP: 8
--------------
Kazuma Levl Up
--------------
name    Kazuma
hp      7
attack  7
defense 3
--------------

round_2
--------------
name    Kazuma  HP: 2
--------------
--------------
name    Aqua    HP: 8
--------------
Kazuma Levl Up
--------------
name    Kazuma
hp      5
attack  9
defense 4
--------------

round_3
--------------
name    Kazuma  HP: 1
--------------
--------------
name    Aqua    HP: 8
--------------
Kazuma Levl Up
--------------
name    Kazuma
hp      4
attack  11
defense 5
--------------

round_4
--------------
name    Kazuma  HP: 1
--------------
--------------
name    Aqua    HP: 8
--------------
Kazuma Levl Up
--------------
name    Kazuma
hp      4
attack  13
defense 6
--------------

round_5
--------------
name    Kazuma  HP: 2
--------------
--------------
name    Aqua    HP: 8
--------------
Kazuma Levl Up
--------------
name    Kazuma
hp      5
attack  15
defense 7
--------------
kazuma is alive.

ちなみにKazumaの初期HPを9にすると
Kazumaは天に召される。





お疲れ様でした。



© 2019 awasekagami