承接上篇核心算法,本文呈現 24 點遊戲的完整工程實現:Swing 界面佈局、發牌邏輯、計分規則、計時器、資源加載、狀態機流轉。代碼採用單類 Calculate24 集中控制,適合中小型桌面遊戲快速原型開發參考。
Check.check() 循環生成直到可解)。繼承 ActionListener,統一處理「開始/刷牌」與「確定提交」兩大事件源。
JFrame frame; // 主窗口
JTextField txtField; // 表達式輸入框
JLabel[] pokers = new JLabel[4]; // 4 張撲克圖片
JTextArea countArea; // 規則/分數/提示區
MyTimer timer; // 計時器
Check checker; // 核心算法實例
float[] myStatus; // 當前 4 張牌數值(1-13, >10 視為 10)
char[] mySuits; // 花色 A/B/C/D
int score = 43; // 實際初始分(刷牌即 -3 變 40)
boolean hasJoker; // 是否含鬼牌(雙倍分標記)
pokerPanel (FlowLayout) 放 4 張牌 + countArea。bottomPanel 放「開始/刷牌」按鈕、提示標籤、輸入框、動態添加的「確定」按鈕與計時器組件。// actionPerformed("start")
timer.reset(); timer.start();
score -= 3; // 刷牌扣分
do {
for i in 0..3:
myStatus[i] = random(1..13);
mySuits[i] = random('A'..'D');
if (myStatus[i] > 10) { diff[i] = myStatus[i]-10; myStatus[i]=10; } // J/Q/K/鬼→10
} while (!checker.check(myStatus)); // 循環直到可解
updatePokerPanel(); // 加載圖片更新界面
if (hasJoker) score += 3; // 內部邏輯修正:發牌扣3分,但含鬼牌不額外加分,此處僅演示邏輯
// actionPerformed("ok")
float result = calculateString(txtField.getText().trim());
if (result == -1) { showMsg("表達式不合法或數字不匹配"); return; }
if (result != 24) { score -= 2; checkLose(); return; }
// 答對計分
timer.pause();
if (hasJoker) {
score += (timer.getSeconds() > 90) ? 8 : 10;
} else {
score += (timer.getSeconds() > 90) ? 4 : 5;
}
checkWin(); // >=100 勝
nextRound(); // 發下一輪
calculateString() 執行三層檢查:
isRightNum() 確認使用的數字與當前牌面一致(順序無關、不可重複使用)。通過後委託 checker.string_float() 計算結果(複用上篇優先級解析邏輯)。
private void NewPanel(float[] nums, char[] suits) {
for (i=0..3) {
URL url = getClass().getResource((int)nums[i] + "" + suits[i] + ".jpg");
pokers[i].setIcon(new ImageIcon(url));
}
// 窗口居中、不可縮放、關閉退出
}
資源需放在 classpath 下(如 bin/1A.jpg 表示 A 花色 1 點)。
Check:核心算法(見上篇)。MyTimer:JPanel + Timer(1000, ...) 顯示「分:秒」。MsgDlg/MasgDlg:模態/非模態彈窗,控制主界面按鈕啟用狀態。

| 現狀 | 建議重構方向 |
|---|---|
| 單類 600+ 行,UI 與邏輯耦合 | 拆分:Model (GameState)、View (GameFrame)、Controller (GameController) |
| 硬編碼計分規則 | 策略模式封裝 ScoringStrategy,支持配置化 |
| 圖片加載同步阻塞 EDT | SwingWorker 異步預加載 / 圖片緩存池 |
| 隨機數用 Math.random/Random | ThreadLocalRandom / SecureRandom |
| float 運算精度風險 | 改用 BigDecimal 或分數類精確運算 |
本項目展示了從算法核心到完整產品級桌面應用的落地全過程:
Check 封裝可解性判斷與表達式計算。Calculate24 實現狀態機(發牌→計時→驗證→計分→下一局/結束)。