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

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

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

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

Q&A

解決済

3回答

4909閲覧

Java 戦闘 RPGみたいな

tvivo

総合スコア16

Java

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

0グッド

0クリップ

投稿2018/06/19 00:12

編集2018/06/19 01:12

Javaで戦闘プログラムを書きたいと思っています。
敵に遭遇(sysout("遭遇"))
while(自分のHPが0になるか敵のHPが0になるかで終わり)
選択肢(switch)
数値入力(BufferedReader)
case1:
①戦う(ダメーじ10)
case2:
②魔法(ダメージ20)
case3:
③逃げる(戦闘終了)

敵の行動
2回に一回攻撃(for i = 0; i<2; i++)
攻撃(ダメージ25)
なにもしない(0)

クラスを分ける
自分クラス
名前
HP 100
たたかう attack 10
魔法   attack 20
逃げる

敵クラス
HP 100
名前
たたかう attack 25
なにもしない attack 0

といった感じのざっくりとしたフローはかけたのですが
プログラムがうまく書けません。
主にダメージ計算がわかりません。
現在はこのような感じになっています。
どなたか教えてくださる方よろしくお願いいたします。

Java

1 2public class Main { 3 public static void main(String[] args) throws NumberFormatException, IOException { 4 Braver b = new Braver(); 5 Enemy e = new Enemy(); 6 b.setName("Braver"); 7 e.setEnemyname("Enemy"); 8 9 System.out.println("敵に遭遇しました。"); 10 while(e.getEnemyHP() <= 0 || b.getHP() <= 0){ 11 try { 12 for(int i = 0; i<2; i++){ 13 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 14 int num = Integer.parseInt(br.readLine()); 15 System.out.println(b.name+"の行動1:たたかう 2:まほう 3:にげる"); 16 switch(num){ 17 case 1: 18 System.out.println("たたかう"); 19 System.out.println(e.getEnemyname()+"に10のダメージを与えた"); 20 21 if(e.getEnemyHP() <= 0){ 22 break; 23 } 24 25 26 case 2: 27 System.out.println(("魔法")); 28 System.out.println(e.getEnemyname()+"に20のダメージを与えた"); 29 if(e.getEnemyHP() <= 0){ 30 break; 31 } 32 case 3: 33 System.out.println(("にげる")); 34 System.out.println(b.getName()+"は逃げ出した"); 35 break; 36 } 37 System.out.println(e.getEnemyname()+"の行動"); 38 if(i == 1){ 39 System.out.println(e.getEnemyname()+"の攻撃"); 40 41 System.out.println(b.getName()+"に25のダメージ"); 42 if(b.getHP() <= 0){ 43 break; 44 } 45 } 46 System.out.println("何もしなかった"); 47 } 48 } catch (Exception e1) { 49 e1.printStackTrace(); 50 } 51 } 52 } 53} 54 55 56 57public class Braver { 58 int HP = 100; 59 String name = "Braver"; 60 public int getHP() { 61 return HP; 62 } 63 public void setHP(int hP) { 64 HP = hP; 65 } 66 public String getName() { 67 return name; 68 } 69 public void setName(String name) { 70 this.name = name; 71 } 72 73 74} 75 76 77 78public class Enemy { 79 int enemyHP = 100; 80 String enemyname = "Enemy"; 81 public int getEnemyHP() { 82 return enemyHP; 83 } 84 public void setEnemyHP(int enemyHP) { 85 this.enemyHP = enemyHP; 86 } 87 public String getEnemyname() { 88 return enemyname; 89 } 90 public void setEnemyname(String enemyname) { 91 this.enemyname = enemyname; 92 } 93 94} 95

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

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

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

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

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

m.ts10806

2018/06/19 00:19

そもそもプログラムを書かれていない(提示されていない)ので「何が」「どう」うまく書けないのか見ている人には伝わりません。まず書いてみること、書いてみた結果、起きた事を質問に追記すること、自身が分かっている範囲と分かっていない範囲を明確にしてください(というか質問テンプレート使って書いて下さい)https://teratail.com/help/question-tips
m.ts10806

2018/06/19 00:20

現在の質問だけだと「こうやりたいから誰かあとは書いてくれ」と言っているのとほぼ同等です。「やってほしいことだけを記載した丸投げの質問」として非推奨とされるものです。
euledge

2018/06/19 00:40

「うまくかけない」といわれてもどこが問題なのか正解は質問者にしかわからないので回答に困ります。どのように動くのが正解で、それに対して今こうなっているということを質問に加えてください。
m.ts10806

2018/06/19 00:42

以前の質問が解決しているように思えません。 https://teratail.com/questions/131087 私が指摘している部分も含めて解決しているのでしたら、ここで「うまくいかない」と仰っていることはだいぶ解決できるはずです
m.ts10806

2018/06/19 01:29

私が最初のコメントで貼った「質問するときのヒント」を見ていただければ分かるはずですが、「うまくいかない」はこういった質問サイトでは禁句です。その表現では他人には何をやって何がおきたか伝わらないからです。「主に」も同様です。これまでの質問者さんの質問の感じから「ほぼ理解しないまま回答を得たことで分かった気になった状態で突っ走っているだけ」なのは明白です。問題が山積みであるのはご自身でも分かっているはずです。「主に」などとはぐらかさずに”自身が分かっている範囲と分かっていない範囲を明確にして”、もう一度きちんと「質問するときのヒント」を読み直して、質問テンプレートを利用して、質問を再編してください。
m.ts10806

2018/06/19 01:36

まさか、ですが、全部同じファイルに記述してないですよね?通常、クラスは独自のファイルに定義されるもののはずですが。
guest

回答3

0

System.out.println("たたかう");
System.out.println(e.getEnemyname()+"に10のダメージを与えた");
if(e.getEnemyHP() <= 0){
break;
}

と、あるので、10ダメージ分を減らせばよいです。

System.out.println("たたかう");
System.out.println(e.getEnemyname()+"に10のダメージを与えた");
e.setEnemyHP( e.getEnemyHP() - 10 );
if(e.getEnemyHP() <= 0){
break;
}

ということでいいのかな・・・

投稿2018/06/19 01:52

momon-ga

総合スコア4820

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

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

0

java

1public class Main { 2 public static void main(String[] args) throws NumberFormatException, IOException { 3 //Braverのインスタンス 4 Braver b = new Braver(); 5 //Enemyのインスタンス 6 Enemy e = new Enemy(); 7 //BraverのBraverameに"Braver"をset 8 b.setName("Braver"); 9 //EnemyのEnemynameに"Enemy"をset 10 e.setEnemyname("Enemy"); 11 //"Braver"のHPを100に設定 12 b.setHP(100); 13 //"Enemy"のHPを100に設定 14 e.setEnemyHP(100); 15 //取ってきた値を変数化 16 int enemyhp = e.getEnemyHP(); 17 int braverhp = b.getHP(); 18 //取ってきた名前を変数化 19 String bravername = b.getName(); 20 String enemyname = e.getEnemyname(); 21 22 System.out.println(enemyname+"に遭遇しました。"); 23 //どちらかのHPが0より大きい時ループ 24 loop1: 25 while(enemyhp > 0 && braverhp > 0){ 26 //"Enemy"の攻撃設定ループ 27 for(int i=0; i<2; i++){ 28 try { 29 System.out.println(bravername+"の行動1:たたかう 2:まほう 3:にげる"); 30 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 31 //読み込んだ文字を数値に変換してint numに格納 32 int num = Integer.parseInt(br.readLine()); 33 //switch文 34 switch(num){ 35 //numが1の場合 "Enemy"のHPを10減らす 36 case 1: 37 System.out.println("たたかう"); 38 System.out.println(enemyname+"に10のダメージを与えた。"); 39 enemyhp = enemyhp - 10; 40 System.out.println(enemyname+"のHP"+enemyhp); 41 break; 42 //numが2の場合"EnemyのHPを20減らす" 43 case 2: 44 System.out.println(("まほう")); 45 System.out.println(enemyname+"に20のダメージを与えた。"); 46 enemyhp = enemyhp - 20; 47 System.out.println(enemyname+"のHP"+enemyhp); 48 break; 49 //numが3の場合ループを抜ける 50 case 3: 51 System.out.println(("にげる")); 52 System.out.println(bravername+"は逃げ出した。"); 53 break; 54 } 55 if (num == 3){ 56 break loop1; 57 } 58 //"Enemy"のHPが0以下の時ループを抜ける 59 else if(enemyhp <= 0){ 60 System.out.println(bravername+"は戦闘に勝利した。"); 61 break; 62 } 63 //"敵の行動" 64 System.out.println(enemyname+"の行動"); 65 //iが0の時何もしない 66 if(i == 0){ 67 System.out.println("何もしなかった"); 68 } 69 //iが1の時"Braver"に攻撃する 70 if(i ==1){ 71 System.out.println(enemyname+"の攻撃。"); 72 System.out.println(bravername+"に25のダメージ。"); 73 braverhp = braverhp - 25; 74 System.out.println(bravername+"のHP"+braverhp); 75 if(braverhp <= 0){ 76 System.out.println(bravername+"は戦闘に敗北した。"); 77 break; 78 } 79 break; 80 81 82 } 83 84 } 85 86 catch (Exception e1) { 87 e1.printStackTrace(); 88 } 89 } 90 } 91 } 92} 93 94public class Enemy { 95 int enemyHP; 96 String enemyname; 97 public int getEnemyHP() { 98 return enemyHP; 99 } 100 public void setEnemyHP(int enemyHP) { 101 this.enemyHP = enemyHP; 102 } 103 public String getEnemyname() { 104 return enemyname; 105 } 106 public void setEnemyname(String enemyname) { 107 this.enemyname = enemyname; 108 } 109 110} 111public class Braver { 112 int HP; 113 String name; 114 public int getHP() { 115 return HP; 116 } 117 public void setHP(int hP) { 118 HP = hP; 119 } 120 public String getName() { 121 return name; 122 } 123 public void setName(String name) { 124 this.name = name; 125 } 126 127 128} 129

投稿2018/06/19 02:46

tvivo

総合スコア16

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

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

m.ts10806

2018/06/19 02:49

たった20分そこらで理解できたのでしょうか(ごめんなさい。信じられません) 結果がこのコードなら私の回答がベストアンサーに選ばれる意味が分かりません。 私のコードも自分が把握しているだけで1箇所は挙動がおかしいところがありますし。 下記、読まれましたか? > ざっと作ってざっと確認しただけなのでどこかおかしいところあるかもしれませんが、冒頭に書いたとおり解説はしませんので自身で修正してください。それも勉強になるでしょう。 これで動いたからって分かった気にならないように気をつけてください。 本当に全て理解して自分でヒント無しで組めるようになってから「解決済み」としていただきたいのが本音です。
m.ts10806

2018/06/19 02:55

何のためにクラス作ってget,setしているのかこれだと全く意味がないです。 オブジェクト指向必要ないですよ。ローカル変数に持ってしまうんだったら。 理解できてないなら解決済みにしないでください。
guest

0

ベストアンサー

※あくまで興味本位で作ったものです。

なのでコードに対して解説はしません。(もともと丸投げ質問なので)

コードを見て気になったこと。

  • HPとNameしか持ってないなら個別クラスは用意しなくて良い。大きくなったら別途親クラスもって継承させるとかになるんじゃないかな。
  • 「ダメージを与えた」という文言だけで実際にHP減らしてないから延々と終わらない
  • breakはswitch抜けるだけでは?
  • whileの終了条件はどっちかのHPが0以下になったときだけ?「逃げ出した」じゃ終わらないの?
  • 要件としてはBraverは先行で且つ2回連続行動できるということでしょうか。1回行動だけだと毎回魔法使ってもEnemyには勝てない。
  • 残HP表示ないと次の行動考えられないのでは。

下記は興味本位で作っただけのコードです。
ざっと作ってざっと確認しただけなのでどこかおかしいところあるかもしれませんが、冒頭に書いたとおり解説はしませんので自身で修正してください。それも勉強になるでしょう。
これで動いたからって分かった気にならないように気をつけてください。
本当に全て理解して自分でヒント無しで組めるようになってから「解決済み」としていただきたいのが本音です。

Main.java

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4 5public class Main { 6 public static void main(String[] args) throws IOException { 7 Character Braver = new Character(100, "Braver"); 8 Character Enemy = new Character(100, "Enemy"); 9 10 System.out.println("敵に遭遇しました。"); 11 12 boolean fin = false; //終了フラグ 13 while (!fin) { 14 for (int i = 0; i < 2; i++) { 15 System.out.println(Braver.getName() + "の行動1:たたかう 2:まほう 3:にげる"); 16 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 17 int num = Integer.parseInt(br.readLine()); 18 switch (num) { 19 case 1: 20 System.out.println("たたかう"); 21 System.out.println(Enemy.getName() + "に10のダメージを与えた"); 22 Enemy.setHP((Enemy.getHP() - 10)); 23 if (Enemy.getHP() <= 0) { 24 fin = true; 25 } 26 break; 27 case 2: 28 System.out.println("魔法"); 29 System.out.println(Enemy.getName() + "に20のダメージを与えた"); 30 Enemy.setHP((Enemy.getHP() - 20)); 31 if (Enemy.getHP() <= 0) { 32 fin = true; 33 } 34 break; 35 case 3: 36 System.out.println("にげる"); 37 System.out.println(Braver.getName() + "は逃げ出した"); 38 return; 39 default: 40 System.out.println(Braver.getName() + "は何もしなかった"); 41 } 42 nowHp(Braver,Enemy); 43 } 44 45 if (!fin) { 46 System.out.println(Enemy.getName() + "の行動"); 47 System.out.println(Enemy.getName() + "の攻撃"); 48 49 System.out.println(Braver.getName() + "に25のダメージ"); 50 Braver.setHP((Braver.getHP() - 25)); 51 nowHp(Braver,Enemy); 52 } 53 if (Braver.getHP() <= 0) { 54 fin = true; 55 } 56 } 57 if (Enemy.getHP() <= 0) { 58 System.out.println(Enemy.getName() + "をやっつけた"); 59 } 60 if (Braver.getHP() <= 0) { 61 System.out.println(Braver.getName() + "は倒された"); 62 } 63 } 64 65 static void nowHp(Character Braver,Character Enemy) { 66 67 System.out.println(Braver.getName() +" 残HP:"+Braver.getHP()); 68 System.out.println(Enemy.getName() + "残HP:"+Enemy.getHP()); 69 70 } 71}

Character.java

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}

投稿2018/06/19 02:25

編集2018/06/19 02:30
m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問