公開日:2023/04/22
title.png

25th Season


#25-5 後出しジャンケン

 オールインワンのマイコンボードM5StickC Plus(下図)を使って、後出しジャンケンゲームを作ってみます。

a233_m5cp_pkg.jpg

 普通のジャンケンは、お馴染みですよね?

 と、言う、単純なゲームです。平和的、かつ、公平に勝敗が付くので、色々な場面で活用されているのではないでしょうか?
 ただ、コンピュータとの対戦では、「公平」とは言い切れません。

コンピュータとのジャンケン

 もちろん、コンピュータのプログラムがズルしないという前提では、公平です。

 ジャンケンの公平性は、プレイヤが互いに同時に手を出し合うからこそ、なのです。人間同士でも、時折、「今、後出しした〜!」って、トラブルになったりしませんか?
 コンピュータは人間の動作に比べて、ものすっごく処理が速いので、人間が入力してきた手を見てから、自分(コンピュータ)の出す手を「後出し」で決定しても、人間には見破ることができないのです。つまり、コンピュータ対戦でズルすると、確実にコンピュータが勝ち続けたり、負け続けたりして、勝敗(率)を制御することができてしまいます。

 ジャンケンに限らず、世の中のすべてのコンピュータゲームと言う物は、コンピュータがズルしていない前提で成立している訳なので、性善説に立って遊ぶ分には、宜しいと思います。

後出し前提のジャンケン

 さてさて、人間のプレイヤ側が「後出し」することを前提とした「後出しジャンケン」となると、全く状況が異なります。以下に、今回作成する後出しジャンケンのルールをまとめてみます。

  後出しジャンケンのルール:

 プレイヤが入力すべき手は、以下表の通りです。

コンピュータの プレイヤが
入力すべき手
説明
出した手  指示 
a255_rock.png 勝ち

(WIN)
a255_papr.png プレイヤは、
コンピュータに
勝つ手を
入力する。
a255_scis.png a255_rock.png
a255_papr.png a255_scis.png
a255_rock.png 引分

(DRAW)
a255_rock.png プレイヤは、
コンピュータと
引き分ける手を
入力する。
a255_scis.png a255_scis.png
a255_papr.png a255_papr.png
a255_rock.png 負け

(LOSE)
a255_scis.png プレイヤは、
コンピュータに
負ける手を
入力する。
a255_scis.png a255_papr.png
a255_papr.png a255_rock.png

 このルールだと、コンピュータ側はズルのし様が有りません。コンピュータの出した手と指示に従って、プレイヤが出すべき手が9通りに変化するので、たった3種の中から選択するだけのジャンケンと異なり、ゲーム性も向上します。
 制限時間以内に正しい答えを入力しなくてはならないので、頭の体操にも、なるのではないでしょうか。

ゲームU/Iの設計

 M5StickC PlusのTFTディスプレイを使って、コンピュータの手と指示を表示します。

 アイコンは脳の視覚野で判断、指示は文字列なので言語野が判断して、プレイヤの出す手が決まったら、運動野が体を動かして、入力します。ちょっとした脳の体操ですね。

 プレイヤは3つの手(グー/チョキ/パー)から選択して入力しなくてはなりません。ですが、M5StickC Plusのユーザスイッチは2個(SW-A/B)しか無くて不足です。
 電源スイッチ(PWR)の短押しを使うと、3種の入力が可能ですが、今度はスイッチ3個の位置関係が宜しくありません。各スイッチは、それぞれ別々な面に配置されているため、2本の手👐を使ってもタイムリに、うまく入力することができないのです。

 別なU/Iを考える必要がありそうです。

ジェスチャを使う

 そこで使うのが、M5StickC Plusに搭載されたジャイロセンサ(MPU6886)です。
 マイコンボードは異なりますが、Arduino DUE+ジャイロセンサ(MPU9250)を使って作成した、空中マウスの記事が以下にあります。

  「#21-7 空中マウスの別解

 空中マウスの応用で、M5StickC Plusを空中で振る方向(ジェスチャ)によって、ジャンケンの手を入力するインターフェイスを採用したいと思います(下表)。

ジェスチャ 入力
左振り グー a255_rock.png
上振り チョキ a255_scis.png
右振り パー a255_papr.png

  ジェスチャによる入力:


 ジャイロセンサの読み出しは、M5StickC PlusライブラリのM5.Imuクラスを使います。getGyroAdc()メソッドを使うと、ジャイロセンサのAD変換器読み出し値を知ることができます。

 getGyroAdc()メソッドで読み出した値は16ビット符号付整数で、各軸周りの角速度を表しています。
 試して見たところ、M5StickC PlusのTFT面を上方向とするのがz軸、SW-Aに刻印された「M5」の文字が読める方向に見て、短辺右方向がx軸、長辺上方向がy軸みたいです(下図)。

a255_gyroaxis.png

 理解し易い、無難な方向に実装されていました。従って、以下の通りに検知することができます。

 M5.Imuクラスは、Init()メソッドで初期化して使うと、ジャイロセンサのLPF(サンプリングレート1kHz)が有効になって、2,000[°/s]レンジに設定される様です。getGyroAdc()メソッドの読み出し値は、絶対値最大値32,768LSBなので、読み出し値[LSB]×2,000[°/s]÷32,768LSBを計算すると、[°/s]に換算することができます。
 今回は、[°/s]の絶対値は必要ないので、LSBのままで判定しています。

オフセットキャンセル

 ジャイロセンサの困ったところは、オフセットが付いて読み出される事です。次回の実験でオフセット値を読み出してみますが、オフセットには個体差が有るので、決め打ちではキャンセルできません。個体毎に校正が必要と、なってしまうので、誰にでも簡単に遊んでもらいたいゲームへ応用する場合の障害になります。

 今回のゲームでは、「プレイヤ(ユーザ)に校正してもらう」事は避け、自動的にオフセットをキャンセルして使いたいと思います。

  オフセットキャンセル手順:

 代案として、「オフセット値が十分小さい」と見なせるほど大きな閾値で判定するという力業もあるので、ケースバイケースで適切に対応して宜しいと思います。


 ユーザインターフェイスに使用可能なスイッチの類が少ないM5StickC Plusですが、ジャイロセンサを使ってジェスチャで入力するという方法が有効だと、ひらめきました。このU/Iは、他の用途でも応用が利きそうです(1^ー^)v。次回、ちゃんとゲームとして完成させて、遊んでみようと思います。


btn_arduino.png

btn_prev.png btn_next.png

home