ジャンケン

  1. 問題:ジャンケンの手

    1. 問題

      グー、チョキ、パー、を数字の0,1,2で表現します。
      A と B のジャンケンの手を入力し、勝ったほうの名前を表示してください。

    2. ヒント

      グー:0、チョキ:1、パー:2 として、勝ち負けを表にまとめます。勝を1、負けを0、分けを2とし、行に自分の手、列に相手の手を入れます。

       G  C  P
       G  2  1  0
       C  0  2  1
       P  1  0  2

  2. プログラム


    1. キーボード入力

       二人の手は、キーボードから読むことにします。キーボード入力は標準関数では用意がなく、ちょっと厄介です。まず、先頭で入出力用パッケージを読み込みます。
       import java.io.*;
       キーボードは標準入力ですから、System.in から読むことができます。InputStreamReader クラスのインスタンス isr を作成し、isr からさらに、BufferedReader クラスのインスタンス br を作成します。このbr から br.readLine(); により、キーボードからの1行を ca に読み取ります。最後に、ca の文字列を Integer.parseInt(ca); で数字に変換します。

    2. エラー検出

       入出力を行う場合、try-catch によるエラーチェックが必要です。一つは入出力時に起こるエラーで、これは、IOException になります。他は、入力された文字が期待した文字(この場合数字)でないとき NumberFormatException エラーになります。この2種類のエラーをcatch() で検出しています。

    3. 表による勝敗の判定

       ha と hb の数字から、tbl[hb][ha] で勝敗の判定結果を rsl 知ることができます。この結果を、st[rsl] で文字列に変換します。
       判定や結果の文字は、if () else を利用してもプログラムできますが、結構メンドウです。表を利用することで、判断のプログラムが簡単になります。

    4. ソース

      //ジャンケンの勝ち負けの判断
      //表の活用
      
      //入力用パッケージ
      import java.io.*;
      
      public class jyanken 
      {
        public static void main(String[] args)
        {
          int ha,hb,rsl;
          String ca,cb;
      
          int tbl[][] = {{2,1,0},{0,2,1},{1,0,2}};//勝ち負け表
          String st[] = {"勝ち","負け","引き分け"};//結果の文字
      
      //一行入力準備
         InputStreamReader isr = new InputStreamReader(System.in);
         BufferedReader br = new BufferedReader(isr);
         
          try{//エラーチェック
      
          //Aの手を読む
          System.out.print("A 0 1 2:");
          ca=br.readLine();
          ha = Integer.parseInt(ca);//整数に変換
      
          System.out.print("B 0 1 2:");
          cb=br.readLine();
          hb = Integer.parseInt(cb);
      
          rsl= tbl[hb][ha];//表から判断
          System.out.println("Aの " + st[rsl]);//結果の表示
      
        }
      
        catch(IOException e)
         {
          System.out.println("入力エラー");
          e.printStackTrace();
        }
      
        catch(NumberFormatException e)
         { 
           System.out.println("0,1,2 の数字を入力し、Enterキーを押してください");
           e.printStackTrace();
        }
      }
      
      }
      実行結果
      A 0 1 2:2
      B 0 1 2:0
      Aの 勝ち

      エラー処理の例
      A 0 1 2:0
      B 0 1 2:e
      0,1,2 の数字を入力し、Enterキーを押してください
      java.lang.NumberFormatException: For input string: "e"
              at java.lang.NumberFormatException.forInputString(Unknown Source)
              at java.lang.Integer.parseInt(Unknown Source)
              at java.lang.Integer.parseInt(Unknown Source)
              at jyanken.main(jyanken.java:30)

  3. 課題

    1. エラー処理

       このプログラムでは、0,1,2 以外の数字を入力すると異常修了します。その理由を調べ、エラー対策をしてください。