質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

905閲覧

Java クラス分けについて

potohuji-0517

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2022/05/16 01:05

編集2022/05/16 07:54

javaでRPGゲームのプログラムを作っています。魔王の行動を別クラスに分けたいのですが、どうしたらいいのかわかりません。教えていただけますでしょうか。

```Main.java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { //キャラクターの体力 Character Braver = new Character(550, "勇者"); Enemy enemy = new Enemy(9999, "魔王"); System.out.println("魔王があらわれた!"); boolean fin = false; //終了フラグ //行動コマンド Command:while (!fin) { for (int i = 0; i < 1; i++) { //キーボード入力値を取得 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num; while (true) { System.out.println(Braver.getName() + "はどうする? 1:たたかう 2:とくぎ 3:どうぐ 4:にげる"); try{ num = Integer.parseInt(br.readLine()); if(num < 5){ break; } }catch(NumberFormatException e){ //何もしないでループを続ける } } //行動の分岐 switch (num) { case 1: System.out.println("勇者のこうげき!"); System.out.println("ミス!ダメージをあたえることができない!"); System.out.println(" "); //Trueである限り攻撃し続ける if (enemy.getHP() <= 0) { fin = true; } break; case 2: //特技のコマンド int num1; while(true){ System.out.println("1:メラミ 2:ホイミ 3:はやぶさ斬り 4:ぱふぱふ 5:もどる"); try{ num1 = Integer.parseInt(br.readLine()); if(num1 < 6){ break; } }catch(NumberFormatException e){ //何もしないでループを続ける } } switch (num1) { case 1: System.out.println(Braver.getName() + "はメラミをとなえた!"); System.out.println(enemy.getName() + "に78のダメージ!"); System.out.println(" "); enemy.setHP((enemy.getHP() - 20)); if (enemy.getHP() <= 0) { fin = true; } break; case 2: System.out.println(Braver.getName() + "はホイミをとなえた!"); System.out.println(Braver.getName() + "のHPが32回復した!"); System.out.println(" "); Braver.setHP((Braver.getHP() + 32)); if (enemy.getHP() <= 0) { fin = true; } break; case 3: System.out.println(Braver.getName() + "のはやぶさのごとき高速の2回こうげき!"); System.out.println(enemy.getName() + "に合計56のダメージ!"); System.out.println(" "); enemy.setHP((enemy.getHP() - 56)); if (enemy.getHP() <= 0) { fin = true; } break; case 4: System.out.println(Braver.getName() + "は" + enemy.getName() + "にぱふぱふしてあげた!"); System.out.println(enemy.getName() + "は冷ややかな視線でこちらを見ている..."); System.out.println(" "); enemy.setHP(enemy.getHP()); if (enemy.getHP() <= 0) { fin = true; } break; //一つ前に戻るコマンド case 5: continue Command; } continue; case 3: //道具のコマンド int num2; while(true){ System.out.println("1:やくそう 2:うまのふん 3:てんばつの杖 4:もどる"); try{ num2 = Integer.parseInt(br.readLine()); if(num2 < 5){ break; } }catch(NumberFormatException e){ //何もしないでループを続ける } } switch (num2) { case 1: System.out.println(Braver.getName() + "はやくそうをつかった!"); System.out.println(Braver.getName() + "のHPが30回復した!"); System.out.println(" "); Braver.setHP((Braver.getHP() + 30)); if (enemy.getHP() <= 0) { fin = true; } break; case 2: System.out.println(Braver.getName() + "はうまのふんをつかった!"); System.out.println("しかしなにも起こらなかった。"); System.out.println(" "); enemy.setHP(enemy.getHP()); if (enemy.getHP() <= 0) { fin = true; } break; case 3: System.out.println(Braver.getName() + "はてんばつの杖をふりかざした!"); System.out.println("あたりにはげしい旋風が巻き起こる!魔王に45ダメージ!"); System.out.println(" "); enemy.setHP((enemy.getHP() - 45)); if (enemy.getHP() <= 0) { fin = true; } break; case 4: //一つ前に戻るコマンド continue Command; } continue; case 4: //逃げるコマンド System.out.println("勇者はにげだした!"); System.out.println("しかしまわりこまれてしまった!"); System.out.println(" "); } break; } if (!fin) { for(int j = 0; j < 1; j++){ //値をランダムに取得し、対応した行動を表示する //Enemyクラスのactionメソッドを呼び出す enemy.action(Braver); nowHp(Braver,enemy); } continue; } if (Braver.getHP() <= 0) { fin = true; } } if (Braver.getHP() <= 0) { System.out.println(Braver.getName() + "はちからつきた..."); } } //残りHPを表示するメソッド static void nowHp(Character Braver,Character enemy) { if(Braver.getHP() > 0){ System.out.println(Braver.getName() +" HP:"+Braver.getHP()); }else{ System.out.println(Braver.getName() +" HP:0"); } } }

Character.java

1public class Character { 2 Character(int hp,String name){ 3 this.setHP(hp); 4 this.setName(name); 5 } 6 7 private int HP = 0; 8 private String Name = ""; 9 public int getHP() { 10 return HP; 11 } 12 public void setHP(int hp) { 13 HP = hp; 14 } 15 public String getName() { 16 return Name; 17 } 18 public void setName(String name) { 19 Name = name; 20 } 21}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いろいろな設計が有り得ると思いますが、クラス設計の練習としてありがちなのは、以下のような感じでしょう。

  • Character クラスを継承して魔王クラスを作る
  • 変数 Enemy は魔王クラスのインスタンスにする
  • そのクラスに action() メソッドを足して、魔王の行動のforの中身(nowHP()以外)を移動して、以下のような呼び出しになるようにする

java

1Enemy.action(Braver); 2nowHp(Braver, Enemy);

投稿2022/05/16 01:23

int32_t

総合スコア20845

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

potohuji-0517

2022/05/16 02:32

このようなコンパイルエラーが出るのですが、何が原因なのでしょうか? Enemy.java:6: エラー: 式の開始が不正です public static void action(){ ^ Enemy.java:52: エラー: class, interface, enumまたはrecordがありません } public class Enemy extends Cahacter { public static void Main(String[] args){ Enemy enemy = new Enemy(); public static void action(){ Random rand = new Random(); int val = rand.nextInt(5); switch (val) { case 0: System.out.println(Enemy.getName() + "のこうげき!"); System.out.println(Braver.getName() + "に51のダメージ!"); System.out.println(" "); Braver.setHP((Braver.getHP() - 50)); break; case 1: System.out.println(Enemy.getName() + "のゆびからいてつくはどうがほとばしる!"); System.out.println(Braver.getName() + "にかかっているすべてのじゅもんのききめがなくなった!"); System.out.println(" "); break; case 2: System.out.println(Enemy.getName() + "はイオナズンをとなえた!"); System.out.println(Braver.getName() + "に118のダメージ!"); System.out.println(" "); Braver.setHP((Braver.getHP() - 120)); break; case 3: System.out.println(Enemy.getName() + "はじごくからいかずちをよびよせた!"); System.out.println(Braver.getName() + "に255のダメージ!"); System.out.println(" "); Braver.setHP((Braver.getHP() - 255)); break; case 4: System.out.println(Enemy.getName() + "はふてきにわらっている。"); System.out.println(" "); break; } continue; } } }
int32_t

2022/05/16 03:43

> public static void Main(String[] args){ > Enemy enemy = new Enemy(); この2行が不要です。 * action() は static にすべきではありません。 * action() 内では 「Enemy.」は消すか 「this.」に置き換えます。 * action() の引数として Braver を受け取るようにしましょう。
potohuji-0517

2022/05/16 04:08

試行錯誤したのですが、どうしても分からず...コンパイルが通るようなコードを教えていただけないでしょうか?
int32_t

2022/05/16 04:14

> コンパイルが通るようなコードを教えていただけないでしょうか? お断りします。そもそもいま触れる環境にJavaのコンパイラがないので。 コードとエラーメッセージを貼っていただければ問題の指摘はしますよ。 (コードはできるだけコメントではなく質問文に追加してもらえると読みやすくて助かります)
int32_t

2022/05/16 04:29

> Enemyをコンパイルすると、identifierがありませんとエラーメッセージが表示されます。 action() の引数に型名が必要です。 public void action(Character Braver) { あと、Enemy のコンストラクタも必要でしょう。 Enemy(int hp, String name) { super(hp, name);
potohuji-0517

2022/05/16 05:22

このようなエラーが出た際はどう対処すればよろしいでしょうか? 質問続きで申し訳ございません。
int32_t

2022/05/16 05:27

> extends Cahacter スペルが間違ってます。 > Enemy(int hp, String name) { このコンストラクタの 閉じ } がありません。 前のコードにあった「public void action(Braver){」が消えてます。
potohuji-0517

2022/05/16 05:38

訂正しても変わらず同じエラーがを吐いてしまいます... Characterクラスに問題があったりしますか?
int32_t

2022/05/16 05:43

> 訂正しても変わらず同じエラーがを吐いてしまいます... 行番号ぐらいは変化してませんか? 今のコードはコンストラクタがaction()メソッドの中に入ってしまってます。action()メソッドの外に置きましょう。
potohuji-0517

2022/05/16 05:51

コンストラクタをaction()メソッドの外に置くと、今度は以下のようなエラーが表示されました。 Enemy.java:9: エラー: シンボルを見つけられません Random rand = new Random(); ^ シンボル: クラス Random 場所: クラス Enemy Enemy.java:9: エラー: シンボルを見つけられません Random rand = new Random(); ^ シンボル: クラス Random 場所: クラス Enemy エラー2個
int32_t

2022/05/16 06:14

Main.java では Random クラスを使うために import しています。それを真似しましょう。
potohuji-0517

2022/05/16 06:30

おかげさまでEnemyクラスはコンパイルが通ったのですが、今度はMainで上記のようなエラーメッセージが表示されました。 確認いただけますでしょうか...
int32_t

2022/05/16 06:34

回答に書いた通りです。 > 変数 Enemy は魔王クラスのインスタンスにする 「Character Enemy = new Character(9999, "魔王");」を変更する必要があります。 あと、Enemy がクラス名になったのでこの Enemy という変数名は変える必要があります。 Javaでは通常、変数名は小文字で始めます。
potohuji-0517

2022/05/16 07:01

魔王クラスのインスタンスにしたところ、Mainのenemyを使っていた部分が全てエラーになりました。 どうしたら適切に魔王クラスのenemyを呼び出せますか?
int32_t

2022/05/16 07:09

最新のコードとエラーを開示してください。
potohuji-0517

2022/05/16 07:12

追記しました。ご確認お願いします。
int32_t

2022/05/16 07:22

変数 enemy を定義していませんね。 > 「Character Enemy = new Character(9999, "魔王");」を変更する必要があります。 私はこの行を消せとは書いてないですよ。 この行を、Enemy クラスの変数 enemy を定義するように変更してください。
potohuji-0517

2022/05/16 07:27

コンパイルが通り、完成しました! 何が分からないのかも分からないような自分に長いこと教えていただき本当にありがとうございました!
potohuji-0517

2022/05/16 07:53

最後にもう一度すみません。 体力が0になっても力尽きたと表示されず、戦闘が続くようになってしまいました。 原因が分かりますでしょうか...?
int32_t

2022/05/16 08:19

enemy.action() の3行下の continue が不要に見えます。
potohuji-0517

2022/05/16 08:23

完全に見落としておりました...ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問