BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기転がして、全部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 で作り直します。