一鍵回到牌桌
結算畫面現在可以直接再開一局同樣的遊戲,而「快速匹配」會把你放進一間已經在坐滿的房間,而不是再開一間空房。

通俗版
開始一局遊戲的最佳時機,就是上一局結束的那一秒。證據一直襬在眼前,我們卻把它浪費了:回來打第二局的玩家裡,超過一半是在上一局結束後兩分鐘內開始的——而我們在那一刻給他們的,只是一個回大廳的連結,然後還要選模式、選人數、建房間、等人。
現在結算畫面上有一個「再來一局」按鈕。點一下,你就進入了新的一局:同樣的模式、同樣的人數、空位已經坐滿、遊戲已經開始。不用回大廳,也沒有任何設定要調。

「快速匹配」是同一個問題在大廳裡的另一半。它以前是個按了沒反應的按鈕。現在它會把你送進你所選模式下最合適的一間開放房間:先看是不是真人建的房,再看哪一間最接近開局,最後看哪一間等得最久。只有確實沒有房間可加入時,它才為你新開一間。
技術細節
「再來一局」沒有新增任何服務端介面。它做的正是玩家手動做的事——建房間、逐個安排機器人入座(這個呼叫會挑下一個空位,並行執行會搶同一個座位),然後開局——每一步都以該玩家的身份授權,所以你自己建房時適用的每條規則在這裡同樣適用。
這一點很重要,因為按下按鈕的是誰。首局離場裡十有八九是投降而非破產,所以常見情形是有人離開了一局對其他人還在繼續的遊戲。它能成立,是因為已經退出一局的玩家不再被算作「正在一局中」——這條規則一年前是為另一個原因上線的,如今正是它讓「再來一局」按鈕合法。
「快速匹配」把決策放在一個純函數裡,所以不需要大廳和資料庫就能測試。模式是篩選條件而不是偏好:選了閃電局卻被丟進半小時的經典局,比稍等一會兒更糟。
// lib/lobby/quickMatch.ts — which open room to try, in order
.sort((a, b) => {
// 1. a human host: pool the people who are actually online
if (a.creator_is_bot !== b.creator_is_bot) return a.creator_is_bot ? 1 : -1;
// 2. fewest free seats: a nearly-full room starts sooner
const freeA = a.max_players - a.player_count;
const freeB = b.max_players - b.player_count;
if (freeA !== freeB) return freeA - freeB;
// 3. oldest: whoever has waited longest gets company first
return Date.parse(a.created_at) - Date.parse(b.created_at);
});返回的是排好序的完整列表而不是單一選擇,因為座位數只是一個瞬間快照:呼叫方會沿列表往下走,直到某次加入真正成功——這就避免了兩個人搶最後一個座位、結果兩人都獨自一間房。
