私は趣味でやっているので、その道の方とは方向性が違うかもしれません。
もしかしたら、禁じ手かもしれません。(例えば、さすがにやりませんが、グローバル変数をガンガン使うとか。)
それでもいいから、ヒントが欲しいっていうことだと思うので書きますね。
よい子のC++(オブジェクト指向完全理解)によると、「OOPは役割分担である」らしいです。
「オブジェクトだけが、(対象)データとその変動、処理内容を知っている」っていうことらしいです。
だから、「もし、これらを役割分担していくならどうしたいか」って考えますね。私なら。
オリジナルコードは(私が書きやすいように、問題のコードをそのままコピペすると...)
Java
1import java.util.Random;
2
3public class Battle2 {
4 public static void main(String[] args){
5 //プレイヤパラメータ
6 String p1 = "ダイゴ";
7 String p2 = "北川景子";
8
9 String m1 = "足軽隊";
10 String m2 = "鉄砲隊";
11 String m3 = "将軍様";
12
13 int st1 = 60;
14 int st2 = 120;
15 int st3 = 280;
16 int da1 = new Random().nextInt(100);//0から99までの整数ランダム
17 int da2 = new Random().nextInt(200);//0から199までの整数ランダム
18
19 System.out.println("敵部隊が現れた");
20 System.out.println("-----------------------");
21 System.out.println(m1 + " HP:" + st1);
22 System.out.println(m2 + " HP:" + st2);
23 System.out.println(m3 + " HP:" + st3);
24 System.out.println("-----------------------");
25 System.out.println(p1 + "の攻撃");
26 System.out.println(m1 + "は" + da1 + "のダメージ");
27 st1 = st1 - da1;
28
29 System.out.println(p2 + "の攻撃");
30 System.out.println(m1 + "は" + da2 + "のダメージ");
31 st1 = st1 - da2;
32
33 System.out.println(m2 + "は" + da2 + "のダメージ");
34 st2 = st2 - da2;
35
36 System.out.println(m3 + "は" + da2 + "のダメージ");
37 st3 = st3 - da2;
38
39 System.out.println("-----------------------");
40 System.out.println(m1 + " HP:" + st1);
41 System.out.println(m2 + " HP:" + st2);
42 System.out.println(m3 + " HP:" + st3);
43 System.out.println("-----------------------");
44 //足軽隊のHPが0以下だったら
45 if(st1 <= 0){
46 System.out.println(m1 + "は倒れた");
47 }
48 //鉄砲隊のHPが0以下だったら
49 if(st2 <= 0){
50 System.out.println(m2 + "は倒れた");
51 }
52 if(st3 <= 0){
53 System.out.println(m3 + "は倒れた");
54 }
55
56 //余裕判定(合計ダメージが50以下)
57 if(da1 + da2 <=50){
58 System.out.println(m1 + "は余裕で微笑んだ");
59 }
60 if(da2 <= 50){
61 System.out.println(m2 + "は余裕で微笑んだ");
62 }
63
64
65 //勝利判定
66 if(st1 <= 0 && st2 <= 0 && st3 <= 0){
67 System.out.println("戦いに勝利した");
68 }
69 }
70}
ですよね。
RPGみたいな感じでやろうとしていますね。
少なくとも 戦うキャラの、戦国系だと、武将にあたるキャラが二人。(自分と敵。つまりプレイヤーとPC)
そして、それぞれの配下に足軽や鉄砲隊といった、駒がある。
Randomで生成しているのは、受ける攻撃力かなんか(すべては読んでいません。)だと思います。
そうすると、少なくとも、管理したいデータが、
→ 配下に足軽等
- 攻撃力等の指定
- 将棋や囲碁でいう将棋盤とか、カードゲームとかでならフィールドと呼ばれる場所
ですよね。
まず、メイン武将は、「名前」, 「HP」あたりは必須だと思います。
なので、こいつらをフィールド(メンバ変数)として、保持します。
そして、これを「Commander」(総司令官) とします。
Java
1public class Commander{
2 private String name_;
3 private int hp_;
4}
でもこのままではアクセスできないので、コンストラクタで名前とHP、そしてメソッドとして、攻撃した・された系のものをつける。
また、攻撃力がわからないので、これをコンストラクタで受けて、(上記には書いていなかったが)ap (攻撃力) をセットする。
Java
1public class Commander{
2 private String name_;
3 private int hp_;
4 private int ap_; // 攻撃力
5 public Commander( String name, int hp, int ap ){ name_ = name; hp_ = hp; ap_ = ap; }
6 public bool attack( int damage ){ /* ??? */ } /* 要修正 */
7 public bool attacked( int damage ){ hp_ -= damage; } /* 本来はif文で「攻撃できたか」云々をチェックする */
8}
まずはメイン武将についてはここまで。
これ以降はほかの部分にバッティングするので。
そして、次は、メイン武将の配下にある、足軽とかそういうキャラ。
(配下にいるのは)常に3人以下なのか、HP = 人数 と考えておられるのか...とかによっても変わってくると思いますが、
足軽とかも、メイン武将みたいな感じで組んでいく。
そして、「足軽その他は、メイン武将の配下にある」と考えるなら、メイン武将のフィールドとして、List<>あたりで保持したほうが管理しやすそう。
もし、足軽クラスを Ashigaru, 鉄砲隊クラスなら Teppoutai ... とか。
で、上記には書いていませんが、 addServantメソッドで、
Java
1Ashigaru ashigaru = new Ashigaru(100);
2bushuo.addServant( ashigaru );
みたいに追加していく。
これが、常に三つまでならいいですが、後から追加する可能性もあるなら、List<> に含めたい。
でもそのままではできません。
List<int> に Stringとかを入れるようなものです。
なので、ここは継承を使います。
Ashigaru, Teppoutai ... は 「メイン武将の配下」であることから、ここは Subと考えて、
Sub インターフェース ( Javaなら interfaceがありますが、それです )を定義して、
攻撃する・されるとかのインターフェースを用意。
それを継承・実装して、Ashigaru とかができる...みたいな感じにしておく。
そうすれば、
Java
1public class Commander{
2 private String name_;
3 ...
4 private List<Sub> subs_;
5 ...
6 public addServant( Sub sub ){ subs_.add( sub ); }
7}
みたいにすればいい。
あとは、しっくりくるように組み立てる。( キャラに関しては )
攻撃力の指定とかは、プログラムが指定してもいいですが、乱数を発行したり、あるいは前回の続きから行ったり...とかがありますよね。
なので、ここはメソッド化もしくはクラス化しちゃいましょう。
今回の場合は、メソッドで事足りるので、メソッドでいいです。
- 乱数を生成する(複数個)
- 生成した乱数をもとに、List<Sub> とかを生成して返す
みたいな感じで。
将棋盤に相当する場所は、遊〇王とかそういう、世界観を持つようなものじゃなくて、
単に戦わせるだけのフィールドなら、mainメソッドでもいいかも?
それがちょっと怪しいなら、別のメソッドを呼んで、間接的に操作...みたいに。
[追記1]
ああ、忘れていました。
多分、ご承知だとは思いますが、
攻撃する側からすれば、Subを受け取り、そのSubのattackedメソッド( 攻撃された系 ) を呼び出して、改変してもらう。
そして攻撃される側からすると、自分オブジェクトが攻撃者に渡され、
自身のattackedメソッドに、敵の攻撃力( ap_ ) が渡される。
そして、その値をマイナスしていく。(ふつうは攻撃されたらマイナスになるからねぇ。)
簡易的なものならこれでいいですが、ほとんどのRPGなんかは、「独自の攻撃や回復系魔法 等」を持っていますね。
これはどうするか、頭を悩ませますが、そういう風に考えていく。
あと、ポーションとか、ドラ〇ンボ〇ルでいう「仙〇」とかみたいな、回復したり、
逆に、爆弾とかそういう、攻撃系のアイテムがあったりします。
これも、キャラ系のやつとかみたいに、クラス化したり、インターフェースを設けて実装したり。
使った後は、使えなくするのが普通ですよね。
(さすがに食い物系や爆弾系で何度使っても...っていうのは不自然だし。仮にOKだとしても、「常に湧き出る水」みたいに、特殊条件を付けないといけないでしょうし。)
なので、C++でいえばdeleteに相当する処理をする。(Javaだと無いと思うので、単純にリストから省くとか)
あるいは、未使用・使用のチェックためにboolを追加しておく。これで「未使用」と判定されたものだけ使う...とか。
[追記2]
あと、なんとなく思いついたのですが、基本攻撃とかMPを使って行う攻撃や回復は、これもクラス化するかなぁ...
そしたら、オブジェクトを取り換えるだけでいい気がする...