スーパー正男で1234+56789を計算してみた!

はじめに

このコースは、正男界のリレー更新企画「年越しカレンダー 2019-2020」4日目のコンテンツです。

一昨日に続いて2回目の参加ですが、よく考えると正男界隈ではまだ端くれであるので、軽く自己紹介をさせていただきます。
年越しカレンダーからこのサイトに初めていらしてくださった方、ありがとうございます。某氏と申します。そうでない方もありがとうございます。
ここのサイトで、ブラウザ上でアクションゲームが作れる「スーパー正男」のオリジナルコースの公開をしています。
コースの特徴は、本家を模したようなものというよりは裏技を使ったりまさおシーケンサー *1等の新規性をテーマにしたものが多いです。

今回ご紹介するコースも、「スーパー正男で 足し算をする計算機」という新規性のあるコースです。
・・・とは言いつつ、タイトルから分かる方はわかる通り、マリオメーカー学会*2のリスペクトです。
スーパー正男でも、こんな計算機が作れるのか〜と思っていただけたら嬉しいです。
あまり正男メインの話ではなく、読みたい人は読んでネ的な内容になってしまったことを先立ってお断りします。

※この記事は、内容の正確性を保証するものではありません。

概要

コースの全容
図1-1 コースの全容

できること

この計算機では、2進法を用いた16桁までの足し算を行うことができます。

2進法というのは、2つ集まると1繰り上がる(繰り上がらなければならない)という考え方です。
マリオクリボークリボー で考えても良いと思います。 クリボー2匹でコデカクリボーコデカクリボー 、 コデカクリボー2匹でデカクリボーデカクリボー にクリ上がりますよね。(実際は踏むと分裂するだけで合体はしませんが)
デカクリボー、コデカクリボー、クリボーが1匹ずつ居たとしたら、「あっ、クリボー7匹分だ。」と想像できるはずです(図1-2)。これは7が2進法で「111」と表せることに他なりません。(暴論)

デカクリボー コデカクリボー クリボー クリボー クリボー クリボー クリボー クリボー クリボー クリボー
図1-2 クリボー換算

この場合クリボーの種類が3種類なので、8以上はどうしても同じ種類のクリボーが2匹以上必要となり、表せません。
似たような理由で、今回の計算機でも「16桁まで」という制限が設けられています。
10進数に直すと、216 - 1 = 65535までの正の整数同士の足し算ができます。
半自動(歩いているだけで良いコース)*3ですので、入力動作以外は正男正男 は歩き続けているだけで計算が進み、計算結果を出力することができます。
さらに、スーパー正男にはプレイ中ずっと歩かせ続けるモードがあるので 正男の操作は一切行わずに結果を出すことができます。

使い方

入力部
図1-3 入力部

入力操作に関して説明します。

ゲームを開始すると正男は入力部に居ます。
入力部ではKEY1KEY1 が横に16列、縦に2行並んでおり、
左側が上位桁、上が入力1(足される数)、下が入力2(足す数)となっています(図1-3)。
KEY1が1を表しており、0は何もないことで表現します。
つまり、入力の初期状態は16桁全てが1という状態です。
目的の計算を行うためには[↓]を入力して0にしたい桁のKEY1を取っておく必要があります。(図1-4a, 図1-4b)

動画(0:08~)では1234 + 56789を入力しています。

1234 0000 0100 1101 0010
56789 1101 1101 1101 0101
図1-4a 1234 と 56789の基数変換
入力を終えた後の鍵の状態
図1-4b 入力を終えた後の鍵の状態(実際は1マス下に落ちている)

入力を終えるとKEY1がそれぞれの桁を求める演算部へと落ちていきます。
ここから半自動で一桁ごとの計算を行います。

出力では亀 が1を表します(図1-5)。
最上位が繰り上がることもあるので、17桁分を表示できるようにしています。

出力部と計算結果
図1-5 出力部と計算結果

ギミックの解説

入力部
図2-1 入力部(再掲)

入力部

今回の設計では演算部での入力を示すKEY1は階段状に並ぶことになります。
概要で触れた通り、入力部では数値を指定するために0の桁のKEY1を取る必要があります。
しかし、正男を階段上に進めていくのは難しい上に見にくいため、
入力時はなるべく横一列に並べたいものです。

そこでKEY1が落ちる仕組みを使って、
正男が入力を終えた後スイッチスイッチ を押して、 KEY1を乗せた鉄の床鉄の床 が消え、
KEY1が落ちることで演算部にセットされるようにしました(図2-2)。

入力部
図2-2 スイッチ

スイッチの右下の扉は、 左15パーツ以内の雑魚敵を全部倒すと開く扉左15パーツ以内の雑魚敵を全部倒すと開く扉 で、
正男が落下中のKEY1を取らないようにするための行き止まりです。
正男がスイッチを押し、左にある鉄の床が消え、が落ちて右に歩くことで、左15パーツ以内の雑魚敵を全部倒すと開く扉が開くようになっています。

動画(0:42~)でこの一連の流れが行われています。

正直これは設計ミスです。
正男がまた入力部を端から端まで歩く必要があるし、
最初から右側にスイッチを設置しておけば上位桁のKEY1を取ることもなくなりました。

入力部にはもう一つポイントがあります。
それは、桁を0にするために取ったKEY1が隣の扉 を開けるのに即座に使用されている点です。
理由としては、演算部に余分なKEY1を持って行かないようにするためという他に、
スーパー正男には鍵を合計5個までしか持てないという制限があるためこうしています。
もしがなかった場合こうなります。(図2-3)

鍵が取れてない
図2-3 KEY1が取れてない

入力部のまとめ

  • KEY1を取ることで0の桁を指定する。
  • 入力を終えるとKEY1は各桁の演算部に落ちていく。
  • KEY1を取ったら個数制限回避のため即消費する。

演算部

演算を行う回路
図2-4 演算を行う回路

演算部は各桁ごとに演算を行う回路が桁数分の16個繋がっています。
回路に入る前に正男KEY1を取ります。この個数の違いで計算結果が変わります。
KEY1の個数はその桁における1の個数を表しており、
入力1と、入力2、前の桁からの繰り上がりの有無で最小0個、最大3個の4通りの場合があります。

入力1 入力2 前の桁からの
繰り上がり
KEY1の個数 次の桁への
繰り上がり
計算結果
KEY1 KEY1 KEY1 0KEY1 亀
KEY1 KEY1 KEY1 1KEY1 亀
KEY1 KEY1 KEY1 1KEY1 亀
KEY1 KEY1 KEY1 2KEY1 亀
KEY1 KEY1 KEY1 1KEY1 亀
KEY1 KEY1 KEY1 2KEY1 亀
KEY1 KEY1 KEY1 2KEY1 亀
KEY1 KEY1 KEY1 3KEY1 亀
図2-5 2進法の計算の組み合わせ

その桁の計算結果が、繰り上がりがKEY1で表現されています。
正しい回路の働きにするためには、
KEY1の個数が2個以上なら、KEY1が落ちていき、
KEY1の個数が1か3なら、亀が落ちていく
必要があります。
これらの条件分岐は、が開くかどうかによって実現できます。
KEY1の制御を4つの扉で並行して行う仕掛けを考えるのが、今回一番苦労した点です。

が演算部を出ると、そのまま出力部に落ちていきます。
繰り上がりのKEY1は次の回路に移動する最中に取ります。

正男が次の回路に移動するときは、裏技を使います。
すべる床すべる床壁下り坂下り坂 をこのように配置すると正男が高速でムーンウォークします(図2-6)。*4

すべる床の裏技
図2-6 すべる床の裏技

演算部のまとめ

  • KEY1の個数で入力を指定する。
  • 扉が開くかどうかで出力を分岐させる。
  • 桁ごとの出力は、繰り上がりはKEY1で表す。

出力部

出力部と計算結果
図2-7 出力部と計算結果(再掲)

出力は左が上位桁で、のいる桁が1です。
結果表示の前に最上位桁の繰り上がりを表示するための簡単なギミックをつけました。
最上位の計算後に取ったKEY1を使って扉を開き、
17桁目に相当する位置にを移動させるようにしています。
動画(2:56~)

結果を表示するのには特別なギミックが必要なわけではありませんが、
スーパー正男の一画面は小さくて1マスおきの表示だと8桁までしか同時に見られませんので、
上位桁をもう一度見たい時に正男を移動させる必要があります。
そこで、演算部でも使用した裏技(図2-6)をここでも使い、何度でも上位桁を見直せるようにしました。

出力部のまとめ

  • のいる桁が1。
  • 17桁目も表示できる。
  • 正男を移動させて全ての桁を見直すことができる。

マリオとの違い

当然のことですが、スーパー正男のギミックは本家スーパーマリオには敵いません。 この項では、今後スーパー正男計算機を開発していく上で意識しなければならない スーパーマリオとの違いを挙げていきます。

短所1. 正男以外のオブジェクトが多くのオブジェクトを利用できない。

などの敵は動く床動く床 に乗ったり、ジャンプ台ジャンプ台 で跳ねたりすることがありません。

短所2. 状態変化が正男以外で起こることがほとんどない。

などの敵はコインコイン を取ったり、スイッチを押したり?ボックス?ボックス を叩いたりしません。
正男以外で状態が変化する数少ない例が、前述の左15パーツ以内の雑魚敵を全部倒すと開く扉です。

短所3. 積み上げられるオブジェクトが少ない。

今回出力の表示に使用したは積み上がらず、重なってしまいます。
これではマリオPスイッチブラックパックンのように、出力を縦に表示したくてもできません。
数少ない積み上げ可能なオブジェクトに、追尾亀ドッスンスンドッスンスン がありますが、
追尾亀は追尾という名の通り挙動が複雑で、
ドッスンスンはデカすぎるという問題があります。

短所4. 再利用可能なオブジェクトが少ない。

甲羅も無エ。メットも無エ。 アイテム出てくる土管も無エ。
Pスイッチも無エ。POWも無エ。 おまわり毎日クルクルブロックも無エ。

おらスーパー正男嫌だ〜(吉幾三)と言いたくなるところですが、
実は本家越えしているところもあります。

長所1. スピードを変えられる

設定を変えるとここまで速くなります。
スピードを変える
図3-1 スピードを変える

長所2. 様々な制限がない

マリオメーカーとは違い、スーパー正男には、メモリと処理能力の許す限りですが、
マップサイズやオブジェクトの個数に制限がありません。
実際、この回路を拡大しただけである横79マスx縦173マスの32bit演算回路の動作も確認しています。
また、制限時間も無限にすることができます。

長所3. 裏技の存在

先述した、すべる床高速移動のように、スーパー正男には様々なバグが存在します。
そこからは、思いも寄らない有用なギミックが誕生することもしばしばあり、「裏技」と呼ばれます。*5
もちろんスーパー正男計算機に応用できる可能性も十分にあり、
それは多彩でユニークな機構を生み出すことにつながります。
バグと言ってしまえばそこまでですが、その多様さは、スーパー正男の一つの魅力であると言っても過言ではありません。

次なる課題

マリオメーカー学会が高機能・多機能化で発展してきたように、
スーパー正男計算機もこれからの高機能・多機能化が大いに期待されています。多分。

再利用可能なギミック

まず、スーパー正男はマップサイズが無限ということはありますが、メモリ節約のために演算回路の集積化は避けられない課題です。
一つの手段として、1桁の演算回路を再利用するというものがあります。
そのためには、今回のKEY1を利用したギミックは再利用不可能であり、再考する必要があります。
KEY1に関しては、再利用可能であるスイッチを使用する方針に切り替えた方が良いでしょう。
また、チコリンチコリン の攻撃の一種である ヒノララシヒノララシ orマリリマリリ の無限湧きを利用するという手があります。

入出力フォーマットの統一

マリオメーカー学会で言及されていたように、
計算結果を他のモジュールに再利用することはより高度な計算機を作ることにつながります。
そのためには現状の入力がKEY1、出力がという異なるフォーマットは一新する必要があります。

高速化

コースの設定を使ってスピードを上げることは、
計算の高速化という大きなメリットがありますが、
当然正男のスピードも上がるため、1桁ずつの入力タイミングがシビアになってきます。
1桁毎に入力待ちを作って最高速度でも余裕を持って入力できるようにする必要があります。

さらなる課題

10進法での入出力、減算・乗算・除算可能な計算機 etc.

最後に

稚拙な文章ではございましたが、
私がこのようなスーパー正男計算機を構想し、実現できたのは、
マリオメーカー学会の方々の先行研究があってこそです。
この記事も、今後のマリオメーカー学会
スーパー正男学会(!?)の発展につながることがあれば、幸いです。
最後までお読みくださりありがとうございました。