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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Reach on SANMA — ブラウザだけで遊べる三人麻雀。通信なし・1ファイル・打ち筋の違う5人のCPU(覗き見なし)
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Reach on SANMA — ブラウザだけで遊べる三人麻雀 インストール不要・通信なし・依存ライブラリなしの三人麻雀(サンマ)です。 app/index.html をブラウザで開くだけで遊べます。ファイルをローカルに置いたまま(file://)でも、 静的ホスティングに置いても動きます。 • 紹介ページ: • ゲーム本体: • 1 ファイル版: app/standalone.html(約 110 KB。これ 1 つで配布できます) 打ち筋の違う 5 人の CPU(半荘ごとに 2 人が卓に着く)と 3 段階の強さ。北抜き・ツモ損ありの三麻ルール。 CPU は他家の手牌・山・裏ドラを一切見ていません(tests/audit.js で検証)。 名前はリーチ(reach)と、三麻=秋刀魚の駄洒落から。アイコンは炭火の秋刀魚と北の牌です。檢視完整 README ↗
インストール不要・通信なし・依存ライブラリなしの三人麻雀(サンマ)です。
app/index.html をブラウザで開くだけで遊べます。ファイルをローカルに置いたまま(file://)でも、
静的ホスティングに置いても動きます。
app/standalone.html(約 260 KB。顔アイコンも埋め込み済みで、これ 1 つで配布できます)対戦相手は猫街三部作(猫街ろまん/猫が消えた街/街と、その白い壁)の 6 人。ナオ・フミ・マキ・チカ・タコ大王・イカ女王から
半荘ごとに 2 人が卓に着き、ひとりずつ打ち筋が違います。和了や優勝のときは顔アイコンとひとことで喜び、
あなたが和了ると放銃した人がくやしがります。強さは 3 段階。北抜き・ツモ損ありの三麻ルール。
CPU は他家の手牌・山・裏ドラを一切見ていません(tests/audit.js で検証)。
名前はリーチ(reach)と、三麻=秋刀魚の駄洒落から。アイコンは炭火の秋刀魚と北の牌です。
Reach on SANMA is a three-player riichi mahjong (sanma) game that runs entirely in the browser.
No install, no sign-up, no network traffic, no dependencies. Open app/index.html and play,
or grab the single-file build app/standalone.html (~260 KB) and play offline.
node tests/audit.js plays 300 hands with a guard that throws on any access to hidden tiles, and reports zero violations.The name is a pun: reach (riichi) and sanma, which means both "three-player mahjong" and "Pacific saury" — hence the grilled fish on the icon.
reach-on-sanma/
├── index.html 紹介ページ(GitHub Pages のトップ)
├── assets/ 紹介ページ用(site.css・アイコン)
├── make_icon.py アイコンの生成スクリプト
└── app/ ゲーム本体(ここが実体)
├── index.html これを開く
├── standalone.html 1 ファイル版(build.js が生成)
├── build.js index.html に CSS/JS を埋め込むビルドスクリプト
├── css/style.css
├── js/
│ ├── tiles.js 牌の定義・山・ドラ・表記
│ ├── faces.js 登場人物の顔アイコン(tools/make_faces.py が生成)
│ ├── hand.js シャンテン数・和了判定・待ち・受け入れ
│ ├── yaku.js 役判定・符計算・点数計算
│ ├── ai.js CPU の思考ルーチン
│ ├── game.js 局進行のステートマシン
│ └── ui.js 描画と操作
└── tests/
├── test.html ブラウザで開くセルフテスト
├── run.js `node tests/run.js` で実行
├── audit.js CPU が覗き見していないことの検証
└── characters.js キャラクター別の成績を再測定
ソースを編集したあとは app/ で node build.js を実行すると standalone.html が作り直されます。
app/index.html をダブルクリック)。画面上部のボタン:
| ボタン | 内容 |
|---|---|
| 敵 | CPU の強さ(やさしい/ふつう/つよい) |
| ヒント | 自分の手牌のシャンテン数/待ちと残り枚数を表示 |
| 速度 | CPU の打牌速度(遅/普/速/瞬) |
| 新規 | 顔ぶれを選んで最初からやり直す。あなたのキャラ(名なしも可)と対戦相手を 6 人から選ぶ。選んだ順に下家・上家、選ばなかった席はおまかせ。選んだ顔ぶれはブラウザに保存 |
| ルール | 採用ルールの一覧 |
iPhone Air(CSS ピクセルで 420 × 912)を基準にした固定レイアウトです。 捨て牌や副露が増えても他の要素がずれないよう、各段の高さは中身ではなく 牌の寸法から決めています。
操作ボタン
局情報(局 / 残り / 供託 / ドラ表示牌)
下家(手牌 1 段・副露 + 抜きドラ 1 段・河 2 段)
上家(同上)
自分の河 2 段
自分の副露 + 抜きドラ 1 段
自分の手牌 1 段(14 枚が必ず 1 列に収まる)
コマンド
ログ(余った高さを吸収。新しい行が上)
上家・下家は横並びにせず縦に積んで全幅を使うので、河・副露・伏せ牌はすべて自分と同じ寸法です。 並び順は手番の流れどおり(自分 → 下家 → 上家 → 自分)で、直前に打つ上家が手牌のすぐ上に来ます。 ログを最下段に置いているのは、iPhone の Safari で画面下のツールバーが重なっても、隠れるのが古いログだけで済むようにするためです。
牌の寸法は盤面の幅から計算しているので、画面幅が変わっても手牌は 1 列のままです。 縦に余裕がない端末では牌を段階的に小さくして 1 画面に収めます (420×912 / 393×852 / 390×668 / 360×640 / デスクトップで、スクロールなしを確認済み)。 河が 2 段を超えた場合だけ、その枠の中だけがスクロールします(レイアウトは動きません)。
| 見た目 | 意味 |
|---|---|
| 明るい牌面 | 手出し(手牌から選んで切った牌) |
| 沈んだ牌面 | ツモ切り(引いてきた牌をそのまま切った牌) |
| 赤枠 | リーチ宣言牌 |
| 薄い牌 | 鳴かれた牌 |
手出しのほうが多い(実測で約 7 割)ので、少数派のツモ切り側に印を付けて河が騒がしくならない ようにしています。鳴かれた牌も河に残すので、フリテン判定や現物読みの材料はそのまま残ります。
タイトルの「三人麻雀」を 3 秒以内に 5 回叩くと、相手の手牌が表向きになり、
席の見出しに相手のシャンテン数と待ちも出ます。暗槓も 4 枚とも表になります。
もう一度 5 回叩くと元に戻ります。URL の末尾に #open を付けて開いても同じです。
発動中はタイトルが金色になり ◉ が付きます。
変わるのは画面だけで、CPU の打ち方には一切影響しません。
この機能は js/ui.js の描画部分だけに閉じていて、ゲーム進行にも CPU の思考にも
触れていません(node tests/audit.js でこれまでどおり覗き見なしを確認できます)。
基本
鳴き・進行
点数
未実装
九種九牌・四風連打・四家立直などの途中流局、および九蓮宝燈・流し満貫は入っていません。
打牌は次の式で評価します。α・β・γ はキャラクターごとの重みです。
評価 = -シャンテン数 * (500 + 500 * α速度)
+ 受け入れ枚数 * 8 * α速度 ← 場に見えていない残り枚数で加重
+ 打点期待値 * β打点 ← ドラ・赤・抜きドラ・役牌・染め手
- 危険度 * 2 * γ守備 ← 他家リーチに対する無筋の危険度
シャンテン数の重みも α に連動させているので、打点型は手を進めるよりドラや染め手の形を
残すことを選び、速攻型は形を崩してでも手を進めます。リーチ判断では、リーチを打たなかった
場合の翻数を実際に evaluate() で見積もって、ダマに構えるかどうかを決めています。
半荘ごとに、猫街三部作の 6 人から 2 人が重複なくランダムで選ばれます。
| α速度 | β打点 | γ守備 | 副露基準 | リーチ | オリ移行 | |
|---|---|---|---|---|---|---|
| ①ナオ(均) | 1.0 | 1.0 | 1.0 | 1翻確定以上 | ほぼ即リー | 無筋2枚以上でノーテン時 |
| ②フミ(攻) | 1.2 | 1.1 | 0.3 | 緩め | 即リー | ほぼしない(テンパイなら全押し) |
| ③マキ(速) | 1.8 | 0.2 | 0.8 | 2向聴から鳴く | ダマ多め | テンパイ以外は降りる |
| ④チカ(目) | 1.1 | 1.0 | 1.2 | 1翻確定以上 | ほぼ即リー | 他家リーチで2向聴以上なら降りる |
| ⑤タコ大王(打) | 0.4 | 2.5 | 0.9 | 染め手のみ | 打点足りればダマ | 手役崩壊時のみ |
| ⑥イカ女王(守) | 0.9 | 0.6 | 2.5 | 役牌のみ | 打点条件付き | 他家リーチで即ベタオリ |
チカだけは、ドラ(赤・抜きドラ込み)の見積もりに 2.5 倍の重み(doraW)がかかります。
和了・優勝・放銃のときのひとことは、js/ai.js の talk にあります。
各キャラをナオ 2 人と 600 局戦わせた実測値です。太字が、そのキャラの看板にあたる数字。
| 和了率 | 放銃率 | 平均打点 | 満貫率 | 和了時ドラ | リーチ率 | 副露率 | 流局時テンパイ | |
|---|---|---|---|---|---|---|---|---|
| ナオ | 25.3% | 14.6% | 8838 | 61% | 2.61 | 43% | 23% | 52% |
| フミ | 29.2% | 22.5% | 9265 | 63% | 2.70 | 37% | 39% | 76% |
| マキ | 26.8% | 15.7% | 7385 | 44% | 2.10 | 23% | 48% | 66% |
| チカ | 32.5% | 18.4% | 8621 | 59% | 2.59 | 46% | 27% | 78% |
| タコ大王 | 29.8% | 19.1% | 9524 | 71% | 2.73 | 39% | 11% | 68% |
| イカ女王 | 22.5% | 10.8% | 8036 | 61% | 2.28 | 33% | 22% | 40% |
フミは最も放銃しながらテンパイまで押し、マキは最も鳴いて最も安く、チカは最も和了して流局でも最もテンパイしており、 タコ大王は最も鳴かずに最も高く、イカ女王は最も放銃せず最も降りる、という形で看板どおりに分かれています。 「和了時ドラ」は和了 1 回あたりのドラ・赤ドラ・抜きドラ・裏ドラの翻数の平均です。 チカはドラを重く見ますが、この数字はタコ大王やフミとほぼ同じで、差はむしろ和了率と降りの早さに出ました。
node tests/characters.js で再測定できます。
キャラクターとは別に、CPU の腕前を 3 段階で選べます。打ち筋が「どう打ちたいか」、 難易度が「それをどれだけ正確に実行できるか」です。
CPU は他家の手牌・山・王牌・裏ドラを一切見ていません。 参照しているのは自分の手牌と、
河・副露・ドラ表示牌という誰にでも見える情報だけです。node tests/audit.js を実行すると、
CPU の思考中にそれらへアクセスしたら例外を投げる状態で対局を回して検証できます。
| 場の残り枚数を読む | ドラの見積もり | 打牌精度 | |
|---|---|---|---|
| やさしい | 読まない | 甘い | 45% は次善手 |
| ふつう | 読む | やや甘い | 20% は次善手 |
| つよい | 読む | 正確 | 常に最善手(評価式の中で 1 位を選ぶ) |
「常に最善手」は評価式の中で 1 位の牌を選ぶという意味で、麻雀として最善という意味ではありません。
牌の定義・シャンテン計算・役判定・符・点数についての自己テストが入っています。
cd app
node tests/run.js # コンソールで実行
tests/test.html をブラウザで開いても同じテストが走ります。
シャンテン計算については、実装を差し替えても壊れていないことを確認できるよう、 総当たり版との突き合わせで検証しています(ランダム 6000 手牌で一致を確認済み)。
MIT License。依存ライブラリ・外部の画像素材は使っていません(アイコンは make_icon.py で生成)。
登場人物の顔は、同じ作者の「街と、その白い壁」の立ち絵を tools/make_faces.py で切り抜き、
app/js/faces.js に埋め込んだものです(1 ファイル版でも表示されます)。