Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证転がして、全部1に。サイコロのスライドパズルのタイムアタック / Roll every die to show 1.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
転がして、全部1に。 サイコロのスライドパズルのタイムアタックです。 • 盤に同じサイコロと空きマスが1つ。スワイプすると、空きマスの隣のサイコロがその方向へ転がり、上の目が変わります • 全部のサイコロの上を「1」にしたらクリア。3×3(8個)と 4×4(15個) • どんな並べ方からでも必ず全部1にできます(3×3 は全 15,116,544 状態を総当たりで確認、4×4 は群の計算で証明) • ハード: 1を上にするだけでなく、全部を「正立」(1の三角が奥を指す向き)に揃えます。ランキングは、ふつうとは別です • タイム順のオンラインランキング、結果の共有、実際の速さで再現したリプレイ動画(MP4)の保存、日本語 / 英語 • スマホのブラウザで、インストールなしで遊べます(ホーム画面に追加すればオフラインでも練習できます) • ルール(転がり方・ゴール判定・記録の検証)は src/core/ にまとめ、ブラウザと Worker が同じコードを使います。 • ランキングに載るプレイは、サーバーが問題を出し、送られてきた手順をサーバーで再生して確かめてから登録します。 • 3×3 の問題は、最短手数が 24〜34 手の盤面だけを集めた「問題プール」から出します(易しすぎる・難しすぎる問題を外して、運の差を小さくする)。查看完整 README ↗
転がして、全部1に。 サイコロのスライドパズルのタイムアタックです。
GitHub Pages(静的サイト・PWA) ──fetch──▶ Cloudflare Workers(ランキング API)── D1(SQLite)
src/app 画面・描画・入力 api/src 問題の発行・記録の検証・ランキング
src/core ルール・検証(両方で同じコード) ◀───┘
src/core/ にまとめ、ブラウザと Worker が同じコードを使います。オフラインでも起動できるように、ファイルを端末に持っています(Service Worker)。そのうえで、公開した新しい版がすぐ届くように、次のようにしています。
skipWaiting / clientsClaim)。待機のままだと、このサイトのタブをすべて閉じるまで古い版が出続けるversion.json。ビルドした時刻)を、開いた直後・前面に戻ったとき・タイトルに戻ったとき・10分ごとに確かめる。新しい版が出ていたら、自動で再読み込みする。解いている途中・リプレイ・動画の作成中は待ち、終わってから行う(src/app/update.ts)npm run build は、これらがビルドに入っていることも確かめる(tools/check-bundle-size.ts)| 場所 | 中身 |
|---|---|
src/core/ | ルール・スクランブル・記録の検証・3×3 の最短手数表(ブラウザ・Worker 共通) |
src/app/ | 画面・Canvas 描画・入力・タイマー・記録・多言語 |
src/video/ | リプレイ動画(WebCodecs + Mediabunny / MediaRecorder) |
api/ | ランキング API(Cloudflare Workers + D1) |
tools/ | 表・問題プール・アイコンの生成、可解性チェック、転送量チェック |
tests/ | 単体・API テスト(Vitest)、E2E テスト(Playwright) |
public/ | アイコン、OGP 画像、練習用の問題プール(pool3.bin) |
Node.js 24 以上が必要です。
npm install
npm run dev # 開発サーバー(http://localhost:5173)
npm test # 単体テスト・API テスト
npm run typecheck # 型チェック
npm run lint # Lint
npm run build # 本番ビルド(dist/)と、初回の転送量のチェック(1MB 以下)
npm run test:e2e # E2E テスト(Windows の Edge を使う。PW_CHANNEL=chrome で Chrome に変えられる)
ランキングまで手元で試すとき(開発サーバーは、.env.development の設定で、手元の API http://localhost:8787 につなぎます。API を起動していなければ、練習として遊べます):
npm run db:migrate:local # ローカルの D1 にテーブルを作る(初回と、マイグレーションを足したとき)
npm run dev:api # Worker を http://localhost:8787 で起動(別のターミナルで)
npm run dev
E2E_API=http://localhost:8787 npx playwright test ranked # ランキングの通しテスト
全部のサイコロを「1が上で、正立(1の三角が奥を指す向き = 2の面が奥)」に揃えるルールです。全部が同じ向きでも、横向きや下向きではクリアになりません。
npm run check:solvable-hard で、出題と同じ作り方の問題が実際に解けることを確かめられますHARD_MODE = "1"(api/wrangler.toml の [vars]。手元は api/.dev.vars)のときだけハードを受け付けます.env の VITE_HARD_MODE=1 で出しています。外して公開し直すと、ふつうのルールだけになります.env.development の VITE_LOOK_LAB=1)。案を並べたページは http://localhost:5173/lab.html (?size=4 で 4×4)npm run dev -- --host で起動し、表示された Network の URL を同じ Wi-Fi のスマホで開きますE2E_LAB=0 npx playwright test で、本番と同じビルドを確かめられます(E2E_HARD=0 を付けると、ハードを出さないビルド)npm run build:table # 3×3 の最短手数の表(tools/.cache/dist3.bin、約15MB、コミットしない)
npm run build:pools # 問題プール: public/pool3.bin(5,000問)と api/data/pool3-server.bin(20万問、コミットしない)
npm run check:solvable # ランダムな盤面 3×3・4×4 各1万問が、すべて全部1まで解けることを確かめる
npm run check:solvable-hard # ハードの問題 3×3・4×4 各1万問が、すべて正立まで解けることを確かめる(約1分。初回は窓の表 48MB×3 を作る)
npm run check:tutorial # 練習問題の解答と「1個だけ揃っていないとき」の定石が最短であることを確かめる
npm run check:hard-formulas # ハードの定石(src/core/alignedFormulas.ts)が最短であることを確かめる(約30秒、メモリ約2GB)
npm run make:assets # アイコンと OGP 画像を作り直す
dice-roll)。dice-roll/)の中身を、そのリポジトリのルートに置いて main に push します。
cd dice-roll
git init -b main
git add .
git commit -m "first release"
git remote add origin https://github.com/<ユーザー名>/dice-roll.git
git push -u origin main
https://<ユーザー名>.github.io/dice-roll/ で遊べます。
SNS のリンクプレビュー(OGP)の画像とページの URL は、ビルドのときにこの公開 URL(GitHub Actions が自動で決める。手元のビルドでは .env の VITE_SITE_URL)から作ります。X は一度読んだプレビューをしばらく覚えているので、直したあとに古いプレビューが出る場合は、URL の末尾に ?v=2 などを付けて投稿すると読み直されます。この時点では、ランキングなし(練習専用)で動きます。
クレジットカードの登録は要りません。
npx wrangler login
npx wrangler d1 create dice-roll
表示された database_id を api/wrangler.toml の database_id に貼ります。api/wrangler.toml の ALLOWED_ORIGINS を、Pages の URL のオリジン(例: https://<ユーザー名>.github.io)に書き換えます(手元の wrangler dev では api/.dev.vars の値が使われます)。npm run db:migrate:remote
npm run deploy:api # 問題プールを作り直してからデプロイする
表示された URL(例: https://dice-roll-api.<サブドメイン>.workers.dev)を控えます。VITE_API_BASE = 4 の URL を追加します。サイトの URL の末尾に #admin を付けて開きます(例: https://<ユーザー名>.github.io/dice-roll/#admin)。最初に1回だけ合言葉(管理用トークン)を入れると、その端末に覚えられます。
合言葉は Workers の秘密として設定します(リポジトリには入れません)。変えるときも同じコマンドです。
npx wrangler secret put ADMIN_TOKEN -c api/wrangler.toml # 聞かれたら合言葉を入力する
手元の wrangler dev では、api/.dev.vars の ADMIN_TOKEN(dev-admin-token)が使われます。
記録やニックネームの削除は、コマンドでもできます(--remote を付けると本番、付けないとローカル)。
# ニックネームから端末 ID を探す
npx wrangler d1 execute dice-roll --remote -c api/wrangler.toml \
--command "SELECT device_id, nickname FROM players WHERE nickname LIKE '%探したい名前%'"
# その人の記録を消す(ランキングから外れる)
npx wrangler d1 execute dice-roll --remote -c api/wrangler.toml \
--command "DELETE FROM scores WHERE device_id = '<端末ID>'"
# ニックネームを消す(次に送るときに登録し直しになる)
npx wrangler d1 execute dice-roll --remote -c api/wrangler.toml \
--command "DELETE FROM players WHERE device_id = '<端末ID>'"
# 受け付けなかった記録の理由の内訳(直近7日)
npx wrangler d1 execute dice-roll --remote -c api/wrangler.toml \
--command "SELECT reason, COUNT(*) FROM rejects GROUP BY reason"
src/core/constants.ts の MIN_AVG_GESTURE_MS(1操作あたりの平均間隔の下限、初期値 60ms)。too_fast で弾かれていたら(上の rejects で確認)、値を下げてデプロイし直します(npm run deploy:api と Pages の両方)。tools/lib/solverAligned.ts)の解を入力した記録は、見分けられます: 挑戦の盤面(attempts.scramble)をソルバーにかけた出力と、送られてきた手順(attempts.moves)を比べます。表示名は src/app/i18n/ja.ts / en.ts の appName、src/core/constants.ts の APP_NAME、index.html の <title> と OGP、vite.config.ts のマニフェストにあります。OGP 画像とアイコンは tools/make-assets.ts を直して npm run make:assets で作り直します。