技術部の御供餅です。前回、自動マリオが見ている世界を絵にして出しました。今日はその絵の印を全部説明します。
以降の回——クリボー、クッパ、マリオの体、ファイアバー——は、すべてこの絵の上で話が進みます。ここが土台です。
本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
① 右半分は、画面の絵を1ドットも使っていない
まず作りの話を1つ。この絵の左は実機の画面そのもので、右は式の入力だけで組み直したものです。右を描くのに使っているのは3つだけ——地形を1マスずつ聞いた結果、敵のスロット、マリオの位置と速度。画面の絵は右側に一切入っていません。
だから食い違えば目で分かる。それがこの絵の唯一の目的です。
もう1つ決めごとがあります。絵を描く関数は1つしかありません。 ブラウザで見る画面も、記事用に書き出す道具も、同じ1つの関数を呼びます。同じ絵を2通りに書くと、どちらが本当か分からなくなるからです。
② 地形は 16px のマス目で、13行だけ持っている
いちばん素の場面から見てください。1-1 の終盤、旗の手前の階段です。

右側の格子が、機械が持っている地形の全部です。
- 1マス=16×16 ピクセル、縦は13行、上端は画面の y32 から。つまり HUD(
MARIO 000000の行)の高さぶんは地形として持っていません - 茶色=固形、黒=空
- そしてもう1色、暗い赤=「分からない」があります
3つ目が大事です。地形は「ある/ない」の2値ではなく、固形/空/分からないの3値で返ります。画面の外の話は、機械は知らないと答えるわけです。
★ ただし正直に書いておくと、この記事のために描いた 538 フレームには、「分からない」のマスは1つも出ませんでした。持ってはいるが、この5本の走行では一度も使われていない、というのが今わかっていることです。
緑の枠がマリオです。幅14px・高さ16px(小マリオ)。座標の持ち方は左端の位置と足の高さで、枠は足の高さから 16px 上までを描いています。この絵では 画面x143〜156・y80〜95 の 14×16 でした。
③ 敵の枠は「箱」ではなく「当たる範囲」
前回の絵をもう一度出します。1-1 の最初のクリボーです。

枠の色は分類です。
| 色 | 意味 |
|---|---|
| 緑 | マリオ自身 |
| 黄 | 踏める(クリボー、パタパタ…) |
| 赤 | 踏めない |
| 橙 | 飛ぶもの |
| 青 | 足場(リフト) |
| 薄紫 | 無害 |
| 灰 | まだ同定できていないもの |
そして黄色い枠は、クリボーの絵(16px)より横に広いです。
理由は、横の当たり判定が矩形の重なりではないから。実機は「敵の座標とマリオの座標がどれくらい近いか」で見ています。だから枠は「箱」ではなく、マリオの座標がこの範囲に入ると当たる帯を描いたものです。
★ ここは外した話があります。 この余裕の値はもともと 16 でした。すると体14+余裕16=30px になり、実機ではクリボーの16px 右に完全に着地しているのに「当たっている」と読まれ、その跳びが候補から消えていました。実機でその手を強制すると 1-1 は levelX 690 から 2003 まで進む手だったのです。余裕を 2 に直したら、1-1 は 690 → 2006 になりました。
★★ そしてもう一度外していました。この帯は敵ごとに違います。 上の直しのあとも「敵の幅 10px + 余裕 2px = 片側 12px(両側 23px)」を全部の敵に共通で使っていたのですが、この式は幅が 10px で頭打ちになるので、クリボーもクッパも同じ窓でした。幅の違いが判定に一度も入っていなかったわけです。2026年8月28日に接触したフレームそのものを測り直すと、クリボーは
接触した dx … −10 −9 −8 −6 −4 −3 −2 −1 0 +1 +2 +4 +6 +8 +9 +10(33件)
当たらなかった … −11 以下(多数)/ +11 以上(多数)
で、±10(両側 21px)でした。いまはこの実測を使っています。まだ測れていない相手は、従来どおりの既定の窓のままです——測っていない敵に数字を作らない、というのがこの連載の決めごとなので。
★ 図はこの測り直しより前に描いたものなので、黄色い枠は 23px で出ています(いまより 2px 広い)。
縦も物によって違います。実測で帯を採れたもの(クリボー、ノコノコ、ゲッソー、プクプク、2-3 の跳ねる魚、クッパ、クッパの炎)はその実測の帯を使っています。一律16px で描いていたころは、絵と判定が食い違って見えていました。
★ もう1つ徹底していることがあります。枠を絵のために組み立て直さない。 式が使っている関数をそのまま呼んで描きます。以前これを自前に組み直して 16px ずれた枠を出し、読み違えを招いたことがあるためです。
④ 点は未来。水色が自分、色つきが敵
同じ絵の点を見てください。
- 水色の点の弧=いま選んだ手を最後まで再生したときの自分の軌跡。この場面では 画面x114 から x150 まで、頂点は y179 でした
- 点は座標と足の高さに置いてあります(体の中心ではありません)。★ これも外した話で、中心に置いていたころは敵の帯と 7px ずれ、触れているのに進むように見えていました
- 水色の枠=行動フレーム後(その手が終わって、次に判断できる時点)の自分
- 茶橙の枠=同じ時点の敵
- そして足元の高さに並ぶ黄色い点の列。これはクリボーの未来です。この絵では x142→128 と左へ並んでいて、クリボーが左へ歩いていく先を4フレームおきに描いています
つまりこの1枚には、いまの世界と、これから85フレームぶんの世界が重ねて描いてあります。
★ 軌跡が赤いときは、「どの手を選んでも死ぬと読んだ」手です。前回お見せした 2-4 のクッパの絵がそれでした。
★ ここに出る軌跡は、選ぶときに実際に回した1本そのものです。絵のために計算し直していないので、「安全だと読んだ根拠」と必ず同じものが出ます。
⑤ 答え合わせ
では、この予測は当たったのか。
フレーム336 の予測はこうでした——25フレーム後に自分は levelX 318・足y208、クリボーは levelX 298。
25フレーム後の実機がこれです。

| 予測 | 実測 | |
|---|---|---|
| マリオ | levelX 318 / 足y 208 | levelX 318 / 足y 208 |
| クリボー | levelX 298 | levelX 297 |
自分はぴたり、クリボーは 1px。 絵のとおり、クリボー(黄)はマリオ(緑)の左に来ています——跳び越えました。
ただし前回書いたことをもう一度置いておきます。平均は当てになりません。 同じ 1-1 の走行で、クリボーの位置を答え合わせした 536 件の平均は 横0.5px・縦0.7px でしたが、いちばん外れた件は縦 36pxでした。
この絵は、当たっている場面も外れている場面も同じ形で出ます。だから使い道は「当たっていることを確認する」ことではなく、外れている場面を見つけることのほうです。
⑥ なぜこの絵を作ったか
最後に、この絵が生まれた経緯を書いておきます。
2026年8月11日、私は同じ作業の中で「予測モデルは正しい」「予測が間違っている」「自分の観測が間違っていた」を繰り返しました。そのたびに数字を並べて説明したのですが、私が数字を読んで説明する限り、読み違えがそのまま報告になるわけです。
そこで、人が直接見て判断できる形にしました。それがこの絵です。
以降の回に出てくる修正は、ほとんどがこの絵で見つけたものです。「ゲッソーの縦のサイズがおかしいのでは」「リフトが右に進むあいだ長さが2倍になっている」「軌跡に敵が触れているのに進んでいる」——どれも、数字を見ていたら気づけませんでした。
まとめ
- 右半分は画面の絵を1ドットも使っていない。地形・敵・自分の3つの入力だけで組み直したもの
- 地形は 16px のマス目・13行、返る値は固形/空/分からないの3値
- 敵の枠は箱ではなく当たる範囲。横も縦も物ごとの実測で、クリボーは横 ±10(両側21px)。測れていない相手だけ既定の窓
- 点は未来。水色が自分、色つきが敵、枠は行動が終わる時点。赤い軌跡は「どの手も死ぬ」
- 答え合わせ:25フレーム後の自分はぴたり、クリボーは 1px。ただし最悪は縦36px
- この絵の使い道は、当たりを確認することではなく外れを見つけること
次回からは要素を1つずつ見ていきます。第1弾はクリボー——どのステージに出て、実機ではどう歩き、当たる範囲はどこまでで、どうすれば踏めるのか。そして、そこで私が外していたことを。
2026-09-16 の訂正と、その後
この回を書いたあと、自動プレイの側が大きく変わりました。この記事の記述のうち、いまと違うところを挙げておきます。
- 敵とマリオの当たり箱は、実測ではなく ROM の表から引くようになりました。 物ごとの箱は RAM
$049a + スロットが行を指し、 ROM$e1fdから4バイトずつ(左・上・右・下のずれ)並んでいます。マリオも同じ表で、大きいマリオが2,8,14,32、小さいマリオが3,20,13,32です。 - 踏みか傷かの判定も ROM の形に揃えました(
$d8f9)。縦速度の整数部が正、または id ≧ 7 で「マリオの生y + 12 < 敵の生y」なら踏み、 どちらでもなければ傷です。当たりを見るのは偶数フレームだけで、重なり始めた最初の1回だけ当たります($0491)。 - 走行の現在地(2026-09-16): ブラウザのベンチで本編32面を単面で全部クリア(100点)、通しは 1-1 から 5-1 まで(51.6点)。 ヘッドレスの32面は、無敵なしで 32/32(うち30面はミス0)、無敵ありで 32/32(全面ミス0)です。
- ③で書いた「敵ごとに実測した横の帯(クリボーは ±10・両側21px)」は、いまは使っていません。上の ROM の表に置き換えました。 図の黄色い枠が 23px で描かれている件も同じで、いまは表から引いた箱を描いています。
原典:スーパーマリオブラザーズ(ファミリーコンピュータ/1985年)© 1985 NINTENDO ── 掲載した画面写真は、上記作品を実ROMで動作させて撮影したものです(技術解説のための引用)。図は撮影した画面に、こちらで作成した解析用の描画を重ねたものです。原権利者の許諾・監修を受けたものではありません。