SSブログ

Java:じゃんけんゲーム完成 [勉強]

職業訓練の講師から教科書(上)演習問題の最終問題「すごろく」を終えた私に、「じゃ、じゃんけんゲームでも作ってください」と軽く言われたのがコトの始まり。
で、講師が私に出した条件が、以下の通りです。

「プレイヤーとCPUでじゃんけんを行う」
勝ち負けを判定するメソッド
CPUの手を決めるメソッド(ランダム)
プレイヤーの手を決めるメソッド

最低3つのメソッドを作る。
クラスの分け方、フィールドの数は自由

プログラムの流れ
1.プレイヤーの名前を入力
2.プレイヤーの手を入力
3.プレイヤーの手とCPUの手を表示「○○:パー CPU:グー」
4.どちらが勝ったかを表示「○○の勝ちです or CPUの勝ちです」
5.2~4を10回繰り返す
6.10回繰り返したら「○勝□敗 勝率は△%」と表示
 

これを昨日(08/16)に言われて、授業中みんなより先に進んで、手があいた時にシコシコとソースを書いていました。でも・・・最初にできたソースは、じゃんけんの勝敗の結果をすべて「引き分けです」と表示して、正しくじゃんけんの勝敗判定ができていませんでした。

で、今日(08/17)再挑戦して、まずはすべての処理をmainメソッドに入れて、正常に動作することを確認して、一つずつ機能をメソッド化していきました。そして・・・5時限目になって、ようやく完成。

 

では・・・以下が、私なりに考えた「じゃんけん」ソースです。

/**
 *演習課題「じゃんけん」
 *「勝敗判定」、「CPUの手を決める(ランダム)」、「プレイヤーの手を決める」
 *上記3つの処理をメソッド化する。
 *(1)プレイヤー名を入力後、(2)プレイヤーの手を決定、(3)CPUの手を決定、(4)勝敗判定、
 *(5)判定結果表示、(2)~(5)を10回繰り返し、最後に勝敗数および勝率を出力する。
 */
import java.io.*;

public class Janken {
 public static void main(String[] args) {
 int maxGames = 10;  //ゲーム回数
 int gameCnt = 0;  //ゲーム回数カウンタ

 Player player = new Player("", 0, "", 0); //プレイヤー初期化
 Player cpu = new Player("CPU", 0, "", 0); //CPU初期化
 
 BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in));
 try {
  System.out.print("プレイヤーの名前を入力してください。 :");
  player.name = kbd.readLine();
   while (gameCnt < maxGames) {
    //プレイヤーの出す手を取得
    switch (getPlayerHand()) {
     case 0:
      player.hand = 0;
      player.sHand = "グー";
      break;
     case 1:
      player.hand = 1;
      player.sHand = "チョキ";
      break;
     case 2:
      player.hand = 2;
      player.sHand = "パー";
      break;
    }
    //CPUの出す手を取得
    switch (getCpuHand()) {
     case 0:
      cpu.hand = 0;
      cpu.sHand = "グー";
      break;
     case 1:
      cpu.hand = 1;
      cpu.sHand = "チョキ";
      break;
     case 2:
      cpu.hand = 2;
      cpu.sHand = "パー";
      break;
    }

    //互いが出した手を表示
    System.out.println(player.name + ":" + player.sHand + " " + cpu.name + ":" + cpu.sHand);
    
    //勝ち負け判定呼び出し および結果表示
    switch (winOrLose(player.hand, cpu.hand)) {
     case 1:
      System.out.println(player.name + "の勝ちです");
      player.winCnt++;
      break;
     case 2:
      System.out.println(cpu.name + "の勝ちです");
      cpu.winCnt++;
      break;
     case 3:
      System.out.println("引き分けです");
      break;
    }

    System.out.println();
    gameCnt++;
    
   }
   
   System.out.println();
   System.out.println(player.winCnt + "勝" + cpu.winCnt + "負" + " " + "勝率は" + (int)(player.winCnt*100.0 / maxGames) + "%");
  } catch (IOException e) {
   System.out.println(e);
  } catch (NumberFormatException e) {
   System.out.println("正しい数値を入力してください。");
  }
 }
 /**
  *じゃんけん勝敗判定メソッド
  *0=グー、1=チョキ、2=パー
  *x=player y=CPU
  */
 public static int winOrLose(int x, int y) {
  int win = 0;
  if ((x == 0 && y == 1)||(x == 1 && y ==2)||(x == 2 && y ==0)) {
   win++;
   return win;
  } else if ((x == 0 && y == 2)||(x == 1 && y == 0)||(x == 2 && y ==1)) {
   win +=2;
   return win;
  } else if (x == y) {
   win +=3;
   return win;
  }
  return win;
 }

 /**
  *CPUのじゃんけんの手を決めるメソッド
  *ランダムで0~2(グー、チョキ、パー)を取得
  */
 public static int getCpuHand() {
  return (int)(Math.random() * 3);
 }
 /**
  *プレイヤーのじゃんけんの手を決めるメソッド
  *入力された値0~2(グー、チョキ、パー)を取得
  */
 public static int getPlayerHand() {
  int playerHand = 0;
  BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in));
  System.out.println("出す手を決めてください。");
  try {
   System.out.print("0:グー 1:チョキ 2:パー :");
   switch (Integer.parseInt(kbd.readLine())){
    case 0:
     playerHand = 0;
     break;
    case 1:
     playerHand = 1;
     break;
    case 2:
     playerHand = 2;
     break;
    default:
     System.out.println("0~2で出す手を指定してください");
     System.exit(0);
     break;
   }
  } catch (IOException e) {
   System.out.println(e);
   System.exit(0);
  } catch (NumberFormatException e) {
   System.out.println("正しい数値を入力してください");
   System.exit(0);
  }
  return playerHand;
 }
}

class Player {
 String name;
 int hand;
 String sHand;
 int winCnt;
 
 //コンストラクタ
 public Player(String name, int hand, String sHand, int winCnt) {
  this.name = name;
  this.hand = hand;
  this.sHand = sHand;
  this.winCnt = winCnt;
 }
}
 

クラスやコンストラクタを使ったりして、少しJavaっぽくなりましたかね??
maxGamesの値を変更すれば、じゃんけんの回数を変更できますし、後々のことも考えて書いたので、ちょっとムダに長いかもしれませんが・・・・・・。
講師の回答ソースと見比べてみたんですけどね・・・。
私の上記ソースは、講師の回答ソースの倍の長さでした。(^-^;

ま、ソースの長さとか関係ないさー。
プレイヤー数が増えた場合は・・・考慮してなかったな。ま、いいか。一応課題はクリアってことで。
次なる課題を講師に求めようかと思いましたが、ちょっと面倒そうだったので、教科書(下)の授業をしていることもあり、教科書(下)演習問題をもらいました。
教科書(上)演習問題と同様、教科書(下)各章の復習のための問題です。

明日(08/18)から、少しずつ暇をみつけながら解いていこうかなぁ~って感じです。
しかし、難しい課題でも、思い通りに動くようになった時の嬉しさというか、達成感というか、いまはJavaが楽しくて楽しくて、しかたがないくらいです。

Java使いの弟子からJava使いになれる日は、いつだっ!?


 

 


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:資格・学び

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。