Cの構造体・JAVAの基本的な知識があることを前提
//////////////////////////////////////////////////
構造体と比較
//////////////////////////////////////////////////
RPGでキャラクターが3人いる場合
struct charcter {
int hp; //HP
int state; //状態 1で生きている 0で死んでいる
int attack; //攻撃力
int weapon; //武器の力
}
こんな感じの構造体
とりあえずクラスは構造体としても使えるので、JAVAで書くと
class Charcter {
public int hp; //HP
public boolean state; //状態 trueで生きている falseで死んでいる
public int power; //攻撃力
public int weapon; //武器の力
}
こうなる publicはとりあえず無視
Charcter char1 = new Charcter();
とかけば、
char1.hp
などのように使える(構造体と同じ)
当然3人いるのでこう書く
Charcter char1 = new Charcter();
Charcter char2 = new Charcter();
Charcter char3 = new Charcter();
結論:クラスは構造体としても使える
//////////////////////////////////////////////////
構造体ではなくクラスを使う意味
//////////////////////////////////////////////////
敵に攻撃する、とかのときは自分の攻撃力と武器の攻撃力を足したものになる(通常
よって、構造体として扱うなら
char1.power + char.weapon
と書かないといけない
いちいちこんなの書くのはめんどくさい
ぱぱっとかければ楽 じゃあどうするか?
class Charcter {
public int hp; //HP
public boolean state; //状態 trueで生きている falseで死んでいる
public int power; //攻撃力
public int weapon; //武器の力
public int attack() {
return power + weapon; //攻撃力と武器の攻撃力の和を返す
}
}
今まで
char1.power + char.weapon
と書いていたのが
char1.attack()
ですむようになる
このクラス内の関数をJAVAではメソッドと呼ぶ(C++ではメンバ関数
当然、キャラごとに
char2.attack()
char3.attack()
も使る
キャラ1が敵から100のダメージをうけた
char1.hp -= 100;
こう書く
そして、HPが0以下になると死に、HPを0にする という場合
char1.hp -= 100;
if ( char1.hp <= 0 ) {
char1.hp = 0;
char.state = false;
}
いちいちこんな事を書かないといけない
ではどうすれば楽になるか
class Charcter {
public int hp; //HP
public boolean state; //状態 trueで生きている falseで死んでいる
public int power; //攻撃力
public int weapon; //武器の力
public int attack() {
return power + weapon; //攻撃力と武器の攻撃力の和を返す
}
public void damage( int i ) {
hp -= i; //HPを減らす
if ( hp <= 0 ) { //HPが0以下の死亡処理
hp = 0;
state = false;
}
}
}
とすると、
char1.damege(100);
このように書くだけで死んだ場合などの処理をしてくれる
結論:簡単に記述できるようになる
//////////////////////////////////////////////////
コンストラクタとは
//////////////////////////////////////////////////
Charcter char1 = new Charcter();
Charcter char2 = new Charcter();
Charcter char3 = new Charcter();
char1.hp = 300;
char1.state = true;
char1.attack = 50;
char1.weapon = 100;
char2.hp = 200;
・
・
・
非常に長ったらしい
こんなことをせずとも、
Charcter char1 = new Charcter( 300, true, 50, 100 );
Charcter char2 = new Charcter( 200, true, 30, 50 );
Charcter char3 = new Charcter( 150, true, 20, 30 );
このように書ければ楽
それがコンストラクタ
class Charcter {
public int hp; //HP
public boolean state; //状態 trueで生きている falseで死んでいる
public int power; //攻撃力
public int weapon; //武器の力
//コンストラクタ
//コンストラクタはクラス名と同じメソッド名にする
public Charcter( int h, boolean s, int p, int w ) {
hp = h;
state = s;
power = p;
weapon = w;
}
public int attack() {
return power + weapon; //攻撃力と武器の攻撃力の和を返す
}
public void damage( int i ) {
hp -= i; //HPを減らす
if ( hp <= 0 ) { //HPが0以下の死亡処理
hp = 0;
state = false;
}
}
}
このように記述することで長ったらしい代入から
Charcter char1 = new Charcter( 300, true, 50, 100 );
Charcter char2 = new Charcter( 200, true, 30, 50 );
Charcter char3 = new Charcter( 150, true, 20, 30 );
のように書くことができる
結論:同様に簡単に記述できるようになる
//////////////////////////////////////////////////
publicとprivate ゲッターとセッター
//////////////////////////////////////////////////
前回までの記述だと、
char1.hp = -100;
と、stateがtrue(生きている)にも関わらずHPをマイナスにできる
実際はこんなバカな事は誰もやらないだろうが、
-100の部分が変数でその変数が不祥事でマイナスになった場合などに備えておきたい
class Charcter {
private int hp; //HP
public boolean state; //状態 trueで生きている falseで死んでいる
public int power; //攻撃力
public int weapon; //武器の力
//コンストラクタ
//コンストラクタはクラス名と同じメソッド名にする
public Charcter( int h, boolean s, int p, int w ) {
hp = h;
state = s;
power = p;
weapon = w;
}
public int attack() {
return power + weapon; //攻撃力と武器の攻撃力の和を返す
}
public void damage( int i ) {
hp -= i; //HPを減らす
if ( hp <= 0 ) { //HPが0以下の死亡処理
hp = 0;
state = false;
}
}
//HPをセットするセッター
public void setHp( int h ) {
if ( 0 < h ) {
hp = h;
}
}
//HPを取得するゲッター
public int getHp() {
return hp;
}
}
めんどくさいのでHPのみをprivate
privateとは、
char1.hp = -100;
このように書いてもhpの値は変わらないようにすること
セッターと呼ばれるsetHpメソッドを通さないとHPが変わらないようになる
char.setHp(-100); //基本的には char1.hp = 100; と同じ
しかしセッターの部分を見ればわかるが、0以上でないとhpに代入されない
つまりHPの代入を間違えても0以下にはならない
しかし、HPの値がほしい場合
x = char1.hp;
と書いてもxには代入されない
そこでHPの値がほしいときはゲッターと呼ばれるものを使う
x = char1.getHp(); //x = char1.hpと同じ
ごちゃごちゃになるので今回はHPだけをprivateにしたが、通常はすべての変数(フィールド)をprivateにする
結論:HPなどの値が意図しない値にならないようにする
と、このようにクラスを作っておけば4人目を作るときも
Charcter char1 = new Charcter( 300, true, 50, 100 );
Charcter char2 = new Charcter( 200, true, 30, 50 );
Charcter char3 = new Charcter( 150, true, 20, 30 );
Charcter char4 = new Charcter( 350, true, 60, 120 );
とすれば4人目が簡単に作れる