• ベストアンサー

例外処理

import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int k=0,m=0,h=0,z=0; while(true){ System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); if(a == 0){ break; } z++; switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("あなたの勝ちです。"); k++; } else if(c== -1){ System.out.println("あなたの勝ちです。"); k++; } else if(c==0){ System.out.println("あいこです。"); h++; } else if(c==1){ System.out.println("コンピュータの勝ちです。"); m++; } else { System.out.println("コンピュータの勝ちです。"); m++; } } } System.out.println("じゃんけん終了。"); System.out.println("あなたは"+z+"試合中、"+k+"勝"+m+"敗"+h+"分けです"); } } このようにじゃんけんのプログラムを作りました。 しかし0~3以外の数字が入力されても、じゃんけんの勝敗を勝手に判定してしまいます・・・ try文でやってみたのですがいまいちうまくいきませんでした。 0~3を入力したら入力エラーと表示して、ふたたびユーザーの手を聞くようにしたいです。 どうすればよいかアドバイスお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#47975
noname#47975
回答No.4

とりあえず、これで質問者さんの望むとおりの動作はすると思います。 ********************ソースファイル****************************** import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int k=0,m=0,h=0,z=0; /***********************修正部分*******************************/ String str; int ec; while(true){ ec = 0; do{ if(ec > 0 ){ System.out.println("入力値が不正です。再度入力し直して下さい"); } System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)?\n"); str = br.readLine(); ec++; }while(!(str.equals("1") || str.equals("2") || str.equals("3") || str.equals("0"))); /*************************************************************/ int a = Integer.parseInt(str); if(a == 0){ break; } z++; switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("あなたの勝ちです。"); k++; } else if(c== -1){ System.out.println("あなたの勝ちです。"); k++; } else if(c==0){ System.out.println("あいこです。"); h++; } else if(c==1){ System.out.println("コンピュータの勝ちです。"); m++; } else { System.out.println("コンピュータの勝ちです。"); m++; } } } System.out.println("じゃんけん終了。"); System.out.println("あなたは"+z+"試合中、"+k+"勝"+m+"敗"+h+"分けです"); } }

noraneko66
質問者

お礼

ご回答ありがとうございます。 コンパイルしたところ私の思っていたとおりに動いてくれて、とても感動しました。 こんな方法があったなんて・・・まだまだ勉強不足ですね^^; 本当にありがとうございました。

その他の回答 (3)

回答No.3

横から失礼。 基本的に、1文字だけの変数が悪いんじゃなくて、使い方だと思われます。同じ変数でもループカウンターなどの場合でしたら、あくまでそのブロック内だけで処理が完結する事を条件として、iでもjでもいいと思います。 ただ、質問者さんの場合は、インクリメントなどのロジックの部分だけではなくて、標準出力の所でも同じように使用されていたので、ちょっと見づらいんじゃないかな~、というわけです。(嫌味ったらしく聞こえるようでしたら、ごめんなさい。)

noraneko66
質問者

お礼

いえいえ、おっしゃるとおりです。 プログラムを作る以上誰から見てもわかるような変数がいいにきまってますし、これからは意識して変数をつけたいとおもいます。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

私も所詮素人なのです。 メソッドの分け方も「長くなりそうなら分ける」という程度。 変数名も最初に「これは試合数を格納する変数にしよう → gameCount」という程度。 変数名については、巷の入門書でも 1文字のいい加減な変数名が使用されていたりするので、その悪影響か?

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

0 ~ 3 以外の場合には continue で while ループの先頭に戻ればよいだけ? そして、コンピュータの出し手を決める箇所や、勝敗を判定する箇所をメソッドにして切り出すのが正常なプログラマの作法だと思う。 また、k l m c などの「意味の取れない」変数名も止めましょう。

noraneko66
質問者

補足

やっぱり、自分の手、コンピュータの手、勝敗の判定をメソッドで分けたほうがいいのですか・・・ まだ習いたてでメソッドをどのようにしたらわからないんですが、調べてみます。 変数なんですがまだ試作段階だったので適当にいれてました。 ややこしくてもうしわけないです。

関連するQ&A