ブラウザー / 体験型ケーススタディ / 読了目安:16分

Dino:ゲームはなぜだんだん速くなる?

REA で Chromium 系の恐竜ゲームを調査。加速ルールを読み解き、速度調整を追加して、浮動小数点の境界ケースを検証します。

このページの内容

01. 解析する前に試してみる

再生を押して障害物を飛び越えてみましょう。速度スライダーを3から12に動かすと、障害物はすぐに速くなります。自動加速を再び有効にすると、数値が6.000からゆっくり増えていきます。

速度の実験試す / 観察する / 説明する
速度 6.000クリア数 0
おなじみのゲーム。そのルールを一つ調べる。

「再生」の後に「ジャンプ」を押してください。スライダーを動かすと固定速度になります。

新たに制作した学習用ゲームです。調査記録に基づくのは加速ルールのみです。

作るもの

遊べる実験と、五つの更新回数で検証した速度関数。

調査の前に

ラボはこのページで使えます。調査には、エージェントに接続した REA、Chrome、ゲームの公開 HTTP 版が必要です。未接続の場合はインストールガイドから始めてください。 REA を設定する →

02. 調査できるバージョンに接続する

wayou の公開 t-rex-runner を、デバッグ用の別の Chrome プロファイルで開きます。以下は macOS 用コマンドです。Windows や Linux では Chrome の実行ファイルに同じフラグを付けてください。調査中はこのブラウザーとターミナルを開いたままにします。

このチュートリアルの対象は chrome://dino ではなく HTTP ページです。ページが変更されている場合は、実際に読んだスクリプトを保存し、ダイジェストを記録してから以下の過去の結果と比較してください。

ターミナル
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --remote-debugging-address=127.0.0.1 \
  --remote-debugging-port=9222 \
  --user-data-dir="$(mktemp -d /tmp/rea-dino.XXXXXX)" \
  https://wayou.github.io/t-rex-runner/
この調査用プロンプトをコピー
REA で http://127.0.0.1:9222 に対して list_browser_targets を実行してください。URL で t-rex-runner のページを選び、include_script_sources を有効にして inspect_web_page を実行します。読み込まれた index.js を読み、初期速度、加速量、更新条件、速度のしきい値を特定し、ソースの位置を示してください。まだゲームを再実装しないでください。

03. 「更新1回」の意味を確かめる

ACCELERATION という設定名は手がかりですが、それだけでは説明になりません。どこで使われるかを追い、描画のたびか、プレイ中のみか、衝突しなかったときだけかを確認します。正常に進む場合だけの答えにならないよう、周囲の条件もエージェントに示させてください。

記録された版は速度6で始まり、更新条件を満たすとき、現在の速度が13未満なら0.001を加えます。「毎秒0.001」ではありません。この学習用ゲームは毎秒60回の固定ロジック更新を行い、画面のリフレッシュレートとは独立して描画します。

  • 1回の更新前後の値を記録する。
  • 加算を囲む衝突やプレイ状態の条件を探す。
  • しきい値の判定が加算の前か後かを確認する。
  • フレームの時間処理と計算ルールを分ける。

04. 元のルールを保って速度調整を追加する

ルールを目で確認できる最小のゲームを作ります。単純なキャラクター、障害物一つ、ジャンプボタン、速度表示を用意します。スライダー操作で固定速度に切り替え、自動モードを有効にすると記録された初期値へ戻るようにします。

条件式を黙って「13で打ち止め」に変えないでください。無害な整理に見えても、境界で結果が変わります。最初は読み解いた通りに実装し、意図的な変更は別モードで行います。

この調査用プロンプトをコピー
再生・一時停止、ジャンプ、やり直しができる独立したブラウザーミニゲームを作ってください。記録された速度更新ルールだけを再現します。2〜18の固定速度スライダーと、6から始まる自動モードを追加してください。固定時間刻みを使い、画面外では停止し、キーボードとタッチに対応します。新しい描画・衝突・ジャンプ処理は学習用コードと明示し、速度関数の複製ではなくインポートした関数をテストしてください。

05. 余分な0.001を調べる

衝突なしで速度関数を繰り返し実行します。丸め前の値を保存し、以下の確認点と比較してください。意外な最終値こそ、この演習のポイントです。比較は加算前に行われ、浮動小数点を繰り返し加算しても、10進のしきい値にぴったり到達するとは限りません。

10,000回の更新で13.000になるなら、ループ内に上限処理や小数の丸めがないか確認してください。画面のリフレッシュレートで結果が変わるなら、描画1回ごとにシミュレーションを進めていないか確認します。

この調査用プロンプトをコピー
初速6から実際の加速関数を0、1000、4000、7000、10000回更新してください。完全精度の値と小数第3位までの表示を返します。元の報告と比較し、差異を説明してください。実行したのが当サイトの代替実装か元のゲームかを明記し、ソースを読んだだけで元のゲームの動作テストを行ったとは扱わないでください。

06. 既知の結果と比較する

以下を明確な確認点として使います。一致しても、この小さなルールを裏付けるだけで、アプリ全体の互換性を示すものではありません。

更新回数期待される表示確認できること
06.000初期値
1,0007.0001回の更新での加算量
4,00010.000累積
7,00013.000丸めが境界の差を隠す
10,00013.001加算前に比較

両方を同じフォルダーに保存し、Node.js で検証を実行します。パッケージのインストールは不要です。

ターミナル
node check-case-labs.mjs

07. 実際に検証したのはどこまで?

REA の報告には、元の HTTP ゲームを条件を制御して実行した記録があります。当サイトは独自の速度モジュールをその記録と比較しています。元ゲームの調査は再実行していません。上の描画、ジャンプ、衝突、障害物の間隔は新しい学習用コードで、再実装の対象は加速ルールだけです。

当サイトの数値テスト結果を読む →

出典: REA の電卓・恐竜ゲームの検証記録 · 固定コミットのゲーム更新分岐。チュートリアル、図、ブラウザー実験は独自制作です。

次の実験16発の弾はどうやって自機の位置を狙う? →

REA は初めてですか? REA とは? · ガイドの検証方針