じゃんけんゲームを作ってみよう3

   2012/06/28

プログラム作成は1発作って終わりという事は、まずありません。
一旦動いても、使っているうちに不具合が見つかったり
不具合と言わないまでも直したくなるものです。

毎度、管理人イガジーです。

作り終えたソースをあらためて眺めると、もっとすっきりと
書けないだろうか?と自問すると、スキルアップできます。

という訳で、今日はじゃんけんの勝敗判定を考えてみます。
手の組み合わせとしては、相手(PC)が3通り、
人(プレーヤ)も3通りですから、3×3=9パターンあり、
その勝敗判定は次のような結果になって欲しい訳です。

PC=グー(0)   You=グー(0)  あいこ
PC=グー(0)   You=チョキ(1) PCの勝ち
PC=グー(0)   You=パー(2)  あなたの勝ち
PC=チョキ(1)  You=グー(0)  あなたの勝ち
PC=チョキ(1)  You=チョキ(1) あいこ
PC=チョキ(1)  You=パー(2)  PCの勝ち
PC=パー(2)   You=グー(0)  PCの勝ち
PC=パー(2)   You=チョキ(1) あなたの勝ち
PC=パー(2)   You=パー(2)  あいこ

9パターンを全て書き下すのもひとつの方法ですが、
最初に「あいこ(引き分け)」の判定をすれば、
判定数を6パターンに減らすことができます。

String judge1(int pc, int you){
	// pc/you: 0=グー, 1=チョキ, 2=パー
	String r="あいこ";
	if (pc!=you) {
		switch (pc) {
		case 0: // PCがグー
			if (you==1) r="PCの勝ち";
			else if (you==2) r="あなたの勝ち";
			break;
		case 1: // PCがチョキ
			if (you==2) r="PCの勝ち";
			else if (you==0) r="あなたの勝ち";
			break;
		case 2: // PCがパー
			if (you==0) r="PCの勝ち";
			else if (you==1) r="あなたの勝ち";
			break;
		}
	}
	return r;
}

まずは、上記のようなコードでも動かすことが大切です。
もっとスマートにしようと考えてばかりいて、何も書かないよりも
まずは、思いついた方法で書いてみれば良いのです。

正しく動くことを確認したら、あらためてコードを見直します。
規則性がありそうですよね。
人の手が、PCの手+1 だったら、「PCの勝ち」ですね。
人の手が、PCの手-2 の時も、「PCの勝ち」です。
引き分けは除外してますから、「PCの勝ち」でなければ
「人(あなた)の勝ち」になります。

という訳で、判定は次のように簡略化できますね。

String judge2(int pc, int you){
	String r="あいこ";
	if (pc!=you) {
		if ((you==pc+1)||(you==pc-2))  r="PCの勝ち";
		else r="あなたの勝ち";
	}
	return r;
}

正しく動くか、全パターンを試してみましょう。

public class Janken0 {

	Janken0(){
		String [] te={"グー(0) ","チョキ(1)","パー(2) "};
		for (int j=0;j<3;++j){
			for (int i=0;i<3;++i){
//				System.out.printf("PC=%s  You=%s %s\n", te[j],te[i],judge1(j,i));
				System.out.printf("PC=%s  You=%s %s\n", te[j],te[i],judge2(j,i));
			}
		}
	}
	String judge1(int pc, int you){
		// pc/you: 0=グー, 1=チョキ, 2=パー
		String r="あいこ";
		if (pc!=you) {
			switch (pc) {
			case 0: // PCがグー
				if (you==1) r="PCの勝ち";
				else if (you==2) r="あなたの勝ち";
				break;
			case 1: // PCがチョキ
				if (you==2) r="PCの勝ち";
				else if (you==0) r="あなたの勝ち";
				break;
			case 2: // PCがパー
				if (you==0) r="PCの勝ち";
				else if (you==1) r="あなたの勝ち";
				break;
			}
		}
		return r;
	}
	String judge2(int pc, int you){
		String r="あいこ";
		if (pc!=you) {
			if ((you==pc+1)||(you==pc-2))  r="PCの勝ち";
			else r="あなたの勝ち";
		}
		return r;
	}
	public static void main(String[] args) {
		new Janken0();
	}
}

実際に組み込む時には、判定結果も数値変数に格納するようにしますが
今回は分かりやすいように文字列出力にしています。

続編は、また明日(の予定)。

ご意見、ご質問、リクエスト等、ございましたら、お気軽に
メールフォームからご連絡ください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)