技術部の御供餅です。前回のクッパに続いて、今日はマリオ自身の体です。
敵より単純そうに見えて、ここがいちばん何度も間違えました。幅・足・横・頭の4つとも、一度ずつ外しています。
この回の実測はすべて 1-1 から 1-4 までの走行で採りました。今日の成績は 1-1 ミス0/1-2 ミス0/1-3 ミス1/1-4 ミス2 で、4面ともクリアです。
本記事は LLM による自動執筆パイプラインで生成されました。現在は人間が補助していますが、pareido.jp では最終的に AI が自律的にコンテンツを制作できる仕組みの構築を目指しています。
① 幅は 16 ではなく 14
マス目が16px なので体も16px だろう、と思いますよね。違いました。
実測は「固形に密着したときにどこで止まるか」です。
1-1 の1本目の土管 … ゲームは x434 で停止(速度は 2→5 と上がるのに1pxも動かない)
土管の左端は x448 → 448 − 434 = 14
1-1 の3本目の土管 … 走り跳びの降下中に x722 で横速度が 40→0
土管の左端は x736 → 736 − 722 = 14
14px。 高さは 16px(小マリオ)。★ 大マリオは未検証です。宿題として残しています。
★ 外した話:16 にすると、密着した瞬間に体が固形と重なります。するとその場の全部の候補が「地形0歩目」で排除されて、動けなくなる。実測では 1-1 が levelX434 で停滞しました。2px の差で完全に止まります。
② 足は、左端から 3px 内側
足がどこまで乗っていれば落ちないのか。1-1 の走行から、A を押していないのに接地が「是→否」に変わったフレームを全部拾いました(12件)。
f467 x637(セル内 13px) f589 x766(14)
f800 x941(13) f1226 x1517(13)
f1786 x2254(14) f1807 x2285(13)
f1818 x2302(14) … 12件とも 13 か 14
左端がセルの13px 目に来た時点で落ちます。 セルに3px 残って乗っていても、支えになりません。
★ 外した話:以前は「左端のセルが固形なら乗っている」と見ていたので、地面が3px 長いと読んでいました。実測(1-1 levelX2396):A×12 の着地予定は x2445=セルの13px 目で、式は「階段の上に着地・安全」と答えます。ところが実機はそこに乗れず、そのまま穴へ落ちました。しかもそのあと312フレーム一度も判断できないまま死亡(levelX2594)。着地に失敗すると、落ちている間はどの手も選べないのです。
③ 横は「進んでいく側の縁」だけを見る
右へ動くなら右端(左端+13)、左へ動くなら左端(左端+2)。進む側だけです。
★ 外した話 (1):以前は左端と右端の両方を、体の高さ全部で見ていました。するともう出ていく側(後ろ)の上角が天井のマスにかかっただけで、x が凍る。実機は素通りします。
実測(1-2 のフレーム5820):
- 実機:x1275 → 1276 → 1277 … と、上がりながら右へ進み続ける
- 式:左端 1277 が固形のマスに入った時点で「当たった」と読んで x が凍り、以後実機と離れて、最後は 12px 手前で穴に落ちる
★ 外した話 (2):頭の行を横の壁として数えてはいけません。 上の角だけが固形のとき、実機はそのまま横へ進みます(頭を打つのは上へ動いたときだけ)。
実測(2-2 の通し・フレーム24626):式のマリオは足y70 で右のマスの固形に触れ、そこから x2082.2 に30フレーム貼り付いたまま沈みました。実機は同じ60フレームで +28px 進んで穴の上へ出ています。沈みながら前へ出る動きが、式から消えていたわけです。
④ 頭は、たった1点で見る
ここが今日の本題です。
頭の当たり判定は、体の幅ではありません。左端から d px の1点だけです。
★ 外した話:体の幅で見ようとして、2通り試して2通りとも壊しました。
- 「振れ幅のどれかが頭を打ったら、その手は頭を打つ」→ 1-1 が 停滞(levelX2206)・通し 9351F
- 左右2点(
x+2とx+9)で見る → 1-2 が穴の手前で停滞・通し 9727F
実機は天井の角を実際にすり抜けます。だから幅で見るのが誤りでした。
dはどう決めたか ── 両側から挟む
1点だと決めたら、次は「どの点か」です。片側だけでは決まりませんでした。
打った側(実機が頭を打った瞬間の記録)。1-2 の天井(x1264〜1279)で、3機とも同じ場所で3件。
x1271 足y173 頭y157 その行の x+0..15 の固形: #########.......
→ 当てはまる d は 0〜8(9 は空セル)
打たなかった側(上昇中に頭の行に固形があったのに打たなかったフレーム。その d は判定点ではない)。★ これを今日、1-1 から 1-4 まで測り直しました。
| 面 | その面で除外された d |
|---|---|
| 1-1 | 0, 1, 2, 3, 4, 5, 14, 15 |
| 1-2 | 0, 1, 2, 3, 4, 13, 14, 15 |
| 1-3 | 9, 10, 11, 12, 13, 14, 15 |
| 1-4 | 14, 15 |
和集合は 0〜5 と 9〜15。残るのは——
d は 6・7・8 のどれか。それ以外はあり得ません。
★ 注目してほしいのは 1-3 が 9 を除外していることです。この連載を始める前まで、式は 9 を使っていました。それは製品の走行ではなく、専用の道具で測った値だったのです。道具は「跳ぶ前の x」を記録するので、1px ずれます。
6・7・8 のどれか
ここから先は実測では分けられません。走行で比べました。
d |
単面(正規32面) | 通し |
|---|---|---|
| 7 | 2-1 が停滞(levelX1982) | 16945F |
| 8 | 8面中7面クリア(落ちるのは 2-4 だけ) | 23144F |
| 9 | 1-2 と 2-4 が落ちる(6面) | 29954F |
通しの長さだけを見れば 9 がいちばん良いのです。それでも 8 を採りました。9 は実測の外だからです。
★ ここは書いておきたいところで、成績で寸法を決めてはいけないと思っています。そして逆に、1面のために全部の面に掛かる寸法を動かすのも間違いです。この 9→8 も、もとは 1-2 の1件を直すために動かしたもので、そのとき 1-3 を落としました。動かしてよいのは「実測でその値が誤りだと示せたとき」だけです。
⑤ 走行で確かめる

緑の枠を、後ろの格子と見比べてください。マス目より2px 狭い。 この2pxが、①で書いた「16 にすると動けなくなる」の正体です。
第2回で出した階段の絵も、同じことを見るのに使えます。

そして今日の 1-1 から 1-4 の走行で、もう1つ分かったことがあります。
4面とも、実機は一度も頭を打っていません。 HeadBonk の記録は4面とも「頭打ちなし」でした。天井を避けきって走っている、ということです。
(そのぶん、d を絞る材料は「打たなかった側」しか採れませんでした。打った側の記録は増えていません。)
まとめ
- 幅は 14px(16 ではない)。土管への密着で 448−434=14、736−722=14。16 にすると動けなくなる
- 足は左端から3px 内側。12件とも「セルの13px 目」で落ちた。セル全体で見ていた頃は地面を3px 長く読んで、落ちてから312フレーム何もできずに死んだ
- 横は進む側の縁だけ。両側で見ると、出ていく側の角で x が凍る。頭の行は横の壁として数えない
- 頭は1点。幅で見る案は2通り試して2通りとも壊れた
- ★ 今日、1-1〜1-4 だけで
d ∈ {6,7,8}を再現できた。1-3 が 9 を除外する——以前の 9 は道具で測った値だった - ★ 通しの成績は 9 のほうが長い(29954F 対 23144F)。それでも 8 を採った。成績で寸法を決めない
- 高さ 16px は小マリオだけ。大マリオは未検証
次回はファイアバー・リフト・水中です。回る線分をどう当てるか、往復する足場の幅をどう測るか、水の中でひとかきが効く条件は何か——どれも「箱で近似しようとして外した」話がついてきます。
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)です。
- 体の寸法(幅14・高さ16・頭の判定点は左から8px)は、いまも同じです。
変わったのは当たり箱で、マリオのぶんも ROM の表から引いています(大きいマリオ
2,8,14,32/小さいマリオ3,20,13,32)。
原典:スーパーマリオブラザーズ(ファミリーコンピュータ/1985年)© 1985 NINTENDO ── 掲載した画面写真は、上記作品を実ROMで動作させて撮影したものです(技術解説のための引用)。図は撮影した画面に、こちらで作成した解析用の描画を重ねたものです。原権利者の許諾・監修を受けたものではありません。