技術部の御供餅です。前回は「空中では B が効かない」でした。今日は敵に当たるか、踏めるかの話です。
この連載でいちばん長く間違えていたのが、ここでした。当たり判定は、目で見て決めてはいけません。
本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作・公開することを目指しています。
① どこに出るか
敵に触れる場面は、どのステージにもあります。今日の図は 8-1 です。緑のパタパタ(ノコノコに翼が生えた相手)が、レンガの上を跳ねながら近づいてきます。

右の絵で、マリオの緑の枠は x125〜138・y192〜206、つまり幅14px・高さ15pxです。この数字は目分量ではなく、絵を復号して数えたものです。図の印は毎回そうやって確かめています。
② 実機で測る ── 当たり箱は ROM に表がある
以前の回では「敵ごとに、当たる横の幅を実測して持つ」と書きました。クリボーなら横 ±10px、というふうにです。
それは遠回りでした。実機は、物ごとの当たり箱を表から引いています。
- RAM
$049a + スロットに、その物が使う表の行番号が入っている - ROM
$e1fdから 4バイトずつ並んでいて、左・上・右・下のずれ(体の左上から)
実際の値を並べるとこうです。
| 行 | 左 | 上 | 右 | 下 |
|---|---|---|---|---|
| 0 | 2 | 8 | 14 | 32 |
| 1 | 3 | 20 | 13 | 32 |
| 2 | 2 | 20 | 14 | 32 |
| 3 | 2 | 9 | 14 | 21 |
行0 と行1 はマリオ自身です。大きいマリオが行0、小さいマリオが行1。違いは「上」だけで、8 と 20 の差 12px がそのまま背の差になります。
つまり、当たりの範囲は測るものではなく、読むものでした。いまの式は、マリオも敵も同じ表から箱を引いています。
③ 式にする ── 当たりは「偶数フレームの、重なり始めの1回」
ROM の当たりの処理($d853)は、3つの条件を順に見ています。
- 偶数フレームだけ見る。フレームの数え(
$09)の下位ビットが立っているフレームは、そもそも当たりを見ません。 - 箱が重なっているか。マリオの箱は
$04ac、敵の箱は$04b0から。 - 重なり始めた最初の1回だけ当たる(
$0491のビット)。重なったまま並走している間は、何も起きません。
そのうえで、踏みか傷かが分かれます($d8f9)。
- マリオの縦速度の整数部が正(=落ちている最中)なら踏み
- または、id が 7 以上の相手で「マリオの生y + 12 < 敵の生y」なら踏み
- どちらでもなければ傷
「落ちていれば踏み」という乱暴な形ですが、実機がそう書いてあるので、式もそう書きます。ここで大事なのは比べる敵の位置で、その敵を動かす前の値を使います。実機は「当たりを見てから敵を動かす」順だからです。逆にすると、同じ1フレームが踏みにも傷にもなります。
④ 外した話 ── 1px 足りなかった
ここからが本題です。2026-09-15 に、8-1 で自動プレイが死にました。予測と実機の位置は合っているのに、死んだのです。
死んだフレームを RAM と並べると、こうでした。
実機 マリオの箱 169〜181 / パタパタの箱 157〜169 → 169 で1px 重なる → 傷
式 マリオの箱 169〜181 / パタパタの箱 156〜168 → 重ならない → 安全
敵の箱が1px だけ高い。 それだけで「安全な手」に見えていました。
原因は当たりの側ではなく、敵の作り方でした。緑のパタパタは、跳ねて上がり、落ちて、また跳ねます。その縦の動きを、式は整数の速度だけで持っていて、小数を捨てていたのです。実機は3つの数で持っています。
$a0… 縦の速さの整数部$0434… 縦の速さの小数$0417… 位置の小数
さらに、着地して跳ね返るときの処理($e163)が書き込むのは $a0 だけで、小数2つはそのまま残ります。式は跳ねるたびに小数を0に戻していたので、跳ねが重なるほど実機からずれていきました。
直したあとの、予測と実機のずれ(1px より大きかった件数)です。
| ステージ | 直す前 | 直した後 |
|---|---|---|
| 8-1 | 301件 | 33件 |
| 5-2 | 62件 | 15件 |
| 2-1 | 25件 | 11件 |

残っているずれは、ほとんどが床に着いたフレームの2〜4px です。そこはまだ直していません。
⑤ 走行で確かめる
当たりの判定は、直したかどうかを走行で確かめられます。触れれば死ぬので、間違っていれば必ず出ます。
- ブラウザのベンチ(人が見るのと同じ画面で計測):本編32面を1面ずつ、全部クリア=100点
- 通し(1-1 から続けて):5-1 まで到達(51.6点)。1-2 と 2-2 でミスし、5-1 で残機切れ
- ヘッドレスの32面:無敵なしで 32/32(うち30面はミス0)、無敵ありで 32/32(全面ミス0)
第1回の時点は 9/32=28.1点、通しは 1-4 まででした。半分以上は、この「当たりの読み違い」を1つずつ潰した結果です。
次回は、ファイアバー・リフト・水中を予定しています。回る棒をどう当てるか、動く床の上でどう位置を決めるか、水の中では何が別物になるか。
原典:スーパーマリオブラザーズ(ファミリーコンピュータ/1985年)© 1985 NINTENDO ── 掲載した画面写真は、上記作品の画面をそのまま記録したものです。図の右半分は、当社の自動プレイが持っている値だけで描いたものです。