見出し画像

じゃんけんの手を30手まで増やして、その勝ち負け判定方法を数学を用いて解説してみた

▲この記事はオモコロ杯2022春銅賞を受賞しました。



この記事の内容

この記事では、2022/3/31に公開した「じゃんけんの手を30手まで増やしてみた」の攻略記事を書いていきます。
普通のじゃんけんは3手しかないですが、このじゃんけんはなんと30手もあります。
これは通常の10倍の体験を味わえるということになります。とにかくすごいということですね!

まだプレイしていない人はやってみてね!とりあえず3勝してみよう!!!
5分あれば最後まで遊べると思うので!

・ゲームURL

https://hothukurou.com/game/Janken/index.html

ここからはネタバレになるので、ちゃんとプレイしてからみることをおすすめします。
サブタイトルが~ゲーム制作者の苦悩~なので、何か二転三転ありそうだと想像つくかと思うのですが、本作はそこから更に斜め上の展開がはじまります。


無謀とも言える挑戦

ゲームを面白くする非常にシンプルな方法として「とにかくユニット数を増やす」というものがあります。
ポケモンやドラゴンクエストモンスターズは仲間になるモンスターの数が多ければ多いほどワクワクしますよね。
遊戯王カードも今の環境で使用できるカード枚数1万枚以上あるので、デッキ構築ワクワクしますよね。
これをじゃんけんに転用して「じゃんけん30手にしたら面白くなるんじゃね?」というアイデアが今作の中核です。

もちろん、面白くなるわけがありません。実際に遊んでいただいてわかったと思うのですが!

むしろ「ユニット数を増やすと面白くなる、という安易な発想で悩み続けるゲーム制作者の苦悩」こそが本ゲームの真のテーマとなっております。

ところで、このじゃんけん勝ち負けをどのように決めているのでしょうか。
30手もじゃんけんの手を作ったら、さすがに手動で設定するのは面倒です。

この「じゃんけん勝ち負け決定アルゴリズム」こそが、本ゲームを制作した技術的な動機になります。
じゃんけんの勝ち負けを決める、なかなかおもしろいアルゴリズムがあったので、それを元にゲームを一本制作したくなったのです。

この記事の後半の方に「おはじきじゃんけん」の激難モードに使われる6種類の手の勝敗表を書いておいたので、もし「あ、これは理解できん!」となったらそこまで飛ばしてもらえると幸いです。

じゃんけんの勝ち負け決定アルゴリズム

ここで質問です。自分と相手がグーチョキパーの3つの手を出したとして、あなたはどのようにして勝敗を決めるアルゴリズムを書きますか。

多分こんな感じで書くのではないでしょうか。
(プログラム書いたことない方でもわかるように日本語で書きます)

自分の手、相手の手を確認する。
1.もし、自分の手と相手の手が同じなら、引き分けとする。
2.もし、自分の手がグーで相手の手がチョキなら、自分の勝ちとする。
3.もし、自分の手がチョキで相手の手がパーなら、自分の勝ちとする。
4.もし、自分の手がパーで相手の手がグーなら、自分の勝ちとする。
5.もし、自分の手がチョキで相手の手がグーなら、自分の負けとする。
6.もし、自分の手がパーで相手の手がチョキなら、自分の負けとする。
7.もし、自分の手がグーで相手の手がパーなら、自分の負けとする。

もし~ならば、という条件分岐を7個も書くことになるかと思います。これは面倒ですね。何よりも問題なのは、じゃんけんの手が増えたらもっと条件分岐が増えてしまうという点です。
なんとかして、じゃんけんの手がいくら増えたとしても、条件分岐を増やさない判別方法を考える必要が出てきます。

そんな方法ある?と思う方もいらっしゃるかと思うのですが、実はそんな方法があるんです。数学という人類の叡智を借りることで!


数学を活用するためにも、グーチョキパーという情報を数字に変換しましょう。プログラムの世界は基本的に全ての情報を数値で扱うので、一般的な考え方でもあります。

グー=1,チョキ=2,パー=3 としましょう。

そしてここからが突飛な発想になるのですが、このグーチョキパーを二次元座標上に展開します。
こんな感じで120°ずらした位置に設置します。
先程定義した、グーチョキパーを1,2,3で表す方法で使うと、
角度=(手の番号-1)×120°
で求めた角度にグーチョキパーを設置します。

この図の灰色の矢印をベクトルと呼びます。今回は原点(0,0)から、120°回転した同じ長さのベクトルの先にグーチョキパーの座標を配置しています。

このグーチョキパーの座標ですが、高校数学で使ったコサイン(cos)とサイン(sin)を用いるとすごくキレイに座標を表すことができます。

コサインとサインってなんのために使うのか!とわからぬまま今に至る方も多いかと思うのですが、こんな感じで図にすると「おお、x座標をcos、y座標をsinにすると、その角度にある座標になるのか!」ということがわかっていただけるかと思います。コサインサインってすごいでしょ。

このように手を設置したとき、「反時計回り方向に勝敗が決まる」というルールで勝ち負けを判断することができます。
詳細に言い換えると「自分の手から見て、相手の手が反時計回りに近ければ自分の勝ち、時計回りに近ければ負け」となります。

時計回りか反時計周りか判定するときは、外積を使って求めることができます。

外積って高校数学の範囲外みたいなので、知らない人も多いかと思います。大雑把な説明になってしまいますが、外積を使うと二次元平面のベクトル2つから、その平面に垂直な三次元のベクトルを求めることができます。



また、この外積のベクトルにも特徴がありまして「ベクトルのZ座標は反時計回りなら正、時計回りなら負」になるという特徴があります。
外積はこの2つの特徴がめちゃくちゃ便利なのです。
難しい話になってきましたが、Z座標は以下の式で求められるため、そこから反時計回りか時計回りかを簡単に判断することができます。

自分の手:(x1,y1)  相手の手:(x2,y2)  とすると、
x1 × y2 - x2 × y1 > 0 ならば反時計回りなので自分の勝ち。
x1 × y2 - x2 × y1 < 0 ならば時計回りなので相手の勝ち。
 

この式を用いればものすごくシンプルにじゃんけんの勝敗を求めることができます。

この手法で勝ち負けを決めることで、座標値さえ定義してしまえば「じゃんけんの手をいくら増やしても同じ手法で計算可能」ということがわかります。

120°ごとにずらしてしまうと、4つ目の手と1つ目の手の角度が同じ値になってしまいますが、例えば118°ごとにずらしていくことで、同じ角度に手が設置されなくなります。
この方法でじゃんけんの手と座標値を定義していけば、角度を重複させずにじゃんけんの手をどんどん増やしていくことができます。

ちなみに本作ではじゃんけんは114.59°ごとにずらすようにしています。(小数点を省略しています。)
なぜこんな中途半端な数字なのかというと、ラジアン法で2[rad]になる角度を選んでいるからです。
プログラミングの世界では角度は度数法ではなくラジアン法をよく使うため、ラジアン法でキリの良い数字を選んでいます。


4手目以降の手を配置して勝敗を決めてみる

反時計回りに近い手には勝てるが、時計回りに近い手には負ける」という基本ルールを用いて4番目以降の手の勝ち負けを決めていきたいと思います。
例えば、新しい4番目の手である「3way」を作ります。



そうすると、勝ち負けはこんな感じになります。

同じルールで5番目の手「キリ」を作ります。



勝ち負け表はこうなります。


6番目の「鬼」を入れます。

勝ち負け表はこうなります。


あくまで「反時計回りに近ければ勝てる」というルールで構成されているので、勝敗は検討がつきやすいですね。


ここまでがおはじきじゃんけんの「激難難易度」で使われる全6手です。
このゲームのおまけモードでは更に増えた30手のじゃんけんが楽しめますが、30手分の勝敗はすべて基本的にこの方法で勝ち負けを決めています。

「おはじきじゃんけん?おはじきの要素あった?普通の30手じゃんけんしか遊んでなかったんだけど、なんか違うゲームの話してない?」

と思われた方も少数ながらいるのではないかと思います。
そういう方は、このゲームの重要なヒミツに触れる前に離脱しているということになるので、ぜひもう一度プレイしてこのゲームの裏の顔を見つけてあげてもらえると嬉しいです。

・じゃんけんの手を30手に増やしてみた ゲームURL

https://hothukurou.com/game/Janken/index.html

じゃんけん30手の勝ち負け判定アプリ

さて、これを30手分考えればじゃんけん30手の勝ち負けをすべて求められるのですが、さすがに30手で勝ち負け表を作っても理解できない複雑な表になってしまいます。
6手しか使用しない激難モードであったとしても、表で表すと非常に見ずらいですよね。

そこでゲーム内の拡張機能として、この勝ち負け判定をクリックで判定してくれるようにしました。
この拡張モードを入れると、おはじきを引っ張る前のクリックした段階で相手の手に勝てるかどうかを確認することができます。

クリックした手はWINと書いてある手に勝つことができます。
この場合であれば、左側に向かって弾き飛ばすと一気に4つの手を破壊できることがわかります。
おまけモードでは必須級ですが、激難モードがどうしても攻略できない方でもおすすめの拡張機能です。ぜひご利用ください。

ちなみに最初の30手じゃんけんにはこの勝ち負けは表示されません。これ表示しちゃうとゲーム性が皆無になってしまうので!


この拡張機能、なんと100円で追加できます!

100円ですよ!自販機の缶ジュースよりも安い金額でじゃんけんマスターになれるのです!これは買うっきゃない!!!!!

しかも、このゲームを買うと、私のゲーム制作資金はどんどん増えていくことになります。つまり、面白い作品がどんどん生まれていくわけです。
「このゲーム面白かった!」とか「作っちゃうおじさんの活動を応援したい!」という方がいましたら、寄付とか投げ銭と思ってぜひぜひ購入してください!頼む!!!!!!!

ちなみに、このゲームの振り返り記事を別途まとめているので、興味ある方は読んでみてください。「ゲームアイデア詰めの苦悩」や「激難難易度のクリア率」などを書いています。

・じゃんけんの手を30手に増やしてみた ゲーム振り返りとプレイデータ集計!
https://hothukurou.com/blog/3376-2

ここから先は

457字

¥ 100

この記事が気に入ったらサポートをしてみませんか?