おはようございます。
現在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以上の場合、
ステータス表示
コマンド選択表示
入力受け取り
という流れをループさせたいのですが、分かる方がいましたら教えていただけると幸いでございます。
よろしくお願い致します。
バグ、とは言いますが、プログラムは指示した通りにしか動かないのでご自身がそのように組んでしまっていることは認識しておいた方が今後のためになると思います。
指示をミスしている箇所がわからないので質問しています。
「希望通りに動かない」ことを「バグ」と表現するべきではない という指摘かと思います。
ではなんと表現するべきなのでしょう?
デバッグ実行で確かめるくらいはできるようになりましょう。質問して回答待つより早いこともよくあります。
今回の場合は「出力が重複してしまう」だけで良いかと。いずれにしてもそのバグをおこしてしまってるのは自身に他ならないわけです。
System.in.read();の機能をよくわからず使っていた為に起こり、気づけなかったので、そういうところを指摘しているのでしょうか?
意図しない動きをバグと言わずなんと呼ぶべきなのかはわかりませんが。
私の「表現するべきではない」という言葉がいけませんでした。開発者の意図しない動作は確かにバグと呼べますね。バグという言葉に敏感になりすぎていたようです。(いつからか言われている「プログラムは思った通りに動かない、書いた通りに動く」という言葉を聞いてから、「仕様通りではないが記述どおりの動作」をなるべくバグと呼びたくなかったのですが、その考えを押し付けるような形になってしまいました。申し訳ないです。)
とんでもないです。 元はと言えば私の勉強不足です。 私にとってはバグでも、開発者の力量によっては即座に解消でき、バグと認識しないのかもしれません。ご指摘ありがとうございます。 日本語は難しいですね。
回答2件
あなたの回答
tips
プレビュー