光る順番記憶ゲーム
以前、ツイッターにて紹介しましたこのゲーム
そろそろ新作を作りたいので解体します;;
トリガーエディターのコード保存させてくれぇ・・・
ということで中身紹介。
今回、3つのホームネットワークパソコン(以降PC)にそれぞれ役割を与えました。
①ライトをランダムに点灯させるPC
②レバー入力による回答を待ち受けるPC
③正解判定を行うPC
それぞれ簡単にですが解説します。
コードは長すぎて正直読まないと思うので・・・
考え方とかが参考になれば幸いです。
①ライトをランダムに点灯させるPC
本当は、ライトを6本にしたかったり、完全ランダムとはいかないまでも
6通りぐらいの光るパターンを準備できるかな、と思っていたのですが
③の正解判定が思ったよりコードを圧迫してしまい
泣く泣くライト3つの3パターンになりました。。。
せめて難しくしようと、9回光らせるようにしました。
ライトを左から1 2 3として、1ステートで3回まで点滅でいるので
1パターン目 132→321→213
2パターン目 231→321→213
3パターン目 231→312→123
の順で光らせることとしました。
1パターン目と2パターン目の中~後半部分は被らせて圧縮しています。
また、1→1のように同じライトを連続で点滅させるとコードが長くなるので回避。
1stateで3回点灯させるやり方は、ビットカウンターの応用なので割愛します。
この3パターンのどれになるか、はランダムにということで
3つのステートをグルグルまわりながら、ゲーム開始スイッチが押されるのを待ちます。
また、ライトを光らせると同時に
足場の下に隠れているおじさんたちを動かします。
以下のように27人のおじさんを配置
123456789 ←右のライトが光ったら動く
123456789 ←真ん中のライトが光ったら動く
123456789 ←左のライトが光ったら動く
↑ ~ ↑
1回目の点灯~ 9回目の点灯
光ったライトの位置に対応したおじさんをONにすることで
どのライトがどの順に光ったかをおじさんに記憶させました。
②レバー入力による回答を待ち受けるPC
一通り光り終わった後、プレイヤーはレバーで回答を入力します。
この時、回答に対応した位置のおじさんの動きをOFFしていきます。
ライトの光ったところのおじさんのみがON状態のはずなので、
それらがすべてOFFとなり、
最終的に動いているおじさんがいなくなれば見事正解
誰か一人でもONで残っていたら不正解です。
9回答えを入力してもらうので回答1~9の待ち受け、
リセット処理とか全然関係ないときにガチャガチャされたりしないように
スタート待ちのステートでちょうど10ステートです。
③正解判定を行うPC
そして正解判定。こいつが苦労しました・・・
話としては全てのおじさんがOFFになってるか?を調べて
OFFならクリア、一人でもONがいたら出直してこいっていうだけなんですが
一つ目のIF文→1人目のおじさんはONになってないか?
二つ目のIF文→2人目のおじさんはONになってないか?
三つ目のIF文→次のステートに移動する
という作りとなっているため
1ステートで2おじさん分のONOFF判定しかできないんですよね・・・。
つまりどんだけ頑張っても10ステート×2おじさん=20おじさんまで。
さっき調子にのって27おじさんも配置してしまったので
どうみても足りません・・・
なんかうまい書き方がないかと模索したのですが思いつかず。
ということでライトの光りかたのパターン=見るべきおじさんの数
を頑張って圧縮しました。
再掲。
赤枠にそって、縦にみていくとわかるのですが
1回目の点灯はかならず1か2
2回目の点灯に至っては3しか点灯しない としました。
これにより一見バラバラにみえますが
ある程度ライトの光パターンをかぶせることで、
裏でうごく可能性のあるおじさんの数を15体まで減らしました。
15体であれば8stateでON/OFF判定ができます。
ソースは以下の通り
この正解判定、すごく時間がかかるので
On ConditionにシンプルスタンドのONOFFを書いてチカチカさせることで
プレイヤーの気を紛らわせていますw
おじさんが一人でもONだったら、外れ判定用スイッチをONにしています。
そして最後に正解・はずれ判定。
正解ならドアをあけて
はずれなら全部元通りにして待ち受けに。
(スイッチの数も多いのでもうゴチャゴチャですが・・・)
もっかい作れと言われても、もういいかな・・・。
土日に壊して、新作ゲーム作ろうと思います
8月中旬には公開できるかな?お楽しみにー!
微妙な時間差の検証の続き
検証の続き。
前回記事を読んでない方は先にこちらをどうぞ
https://ms2messer.hatenablog.com/entry/2019/07/26/215509
前回の記事で複数ホームネットワークパソコンが同時にロードされる
といったことを書きましたが
厳密に同一タイミングなのか?
一つのレバー操作を奪い合ったら誰が一番早いのか?が気になって調査しました。
ウォルナットレバーがOFFだった場合にそれをONにしつつ、自身のネットワークパソコンの列にあるチタニウムレバーをONにする命令を記載。
どのPCの命令でウォルナットレバーを倒したのか?が分かるようにしました
結果はこちら。
何回やっても、どのパソコンで初期化しても3番目が主導権を握る・・・。
最後に置いたパソコンが主導権を握るのか?ということで一番左のパソコンを置きなおしてみる。(撤去→再設置)
・・・・左と右が命令を奪い合う結果に。
真ん中はまったく反応しないし意味不明
ならばと真ん中を置きなおしてみると、今度は一番右ばかりレバーが倒れる事態に
意味がわからーん
少なくともわかったのは
・体感ではわからないが、初期化後のパソコン処理は順列で行われており完全に同時ではない
・その順番はランダムではなく、何かしらの法則に従っている模様
ってところまで。うーむモヤる・・・
次の検証
前回の検証では、一瞬でOFF→ON→OFFのレバーの動かし方が2種類あり、
本当に一瞬で遷移するパターンと、若干の間をおいて遷移するパターンがあるという話をしました。
では、一瞬のONOFFをしたときに
他のネットワークパソコンのONトリガーの動作は反応するのか?という検証
まずは最速OFF→ON→OFFができる
on conditionでON、次のステートのon enterでOFFのパターン
ウォルナットをOFFONすると連動してチタニウムもOFFONになる設定を
パソコン2に設定。(動画前半部分の動き。)
パソコン1はレバーが一瞬ONOFFするように仕込み。
・・・説明を理解するよりさっさと動画見たほうが早いかも
結果は以下の通り
結論:反応しません
ではon enterでON→conditionでOFFパターンではどうか?
結論:反応する。
ほうほう。これはなかなかいい気付き。
しかし動画にあるように、
レバー入力からifでON判定するのにかなりの振れ幅がありますね・・・。
周期的に(0.5秒ぐらい?)ifを満たしているか見に来るって感じなんですかねー?
微妙な時間差の検証
ふと、on enterからcondition、conditionから次のstateのon enterの
タイムラグってどんなもんだろう?と思って調べてみました。
まずはこんな感じに横並びのおじさんを配置。
1パターン目(conditionから次のstateのon enter)
ステートの終わりにおじさんをONにして、
次のステートのOnEnterでおじさんをOFFにしました。
するとこんな感じ
2パターン目(on enterからcondition)
ステートの冒頭でONにして、そのステート内のConditionでOFFにしてしまうパターン。
するとこんな感じ
おわかりいただけただろうか・・・・
わかりにくかったので音(レバー)をつけてもう一度。
前半がパターン1、後半がパターン2
どうやら
on enter→conditonのほうが、condition→次のstateのon enterより
若干処理が遅いようです。
conditionにはif文が含まれるので、そこでわずかながら考える時間が挟まった
と思えばわからなくもないような結果でした。
ライトを点けてすぐ消す!みたいな処理は、
on enterでつけて→conditionで消すとしたほうが
ちゃんと一瞬点いたことが視認出来てよさそうです。
(メモ:その一瞬の点灯をトリガーとして別のネットワークパソコンが処理開始できるか?は要検証)
・・・ということは、if文は3つ書けるけど、
3つ目のifに到達するまでに時間がかかるのか!?
ということで次の実験
細かい解説ははぶきますが、
ONOFFすればIF文の1つ目を読んだり3つ目を読んだりするような
スイッチを増設しました。
結果はこちら。わかりにくいですが、途中でレバー操作をしています。
うん、全然違いがわからん・・・
ということで、if文が1つ目だろうと3つ目だろうと処理速度に違いはなさそうです。
最後に、複数ホームネットワークパソコンを置いて処理を書いた後、
家に入りなおした際にそれぞれが処理開始するタイミングにズレはあるのか?
というのを調査してみました。
こんな感じでおじさんを3列配置して、
1列、1ホームネットワークパソコンで順繰りに動かしていく設定をしました。
ソースは単純に、順繰りにまわすだけ
設定後一度家をでて、帰ってきた状態がこちら。
全列、見事に動きがそろいましたね。完全に同じタイミングでロードされるようです。
また、保存するタイミングでずらせるのか?と思ったら
初期化はともかく、保存して再ロードも
全部のネットワークパソコンに適用されるんですね・・・。知らなかった。
なんだかおもしろい気づきが得られたような、そうでもないようなw
ミニライツアウト
少し前に作ったギミックのソースコードを紹介します。
トリガーエディター1つで出来て省コスト!
レバーを操作して、
おじさん3人が同時に動いた状態にすることができたらクリアとなります。
ただし、レバーを動かした位置に対応するおじさんと、その隣のおじさんの動きが
「動いてたら止まる」「止まってたら動き出す」という法則で変化するので
ガチャガチャやってもクリアできませんよ!
全体像はこんな感じです。
おじさんの動き反転を使いまわして省スペース化するのがミソです。
※追記:画像は、startが開始位置になっていません!正しくはstartから開始です
以下、細かく見ていきます。
このステートから開始です。初期設定をしています。
(On Enterに別のギミック用の設定を入れ込んでいたので消しました。
気にしないで下さい。)
ワインおじさんを3体並べていますが、全員動かない状態から始めると
真ん中のレバーを押しただけで終わってしまうので
両端のワインおじさんを動かして置き、クリアに数手かかるようにしています。
店舗用ガラス自動ドア、および金庫入り口は、クリア時に開くドアになります。
クリア前は当然閉まっているべきなのでOFFにします。
また、このステートがレバー操作の待ち受けステートになります。
レバーは3つ置いてあり、何れかのレバーがONになったら次のステートに移動します。
なお、レバーはONによって次のステートに飛べればいいだけなので、
レバー自体は即OFFに戻しています。
これは、左のレバーがONになったときに飛んでくるステートです。
257001は一番左のワインおじさんです。
おじさんがOFFならONに、おじさんがONならOFFにし、
次のステートにいきます。
続けて、真ん中のワイン(257002)おじさんがOFFならONに、
ONならOFFにします。
newState7(正解判定)に飛びます。
※newState4はありません
というかそもそもnewStateとかじゃなくてちゃんと名前つけろよっていう・・・
こちらは、一番右のレバーが押されたときに飛んでくるステートです。
一番右のおじさん(257003)がOFFならONに、ONならOFFにします。
newState3に飛びます。
newState3は前述の通り、真ん中のおじさんの動きを反転するステートです。
こちらは、真ん中のレバーを操作したときに飛んでくるステートです。
右のおじさんの動きを反転させています。
その後、newState2(=左のおじさんの動きを反転)に飛びます。
ここまでをまとめると、
左のレバーを押したら、左のおじさん→真ん中のおじさんの動きを反転。
右のレバーをおしたら、右→真ん中のおじさんを反転。
まんなかのレバーを押したら、右→左→真ん中のおじさんの動きを反転。
この時、
左→真ん中
右→真ん中 の真ん中部分と、
左→真ん中
右→左→真ん中 の左→真ん中部分はまったく同じなので、使いまわすことができます。
各おじさん動き反転処理後、newState7に飛びます。
これは正解判定処理になります
左のおじさんは動いているか?動いていたらnewState8へ
動いていなかったらnewState1へ(レバー待ち受けへ)
真ん中のおじさんは動いているか?
右のおじさんは動いているか?
見事、すべてのおじさんが動いていたら正解処理です。
ドアを開けて、
全てのおじさんの動きをいったんOFFにします。
その後startへ。初期状態に戻して次の人が遊べるようにします。
ちなみにこの時はドアオープンのタイマーを作っていなかったので、
通れなくはありませんがドアが割とすぐ閉じてしまいますw
空きスペースに多少のタイマーを仕込んでもよかったかもしれません。
ちなみに、ドアを2個隣接しておくと
手動でこじ開けようとしても奥のドアが選択できずに開けることができません。
なので正解するまで先に進めない仕組みとなります。
ドア2個置き、おすすめです!
長々と解説しましたが、参考になりましたでしょうか?
丸パクリで同じものを実装していただいてもかまいませんので、
是非遊んでみてくださいね!
自動ドア
今回は、独自に作ったことのある方もいらっしゃるかもしれませんが
前回の記事のbitカウンターを利用した自動ドアの紹介です。
ソースコードは以下の通り。
時間稼ぎ用のおじさん2人を適当な場所に置く必要があります。
丸パクリで動作しますので、今まで作ったことのない方も是非。
基本的なホームネットワークパソコン(トリガーエディター)の使い方は
過去記事
https://ms2messer.hatenablog.com/entry/2019/07/16/205004
もご参考ください。
2進数bitカウンター
twitterにはすでにアップ済みですが
時間稼ぎのタイマーをスイッチでやってますよ、というコメントを拝見して
面白そうだと思い作ってみていたものを、
最近2進数のbitカウンターで困っている方がいたのでバグ潰して仕上げてみました。
カウントはレバーの動きで表現しており、動画の中で配置しているのは6bit分。
ソースコードはこんな感じ。
1stateで2biが表現できているので、あと5bit分ぐらいは増やせます。
まあタイマーとして通常使う分には1state分ぐらいの時間で十分な気もします。
・・・しかしこれ、厳密にはカウンタの動きはできてないんですよね。
4bit以上になると、例えば
ON/ON/ON/OFFから
OFF/OFF/OFF/ONにするとき、同時に4つのレバーを動かさないといけないのですが
トリガーエディタの制約で同時に3つのアクションまでしか登録できないので
どうしてもレバーの動きにタイムラグが。
エディター2個並列で動かせば何とかならん気もしなくはないですが
そこまでするかっていう。
ということで、
ON/ON/ON/OFFの次は
OFF/OFF/ON/OFFを経て
OFF/OFF/OFF/ONになります。
これをゲームに・・・はあんまり思いつきませんが
同一state内をループしながら進めていくテクニックは結構使えそうですね。
ランダムスイッチ
youtu.be次回作で取り入れたいな~と思っているネタ。
手前のレバーを押すと、奥のレバーがランダムでどれかONになります。
中身はこんな感じ。
手前のウォルナット金飾レバーがOFFの間は、
newState1~3の間をぐるぐる回っていて、
レバーがONになったら、その時のStateに応じて
奥のチタニウムシルバーレバーがONになる、という仕組み。
スイッチを置いて視覚化するとこんな感じ。
例えばこれを使えば、動き続けるおじさんたちを大量において、
ランダムに一人動きを止めたおじさんがどこにいるかを素早く当てるゲームが
できるなぁ、と妄想中。
特にワインおじさんは動きが小さいのでいい感じに混乱しそうw