🐾

ジャンケンの勝敗ロジック、こんなのも使えそうだよね、的な今風っぽい書き方

に公開

3を足して余り計算をしたらよい?

プログラムを習い始めた頃って、先ずは簡単なコードを色々と作っていきますよね。カウントのアップダウン、ストップウォッチ、ジャンケン、など。そして、一番初めにつまずくのは、このジャンケンの勝敗判定ロジックなのではないでしょうか?

自分もつまづきました。✊ = 0,✌ = 1,✋ = 2,と数字を割り振っておいて、とりあえず自分と相手の出し手の数字を四則演算してみるのですが、なかなかうまくいきません。自分は趣味でjavascriptをやっているのですが、始めたのが極々最近でして、ヘタレの自分はとりあえず迷わずWEB検索をしてみることにしました(笑)するとこんなのが出てきました。

  1. ✊ = 0,✌ = 1,✋ = 2,と数字を割り振る
  2. a = 自分、b = 相手とする
  3. a - b と、自分のだし手から相手の出し手を引く
  4. -2,-1,0,1,2 と値が出る
  5. (a - b + 3) % 3 で数字を変形
  6. 0 ₌ あいこ、1 ₌ 負け、2 ₌ 勝ち で勝敗判定

3を足して余り計算をしたらよい
数字を割り算や余り計算させて使いやすく変形させるテクニックは、お世話になる頻度が多そうなので、使いこなしたいテクニックではありますね。
とは言っても、こんなこと、ぱっと頭では理解できない、正直すごい(笑)

かといって、ifとelse を使っての総当たり判定をするのも正直タルい。
何か良いものは無いものだろうか?
色々と思案し、WEBを徘徊していたら、なにやら良い感じのものを見つけたので紹介します。

これで決まり? Javascriptの便利な配列メソッド

ジャンケンの勝敗ロジックに使えそうなもの、それはズバリ、arr.at(i) です。
何故 arr.at(i) が使えるのか?解説します。

実は a - b で出てくる数字は、-2,-1,0,1,2 の5種類であることは先述した通りなのですが、この数字のそれぞれの振り分けは、

  • あいこ → 0
  • 負け → 1,-2
  • 勝ち → 2,-1

となっています。
['Draw', 'Loose...', 'Win !'] このような配列を準備し、これに .at(i) を付け加えます。.at(i) の負数によるインデックスは、配列の末尾から先頭に向かっていく参照 になります。

お気づきでしょうか?
.at(i)正数インデックスと負数インデックスが、ジャンケンの勝敗と見事に一致していますね。
これは最早、ジャンケンの勝敗判定ロジックのためのメソッドであると言っても過言ではない(笑)

      // ジャンケン勝敗ロジックサンプル

const jangKen = () => {
  
  const a = Math.floor(Math.random() * 3);
  const b = Math.floor(Math.random() * 3);
  const hands = ['✊','✌','✋'];
  const i = a - b;
  const result = ['Draw', 'Loose...', 'Win !'].at(i);
  
  console.log('✊ = 0,✌ = 1,✋ = 2');
  console.log(`a = ${a}${hands[a]}`);
  console.log(`b = ${b}${hands[b]}`);
  console.log(`${i} = ${a} - ${b}`);
  console.log(`['Draw', 'Loose...', 'Win !'].at(${i})`);
  console.log(result);
}

jangKen();

もし、それぞれの出し手、a と b を別で用意するのなら、勝敗の判定のみのメソッドは
const jangKne2 = (a, b)=>['D', 'L', 'W'].at(a-b);
なんて1行で済んでしまいますね。

const a = Math.floor(Math.random() * 3);
const b = Math.floor(Math.random() * 3);


      // .at(i) を使た勝敗判定のみ
const jangKne2 = (a, b) => ['D', 'L', 'W'].at(a-b);
console.log(jangKne2(a, b));

      // (a - b + 3) % 3 だって問題ない
const jangKen3 = (a, b) => ['D', 'L', 'W'][(a-b+3)%3];
console.log(jangKen3(a, b));

まとめ

  • ジャンケンの勝敗ロジックは、arr.at(i) が今風で直感的
  • (a - b + 3) % 3 のやり方も、四則演算や余り計算で数字を変形させる練習になる

参考サイト

Discussion