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使いになれる日は、いつだっ!?
コメント 0