首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

24點遊戲完整項目實戰:Swing GUI、遊戲邏輯、計分規則與資源管理全流程

     編輯:Java 相關知識

前言

承接上篇核心算法,本文呈現 24 點遊戲的完整工程實現:Swing 界面佈局、發牌邏輯、計分規則、計時器、資源加載、狀態機流轉。代碼採用單類 Calculate24 集中控制,適合中小型桌面遊戲快速原型開發參考。

一、遊戲規則速覽

  • 初始 40 分,>100 勝,<0 負。
  • 發牌保證可解(調用 Check.check() 循環生成直到可解)。
  • 刷牌扣 3 分;答對 +5 分(含鬼牌 J/Q/K/大小王算 10 時雙倍 +10);超 90 秒答對 +4/+8;答錯 -2。

二、核心類結構:Calculate24

繼承 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;       // 是否含鬼牌(雙倍分標記)

界面佈局

  • North:標題標籤。
  • Center:pokerPanel (FlowLayout) 放 4 張牌 + countArea。
  • South:bottomPanel 放「開始/刷牌」按鈕、提示標籤、輸入框、動態添加的「確定」按鈕與計時器組件。

三、核心流程詳解

1. 發牌/刷牌邏輯

// 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分,但含鬼牌不額外加分,此處僅演示邏輯

2. 答案提交驗證

// 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(); // 發下一輪

3. 表達式合法性校驗

calculateString() 執行三層檢查:

  1. 字符級:僅允許數字、+-*/、()。
  2. 結構級:提取 4 數字 3 運算符,驗證括號匹配、位置合法(左括號前必為運算符/開頭,右括號後必為運算符/結尾)。
  3. 語義級:調用 isRightNum() 確認使用的數字與當前牌面一致(順序無關、不可重複使用)。

通過後委託 checker.string_float() 計算結果(複用上篇優先級解析邏輯)。

4. 撲克圖片動態加載

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,支持配置化
圖片加載同步阻塞 EDTSwingWorker 異步預加載 / 圖片緩存池
隨機數用 Math.random/RandomThreadLocalRandom / SecureRandom
float 運算精度風險改用 BigDecimal 或分數類精確運算

總結

本項目展示了從算法核心到完整產品級桌面應用的落地全過程:

  1. 算法層:Check 封裝可解性判斷與表達式計算。
  2. 邏輯層:Calculate24 實現狀態機(發牌→計時→驗證→計分→下一局/結束)。
  3. 視圖層:Swing 組件佈局、圖片資源管理、計時器、彈窗交互。

完整源碼下載:https://down.51cto.com/data/318971

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved