Javaの学習のため、CUIによるテキストアドベンチャーを作っています。
現在学習開始から一ヶ月ほどで、基本的な文法と、クラスや継承、カプセル化、ポリフォーミズムなどを学びました。
(基本的な理解は一応したつもりですが、もちろんまだ使いこなせるレベルではないです)
テキストアドベンチャーはいわゆる美少女ゲーム的な内容にしようと思い、Mainクラスでゲームの主なループをさせつつ(このクラス内にmainメソッドがあります)、他に主人公やヒロインのクラスを作っていくという設計を考えました。
仮に主人公クラスにTaro、ヒロインクラスにHanako、Yoshikoを作るとします。
ヒロインは随時増やすという体で、オブジェクト指向の練習も兼ねてHeroineというクラスをそれぞれに継承させて作ることにしました。
Heroineクラスは以下↓のようなものです。
該当のソースコード
Java
1public class Heroine{ 2 private String name; 3 private int koukando; 4 5 public void koukandoUp(){ 6 koukando++; 7 } 8 9 public void koukandoDown(){ 10 koukando--; 11 } 12 13 public int getKoukando(){ 14 return this.koukando; 15 } 16 17 public String getName(){ 18 return this.name; 19 } 20 21 public void setName(String name){ 22 this.name = name; 23 } 24 25 //-------------コンストラクタで初期化----------- 26 Heroine(){ 27 this.koukando = 10; 28 } 29}
発生した問題
Hanako,Yoshikoに上記のHeroineクラスを継承させたうえで、MainクラスとTaroクラスのそれぞれで好感度パラメーターを受け取ろうとして、やり方がわからなくなりました。
(※下部「追記」にて詳細を書き加えました)
getKoukando();を使うには、まずHanakoやYoshikoをインスタンス化しないといけませんよね?
ですがMainクラスとTaroクラスでそれぞれにHanako hanako = new Hanako();としてしまうと、作られた2つのhanakoインスタンスは全く別物となるのでしょうか?
これはMainとTaroの二つのクラスで好感度パラメーターを受け取ろうとする設計自体が、そもそもおかしいのでしょうか。
それとも何かもっとスマートなやり方がありますでしょうか?
教本やwebページで調べてみると項目ごとに詳しい説明が書かれてはいます。
インスタンス化の仕方、カプセル化の使い方、継承のやりかた……等々。
しかしながら「こういったプログラムを作る場合にどういうやり方がセオリーであるのか」ということが全く分からず、つまづいてしまっています。
ご教示いただけたら幸いです。
補足情報(他に試してみたこと)
であるならば、koukandoやnameをstatic変数にすればいいのかな? と思いHeroineクラスのメンバをあらかたstaticにしてみたところ、ヒロインの名前が両方とも「よしこ」になるなどHanakoとYoshikoのパラメーターがごっちゃに混ざってしまいました……汗
追記(MainクラスとTaroクラスのそれぞれで好感度パラメーターを受け取ろうとしたことについて)
Taroクラスには、以下のようにたろうくんが実行する行動を記載しました。
Java
1import java.util.Scanner; 2public class Taro{ 3 public String name; 4 public int hp; 5 public final int max_hp; 6 public int intelligence; 7 8 public void action(){ 9 Scanner scan = new Scanner(System.in); 10 System.out.println("行動を選んでください。"); 11 System.out.println("1.移動 2.勉強 3.寝る"); 12 int val = scan.nextInt(); 13 switch(val){ 14 case 1: 15 this.move(); 16 break; 17 18 case 2: 19 this.study(); 20 break; 21 22 case 3: 23 this.sleep(); 24 break; 25 } 26 } 27 28 public void sleep(){ 29 this.hp = 100; 30 System.out.println(this.name + "は眠った。体力が回復した!\n"); 31 } 32 33 public void move(){ 34 35 36 Scanner s = new Scanner(System.in); 37 Hanako hanako = new Hanako(); 38 Yoshiko yoshiko = new Yoshiko(); 39 System.out.println("どこに移動しますか?"); 40 System.out.println("1.校舎裏 2.公園 3.プール 4.帰宅する"); 41 int val = s.nextInt(); 42 this.hp-=5; 43 switch(val){ 44 case 1: 45 System.out.println("校舎裏に移動した。"); 46 hanako.upKoukando(); 47 break; 48 49 case 2: 50 System.out.println("公園に移動した。"); 51 yoshiko.upKoukando(); 52 break; 53 54 case 3: 55 System.out.println("プールに移動した。"); 56 break; 57 58 case 4: 59 System.out.println("帰宅した。"); 60 break; 61 } 62 63 } 64 65 public void study(){ 66 this.hp -= 10; 67 this.intelligence += 5; 68 System.out.println("知力が5上がった。\n"); 69 } 70 71 //-------------コンストラクタで初期化----------- 72 public Taro(){ 73 this.hp=100; 74 this.max_hp=100; 75 this.intelligence = 60; 76 } 77}
はなこさんはいつも校舎裏に、よしこさんはいつも公園にいるということにして、会いにいくと(それだけで)好感度が上がるということにしました。
この際にupKoukando()メソッドを使うため、HanakoクラスとYoshikoクラスのそれぞれをインスタンス化しています。
そしてMainクラスでは、
Java
1public class Main{ 2 static int dayCount=1; 3 4 public static void main(String[] args){ 5 Taro taro = new Taro(); 6 taro.name = "たろう"; 7 8 for(int i=1;i<11;i++){ 9 putStatus(taro.intelligence,taro.hp); 10 taro.action(); 11 dayCount++; 12 } 13 } 14//------------------ 15 public static void putStatus(int intel,int hp){ 16 System.out.println("+++++++++++++++++++++++++++"); 17 System.out.println(" "+dayCount+"日目"+" "+"知性"+intel+" "+"体力"+hp); 18 System.out.println("の好感度"); 19 System.out.println("の好感度"); 20 System.out.println("+++++++++++++++++++++++++++"); 21 } 22}
for文で10日間のループを、putStatus()で現在のパラメーターを表示させました。
そしてputStatus()の中、3,4行目の「System.out.println("の好感度");」のところにそれぞれはなこ、よしこの名前と好感度を呼び出そうと、mainメソッド内で再度Hanako hanako = new Hanako();としたところ、MainクラスとTaroクラスにそれぞれ別のhanakoインスタンスができてしまいうまくいきませんでした。
回答3件
あなたの回答
tips
プレビュー