穴子がデカすぎた話
すし積む 開発の記録 / 2026年9月
2026年10月8日に追記しました。この記事の数字は9月8日の版のものです。そのあと、9月10日にもう一度、寸法と降ってくるネタを変えています(いちばん下の「その後」)。
「すし積む」を作り終えたあと、ひとつ引っかかっていることがありました。最後のネタ、金のすし桶に、一度も辿り着けない。
自分で何度遊んでも、その手前の伊勢海老すら滅多に見ない。感覚としては「穴子がデカすぎる」。でも、感覚で寸法をいじると、たいてい別のところが壊れます。まず測ることにしました。
測る仕掛けを作る
ゲームは HTML 一枚で、時間の進みは requestAnimationFrame に任せています。そのままだと一戦に数分かかるので、時計を自前のものに差し替えました。requestAnimationFrame と setTimeout を横取りして、こちらから好きな速さで進める。絵を描く処理も空にすると、一戦が約 2 秒で終わるようになりました。
あとは、合体を最優先しつつ、山が落ち着くまで待ってから置く、という程度の打ち手を書いて、放っておくだけです。
百戦まわして分かったこと
まず、素の状態で百戦。
点 最低 12,337 / 中央 21,664 / 最高 44,622
到達した最高ネタ 大トロ 43戦 穴子 52戦 伊勢海老 4戦 金の桶 0戦
金の桶はゼロ。では、どこで詰まっているのか。一段上げる歩留まり——下から二つ合体して一つ作れた割合——を並べると、はっきりしました。
| 合体 | 歩留まり |
|---|---|
| サーモン → マグロ | 94.0% |
| マグロ → いくら軍艦 | 91.9% |
| いくら軍艦 → ウニ軍艦 | 86.9% |
| ウニ軍艦 → 大トロ | 71.4% |
| 大トロ → 穴子 | 55.2% |
| 穴子 → 伊勢海老 | 13.1% |
| 伊勢海老 → 金の桶 | 0.0% |
なだらかに落ちてきて、穴子のところで崖になっています。作れた穴子 61 本のうち 53 本(87%)が、しまいの盤面にそのまま残っていました。合体まで漕ぎ着けたのは 8 本だけ。
穴子は、確かにおかしかった
寸法を並べ直すと、一目で分かりました。桶の内側の幅は 336 です。
| ネタ | 幅 | 高さ | 幅/内寸 | 前段からの伸び |
|---|---|---|---|---|
| 大トロ | 149 | 83 | 44% | ×1.34 |
| 穴子 | 247 | 71 | 74% | ×1.66 |
| 伊勢海老 | 230 | 107 | 68% | ×0.93 |
| 金の桶 | 210 | 210 | 62% | ×0.91 |
穴子が、ゲーム中で一番太い駒でした。そのあとに来る伊勢海老よりも、最終形の金の桶よりも太い。幅の伸びも、他の段が 1.0〜1.34 倍のところ、ここだけ 1.66 倍。
結果として、穴子が一本寝ると、横に残る隙間は 336 − 247 = 89。ここに置けるのはサーモン(幅 85)までで、ウニも大トロも入りません。穴子が桶を横断して、その先の道を塞いでいたわけです。
ちなみに面積の梯子は綺麗でした。どの段も「前の段二つ分の 0.70〜0.71 倍」で一定。壊れていたのは幅の順序だけです。
直してみる。ただし測ってから
横幅だけを 4/5(247 → 198)にして、また百戦。
| 中央値 | 最高 | 穴子 | 伊勢海老 | 穴子→伊勢の歩留まり | |
|---|---|---|---|---|---|
| 247 × 71(元) | 21,664 | 44,622 | 61本 | 4匹 | 13.1% |
| 198 × 71 | 24,858 | 47,392 | 79本 | 12匹 | 30.4% |
| 205 × 85(面積を保つ) | 25,149 | 36,350 | 33本 | 1匹 | 6.1% |
面白かったのは三行目です。面積を保ったまま細くした案では、終盤がまったく動きませんでした。効いていたのは「細い」ことそのものではなく、穴子が桶を横断しなくなって、その隣に大きいネタを並べられるようになったこと。
それでも金の桶には届かない
伊勢海老は三倍出るようになりました。でも金の桶はまだゼロ。ここで、別の壁が見えてきます。
落ちてくる駒はシャリ・玉子・エビの三種だけ。ガリを差し引くと、一投下あたりシャリ 2.217 個分にしかなりません。一方、
| 作るもの | シャリ換算 | 無駄ゼロでも要る投下数 |
|---|---|---|
| 穴子 1 本 | 256 | 115 |
| 伊勢海老 1 匹 | 512 | 231 |
| 金の桶 1 個 | 1,024 | 462 |
実測の投下数は中央 280、最長でも 426。一個も無駄にしなくても手数が足りていませんでした。伊勢海老の 231 投下がちょうど境目で、百戦で 12 回という実測とも合います。
本当の原因は、寿司が大きすぎたこと
スイカゲームでは「双子スイカ」を作る人がいます。あれが成立するのは、最後の果実が箱に対して十分小さいからです。うちはどうか。
金の桶を一つ据えたまま、2匹目の伊勢海老を作らないといけない
金の桶210 + 伊勢海老107 + 伊勢海老107 = 424px > 使える高さ 302px
横に並べる 伊勢海老230 × 2 = 460px > 内寸 336px
縦にも横にも入りません。運や腕前の問題ではなく、入る隙間が存在しない。
そこで、ネタの寸法を一律 0.8 倍にしてみました。金の桶の直径が 210 → 168 になり、桶の内寸 336 のちょうど半分になります。
| 中央値 | 最高 | 金の桶に到達 | 伊勢海老に到達 | 1戦 | |
|---|---|---|---|---|---|
| 等倍 | 24,858 | 47,392 | 0 / 100戦 | 12% | 3.7分 |
| 0.8 倍 | 58,741 | 103,630 | 7% | 65% | 7.7分 |
ようやく道が通りました。伊勢海老はほぼ毎回そこまで行き、金の桶も十数戦に一度は出ます。双子は、それでも六十戦で一度も出ませんでした——これは失敗ではなく、たぶん正しい状態です。手が届く場所にある伝説になった、ということなので。
番付も引き直した
点の出方が 2.4 倍になったので、番付の判定値も全部やり直しです。最上段は、金の桶に届いた試合の点が揃って 86,000 以上だったのに合わせて 85,000。数字は前と同じですが、意味が変わりました。前は誰にも出せない飾りで、いまは「金の桶を出したら伝説」です。
出したあとに、もう一度測った
直した状態のまま、公開しているものと同じ中身で三百戦まわし直しました。100 戦で見えた形が、そのまま続いています。
| 測ったもの | 三百戦 |
|---|---|
| 点の中央値 | 59,305 |
| いちばん高かった点 | 163,426 |
| 穴子一本焼きに到達 | 99% |
| 伊勢海老に到達 | 73% |
| 金のすし桶に到達 | 10%(31 戦) |
| 金の桶を一戦で二つ | 0 |
| 1 戦の長さ(中央値) | 7.7 分 |
| 置いた数(中央値) | 589 |
| いちばん長い連鎖 | 10 |
打ち手は tools/sim/bot.js。合体を最優先し、山が落ち着くまで待ってから置く、という程度のものです。人が遊ぶともっと上手くも下手にもなりますが、直す前と後を同じ物差しで比べるには十分でした。
教わったこと
感覚は当たっていた。でも、原因は思っていたところになかった。
「穴子がデカすぎる」という違和感は正しかったんです。ただ、穴子を細くしただけでは終盤は動かず、本当の原因は寿司全体が桶に対して大きすぎたことでした。一箇所を疑って直していたら、たぶん永遠に辿り着いていません。
三百戦の統計を取るのにかかった時間は、合計で十分ほどです。勘で三回いじって確かめるより、ずっと速くて確かでした。
その後(9月10日):もう一度、変えた
この記事のあと、ゲームを CrazyGames に出して落ちました(くわしくは別の記事)。見直したのは、桶の中の緊張が、審査の数分のうちに一度も起きていないことでした。コミットには、こう書いてあります。自動プレイで測ると、一戦は中央値 594 手・7分半。人が遊べば30分。桶がいつまでも埋まらず、危ない場面が最後まで来ない、と。
変えたのは、段ごとの寸法と面積比は触らずに、「合体して大きくなる感じ」を損なわずに直せる場所だけです。自動プレイで測って選びました。
- 降ってくるネタを、3種から5種に。シャリ・玉子・エビに、サーモンとマグロを足しました(出る重みは 1:1:2:3:2)。一手で積み上がる量が増えて、中央値が 594 手から 279 手になりました。上の段への到達率も上がっています。
- 桶の形。縁を 320 から 250 に、高さを 308 から 378 に。遊ぶ場所が画面の 45% から 62% になりました。
- 伊勢海老と金の桶を、さらに 0.89 倍。穴子から伊勢海老への面積比だけが 1.76 と飛んでいたのが、1.40 に揃いました。金の桶が二つ並ぶときの余りは 0px から 36px になり、W 金の桶(金の桶同士の合体)が、実戦で成り立つようになりました。この処理は前からあったのに、300戦で一度も出ていませんでした。
一戦が半分の長さになったぶん、点も約2割下がっています(自動プレイの中央値 59,305 から 46,529)。番付のしきい値は、60戦の分位点から取り直して、前と同じ当たり方(若手 7%・中堅 28%・花板 40%・大将 17%・伝説 8%)に戻しました。W 金の桶の褒美も、8,000 から 25,000 に上げました。金の桶を一つ作るまでの合体だけで、約 34,000 点入るからです。
W 金の桶に要る手数は、無駄ゼロでも 275 手です。自動プレイは金の桶一個を理想の約 2.0 倍かけて作るので、自動プレイのままでは届きません(40戦で 0 回)。山を整えて打てる人だけが届く、という置き方にしてあります。
上の「0.8 倍」の表の数字(中央値 58,741、1戦 7.7 分など)は9月8日の版のものです。いまの数字とは違います。
この話に出てくるもの
- すし積む(作品ページ) — 何を作ったのか、画面と数字で
- すし積む 遊び方 — ネタ十一段、合体の点数、連鎖、ガリ
- 使っている道具 — 測る仕掛けに使った Playwright と Matter.js
ほかの記録
- すし積むの番付に載らなくなった:ゲームの数字を変えて、サーバーの検算を直し忘れていた(しかも二つ) — 番付に、普通に遊んでも載らなくなった。ゲームの数字を変えて、サーバーの検算を直し忘れていた。金の桶の褒美(8,000→25,000)と、降るネタ(3種→5種)の二つ。注意書きでは守れず、同じ種で出題を比べる検査を足した。
- 押すものを六つから一つに絞った:初めての人は、どれを押せばいいか分からなかった — タイトル画面に押せるものが六つ並んでいた。初めての人に必要なのは最初の一歩だと考えて一つに絞った。iframeで保存が消える問題と、画面を離れたら止まる直しも含めた記録。
- 音は聴けないので、波形を測った:すし積むの和楽器を、WebAudioで作る — 音声ファイルを使わず、箏・太鼓・拍子木・鉦をブラウザで合成した。聴けないので、波形のピークを測って音量を決めた。番付のしきい値も、自動プレイの実測で引き直した記録。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。