じゃんけんの勝敗判定
見る変数が 2 つになると、条件が急に難しくなる
if と else は 2 つにしか分けられません。じゃんけんの結果は勝ち・負け・引き分けの 3 つあり、しかも「勝ち」は自分の手と相手の手の 組み合わせ で決まります。片方の値だけを見ても答えが出ない、というのがここまでとの違いです。
こういうときは、いちばん簡単に片付く条件から順に潰していきます。
先に片付く条件から return する
2 つの値を比べて 3 通りの答えを返す形を、数の大小で見てみます。
Java
public class Compare {
public static String judge(int a, int b) {
if (a == b) {
return "same";
}
if (a > b) {
return "big";
}
return "small";
}
}else が 1 つも出てきません。return に届いた時点でメソッドが終わるので、その下の行は「まだ答えが決まっていない場合」だけが通ります。だから if を並べるだけで、上から順に絞り込めます。この書き方を早期 return と呼びます。
先頭に置くのは、1 行で書けて、残りを大きく減らす条件 です。この例なら a == b がそれで、これを片付けてしまえば残りは 2 通りしかありません。最後の return は「ここまで全部外れた場合」の受け皿になるので、条件を書く必要がありません。
「両方そろって」と「どちらかでよい」を取り違える
組み合わせで決まる条件は && で書きます。&& は左右の両方が true のときだけ true になります。
Java
if (day == 6 && weather == 0) {
return "洗濯日和";
}ここを 1 文字変えるだけで、条件はまったく別のものに化けます。
Java
if (day == 6 || weather == 0) { // 土曜なら天気は何でもよい文法としては正しいのでコンパイルは通り、エラーも出ません。テストの一部だけが落ちて、原因を探し回ることになります。
条件を書いたら「この 2 つは同時に成り立つ必要があるのか、片方でよいのか」と声に出して読み直してください。それだけで取り違えのほとんどは防げます。
戻り値の文字列の綴り違いも地味に多い失敗です。
"lose"を"loose"と書くと、判定が完璧でもテストは落ちます。
やってみよう
janken(int me, int opponent) を完成させてください。手はグーが 0、チョキが 1、パーが 2 で、返すのは "win" "lose" "draw" の 3 つです。
- 紙に表を書いて、自分が勝つ組み合わせを全部書き出す
- 1 行で片付く条件から先に
returnする - 勝ちの組み合わせを
&&で書き、どれにも当たらなかったときの答えを最後に置く - 実行して 5 件のテストを通す
最初に書き出す表は 3 行で足ります。ここが 2 行で止まっていると、その組み合わせだけ結果が反転し、しかもテストは他が通るので気づきにくくなります。書き始める前に、行数を数えてください。
要件
- クラス名は
Solution、メソッド名はjanken、引数はint me, int opponentの 2 つにすること - 戻り値の型は
Stringで、勝ちなら"win"、負けなら"lose"、引き分けなら"draw"を返すこと - ルールは グー (
0) > チョキ (1) > パー (2) > グー (0) の三すくみで、同じ手なら引き分け
入出力例
janken(0, 1) → "win"
janken(1, 2) → "win"
janken(2, 0) → "win"
janken(0, 2) → "lose"
janken(1, 0) → "lose"
janken(2, 1) → "lose"
janken(0, 0) → "draw"
janken(1, 1) → "draw"