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

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

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

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

Q&A

解決済

2回答

3120閲覧

出力が重複するバグの原因がわかりません。 java超入門

Nerd_run.

総合スコア60

Java

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

0グッド

0クリップ

投稿2018/06/11 22:40

編集2018/06/11 23:19

おはようございます。

現在youtubeのjava超入門という動画をみて勉強しているのですが、出力が重複するバグが起こり、何度見直しても解消されません。

java

1import java.util.*; 2import java.io.*; 3 4public class part18 { 5 6 static String name = "ほげさん"; 7 static int lv = 30; 8 static int hp = 30; 9 static int gold = 10000; 10 11 public static void main( String[] args ) throws IOException { 12 13 joshou(); 14 for( ; hp > 0; ){ 15 command(); 16 } 17 } 18 19 static void joshou(){ //序章を出力 20 21 System.out.println( "魔王が世界を滅ぼそうとしています。" ); 22 } 23 24 static void status(){ //ステータスを出力 25 26 System.out.println("--------------------------------------"); 27 System.out.println( name + " Lv :" + lv + " HP :" + hp + " Gold :" + gold + "G" ); 28 System.out.println("--------------------------------------"); 29 } 30 31 static void command() throws IOException { //コマンドを表示 32 33 status(); 34 35 System.out.println( " 1, 魔王を倒しに行く。" ); 36 System.out.println( " 2, 修行する。" ); 37 System.out.println( " 3, 宿屋に泊まる" ); 38 System.out.println("--------------------------------------"); 39 40 cmd(); 41 } 42 43 static void cmd() throws IOException { //コマンド処理設定 44 45 int c = System.in.read(); 46 47 switch( c ) { 48 49 case ( '1' ) : 50 51 if( lv < 40 ){ 52 System.out.println( "魔王に敗れた。" ); 53 gameover(); 54 }else{ 55 gameclear(); 56 } 57 58 break; 59 60 case ( '2' ) : 61 62 Random rnd = new Random(); 63 int monster = rnd.nextInt( 5 )+ 1; 64 int damage = rnd.nextInt( 5 ); 65 int ex = rnd.nextInt( 5 ); 66 67 System.out.println( "敵が " + monster + "匹 現れた。" ); 68 69 hp -= damage; 70 71 if( hp < 0 ){ 72 hp = 0; 73 } 74 75 if( hp > 0 ){ 76 System.out.println( name + "は " + damage + " のダメージを受けた。" ); 77 System.out.println( "敵を倒した。" + name + "は経験値を " + ex + " 獲得した。" ); 78 lv += ex; 79 }else{ 80 System.out.println( name + "は" + damage + "のダメージを受けた。" ); 81 System.out.println( "HPが0になった。" ); 82 gameover(); 83 } 84 85 System.out.println(); //改行 86 break; 87 88 case ( '3' ) : 89 90 System.out.println( "HPが回復した。" ); 91 hp = hp; 92 93 break; 94 } 95 } 96 97 static void gameover(){ //GAME OVER画面を出力 98 99 System.out.println( "GAME OVER" ); 100 } 101 102 static void gameclear(){ //GAME CLEAR画面を出力 103 104 System.out.println( "魔王を倒した!" ); 105 System.out.println( "GAME CLEAR" ); 106 } 107}

こちらのソースなのですが、出力が下記のように2度目の入力の時点でステータスとコマンド選択の出力が重複して表示されてしまいます。

魔王が世界を滅ぼそうとしています。 -------------------------------------- ほげさん Lv :30 HP :30 Gold :10000G -------------------------------------- 1, 魔王を倒しに行く。 2, 修行する。 3, 宿屋に泊まる -------------------------------------- 2 敵が 2匹現れた。 ほげさんは0のダメージを受けた。 敵を倒した。ほげさんは、0の経験値を手に入れた。 -------------------------------------- ほげさん Lv :30 HP :30 Gold :10000G -------------------------------------- 1, 魔王を倒しに行く。 2, 修行する。 3, 宿屋に泊まる -------------------------------------- -------------------------------------- ほげさん Lv :30 HP :30 Gold :10000G -------------------------------------- 1, 魔王を倒しに行く。 2, 修行する。 3, 宿屋に泊まる --------------------------------------

HPが0以上の場合、
ステータス表示
コマンド選択表示
入力受け取り
という流れをループさせたいのですが、分かる方がいましたら教えていただけると幸いでございます。

よろしくお願い致します。

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

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

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

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

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

m.ts10806

2018/06/11 23:19

バグ、とは言いますが、プログラムは指示した通りにしか動かないのでご自身がそのように組んでしまっていることは認識しておいた方が今後のためになると思います。
Nerd_run.

2018/06/11 23:26

指示をミスしている箇所がわからないので質問しています。
dit.

2018/06/11 23:32

「希望通りに動かない」ことを「バグ」と表現するべきではない という指摘かと思います。
Nerd_run.

2018/06/11 23:48

ではなんと表現するべきなのでしょう?
m.ts10806

2018/06/11 23:50

デバッグ実行で確かめるくらいはできるようになりましょう。質問して回答待つより早いこともよくあります。
m.ts10806

2018/06/11 23:52

今回の場合は「出力が重複してしまう」だけで良いかと。いずれにしてもそのバグをおこしてしまってるのは自身に他ならないわけです。
Nerd_run.

2018/06/12 00:08

System.in.read();の機能をよくわからず使っていた為に起こり、気づけなかったので、そういうところを指摘しているのでしょうか?
Nerd_run.

2018/06/12 00:08

意図しない動きをバグと言わずなんと呼ぶべきなのかはわかりませんが。
dit.

2018/06/12 01:33

私の「表現するべきではない」という言葉がいけませんでした。開発者の意図しない動作は確かにバグと呼べますね。バグという言葉に敏感になりすぎていたようです。(いつからか言われている「プログラムは思った通りに動かない、書いた通りに動く」という言葉を聞いてから、「仕様通りではないが記述どおりの動作」をなるべくバグと呼びたくなかったのですが、その考えを押し付けるような形になってしまいました。申し訳ないです。)
Nerd_run.

2018/06/12 01:58

とんでもないです。 元はと言えば私の勉強不足です。 私にとってはバグでも、開発者の力量によっては即座に解消でき、バグと認識しないのかもしれません。ご指摘ありがとうございます。 日本語は難しいですね。
guest

回答2

0

こんにちは

まず、ソースコードを見て気になったところを言いたいと思います。

1.Main関数にてfor( ; hp > 0; )とありますがなんとなく見づらいのでwhile(hp > 0)にしました。

2.関数command()の中にstatus()がありますが、Main関数にて

java

1while(hp > 0){ 2 status(); 3 command(); 4}

としたとした方がいい気がします。

3.関数cmdのcase '3'のところにhp = hpにしていますが、これではhpは回復しません。
.static final int FIRST_HP = 30;などを宣言してhp = FIRST_HPにすべきです。
また、switch文なので一応defaultを書きましょう。

4.gameoverまたはgameclearしてもプルグラムが終了しないので
.static boolean gameover;
.static boolean gameclear;で判定するようにしました。

これ以外で変更したところ

入力をScannerにしました。これで解決するはずです。

以上です。ソースコードを載せておきます。

java

1import java.util.*; 2 3 4public class part18 { 5 6 static String name = "ほげさん"; 7 static int lv = 30; 8 static final int FIRST_HP = 30; 9 static int hp = 30; 10 static int gold = 10000; 11 static boolean gameover; 12 static boolean gameclear; 13 14 public static void main( String[] args ){ 15 16 joshou(); 17 18 while(hp > 0){ 19 status(); 20 command(); 21 if(gameover || gameclear){ 22 break; 23 } 24 } 25 } 26 27 static void joshou(){ //序章を出力 28 29 System.out.println( "魔王が世界を滅ぼそうとしています。" ); 30 } 31 32 static void status(){ //ステータスを出力 33 34 System.out.println("--------------------------------------"); 35 System.out.println( name + " Lv :" + lv + " HP :" + hp + " Gold :" + gold + "G" ); 36 System.out.println("--------------------------------------"); 37 } 38 39 static void command(){ //コマンドを表示 40 41 System.out.println( " 1, 魔王を倒しに行く。" ); 42 System.out.println( " 2, 修行する。" ); 43 System.out.println( " 3, 宿屋に泊まる" ); 44 System.out.println("--------------------------------------"); 45 46 if(hp < 0){ 47 hp = 0; 48 System.out.println( "HPが"+ hp + "になった。" ); 49 gameover(); 50 } 51 52 cmd(); 53 } 54 55 static void cmd(){ //コマンド処理設定 56 57 Scanner sc = new Scanner(System.in); 58 int c = sc.nextInt(); 59 60 switch(c) { 61 62 case 1 : 63 64 if( lv < 40 ){ 65 System.out.println( "魔王に敗れた。" ); 66 gameover(); 67 } 68 else{ 69 gameclear(); 70 } 71 72 break; 73 74 case 2 : 75 76 Random rnd = new Random(); 77 int monster = rnd.nextInt( 5 ) + 1; 78 int damage = rnd.nextInt( 5 ); 79 int ex = rnd.nextInt( 5 ); 80 81 System.out.println( "敵が " + monster + "匹現れた。" ); 82 83 System.out.println( name + "は" + damage + "のダメージを受けた。" ); 84 hp -= damage; 85 86 System.out.println( "敵を倒した。" + name + "は、" + ex + "の経験値を手に入れた。" ); 87 lv += ex; 88 89 System.out.println(); //改行 90 break; 91 92 case 3 : 93 94 System.out.println( "HPが回復した。" ); 95 hp = hp; 96 break; 97 default: 98 break; 99 100 } 101 } 102 103 static void gameover(){ //GAME OVER画面を出力 104 105 System.out.println( "GAME OVER" ); 106 gameover = true; 107 } 108 109 static void gameclear(){ //GAME CLEAR画面を出力 110 111 System.out.println( "魔王を倒した!" ); 112 System.out.println( "GAME CLEAR" ); 113 gameclear = true; 114 } 115}

投稿2018/06/11 23:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Nerd_run.

2018/06/12 00:01

回答ありがとうございます。 自分で見ていても現状つっこみどころの多い処理ばかりで、Starsさんのご指摘も参考に動画を見ながら直していきます。 ありがとうございます。
guest

0

ベストアンサー

System.in.read() で一文字づつ読み出してますが、2を読んだあと改行が読まれるので、2回繰り返してるように見えるのでしょう。
改行が入力されたときは無視する、とかする必要があります

投稿2018/06/11 23:25

y_waiwai

総合スコア87747

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

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

Nerd_run.

2018/06/11 23:50

回答ありがとうございます。 解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問