じゃんけんゲームを作ってみよう3
プログラム作成は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();
}
}
実際に組み込む時には、判定結果も数値変数に格納するようにしますが
今回は分かりやすいように文字列出力にしています。
続編は、また明日(の予定)。
ご意見、ご質問、リクエスト等、ございましたら、お気軽に
→メールフォームからご連絡ください。
この記事へのコメントはこちら