これ、コンパイル通ります?
あまりJavaはやっていないですが、コンパイル通らない気が...
String moji = ...;
... moji.attack() ...
っておかしくないですか? そのまま読むと
Stringのattackメソッドを呼び出す です。 String::attack() なんてありましたっけ?
また、コンパイルエラーになるかどうかわかりません ( 試したことないから ) が、
なぜ Enemyを継承しているのにそれぞれ attackメソッドをstaticでやっているんでしょうか?
それなら継承しないほうがいいと思いますが。(強みが薄れる。)
私なら Enemyをそれぞれ継承して Enemyの配列かリストを用意する。
その前に、Enemyクラスやそれ周辺を何とかしないと...
今のところインターフェースで良さそうなのでinterface として Enemyを定義。
Java
1interface Enemy{
2 int attack();
3}
で、これを継承(厳密には実装だけど。)してスライムやらのクラスを定義。
Java
1public class Slim implements Enemy{
2 public Slim( int id ){ id_ = id; }
3 public int attack(){ return ap_; }
4 private int ap_; // attack point. (攻撃力)
5 private int id_; // このオブジェクトの番号?
6}
こうすれば、
Java
1Slim slim1 = new Slim(1);
2int a = slim1.attack();
3// a のダメージを受けた!
みたいにできる。
でもこれはあまりよくない。
オブジェクト指向設計 getter, setterを使うなとはどういうことかを読むと、「データはオブジェクトに任せるべき」らしいです。
よって仕様そのものを変更します。
Enemyインターフェースよりも Chara抽象( インターフェースでもいいけど ) にしたほうがいいかな。
参考: アブストラクト
Java
1public abstract class Chara{
2 abstract boolean attack( Chara c );
3 abstract boolean attacked( int n ); // 攻撃されたときの処理
4}
これを継承してSlimやらを定義。
Java
1public class Slim implements Enemy{
2 public Slim( int id ){ id_ = id; }
3 public boolean attack( Chara c ){
4 if( c.attacked( ap_ ) ){ // 攻撃して相手が HP = 0 なら
5 return true;
6 }
7 return false;
8 }
9 public boolean attacked( int n ){
10 hp_ -= n; // hp_ = hp_ - n; と同義
11 if( hp_ >= 0 ) return true;
12 return false;
13 }
14 private int ap_; // attack point. (攻撃力)
15 private int id_; // このオブジェクトの番号?
16 private int hp_; // HP
17}
のようにHPやらMPやらはオブジェクトが管理するようにする。
で、attackメソッドに攻撃対象のオブジェクトを渡せば攻撃側のap_ ( 攻撃力 ) による攻撃が差し引かれて...っていう風に。
Java
1// mainメソッド等の呼び出し元で
2Slim slim1 = new Slim(1);
3Hero hero = new Hero(1);
4slim1.attack( hero ); // 主人公に攻撃
5hero.attack( slim1 ); // スライム( スライム1 ) に攻撃
みたいにできる。
即席だからものすごい適当で、本来ならattackedは親であるabstractではprotectedでmainメソッドのような外部からは触れないようにしたり、
コンストラクタをprotectedかなんかにしてデザインパターンのFactoryパターンかなんかで
- ファイルから前回の攻撃力やらHPやらのデータを取得
- そのデータからオブジェクトを生成して返す
みたいな感じでやったりするはずだけど、あくまで例だから省略。(スルー)
ここまでが準備段階。
で、問題の
slime,Dragon,Devilの中からランダムに取り出して、最終的に『勇者は(10,100,300のどれか)のダメージを受けた!』と表示することは可能ですか?
ですけど、これは私なら先ほどのChara抽象の配列かリスト等を生成。
Java
1List<Chara> enemies = new ArrayList<Chara>(); // 敵用arrayリスト
で、オブジェクト指向を取り入れた言語では
子クラスでnewして 親で保持することが可能です。
本来なら ArrayList<Chara> ... = new ArrayList<Chara>(); となっているはずですが、
List<Chara> ... = new ArrayList<Chara>(); としますよね?
それと一緒です。
参考: インターフェース
ということで
Java
1// List<Chara> enemies =...;
2enemies.add( new Slim1(1) );
3enemies.add( new Slim2(2) );
4enemies.add( new Dragon(1) );
5...
と登録しておき、乱数を発行して
Java
1// int r; // すでに乱数は発行されているものとして
2enemies[r].attack( hero );
のようにできる。
もちろん、"スライム1によってダメージ10を受けた..." 的な文章も出せるはずだけど、そこは質問者さんが工夫してね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/18 02:48
2018/10/18 02:53
2018/10/24 02:19 編集
2018/10/18 02:59