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

Java 面向對象實戰項目:快速擊鍵遊戲 — 封裝、繼承、多態與靜態成員綜合應用

     編輯:Java 綜合教學

項目實戰:快速擊鍵遊戲 — 從需求分析到 OOP 代碼落地

本項目旨在通過一個控制台「快速擊鍵」小遊戲,綜合演練 Java 面向對象核心思想:**類的發現與設計、封裝 (私有屬性+公共方法)、構造方法重載、`this` 區分變量、`static` 共享級別配置、對象協作 (Game 驅動 Player)**。適合 Java 入門鞏固 OOP 概念。

一、 需求分析

  • 玩法:系統隨機生成字符串 (如 `>&<*@`),玩家在限定時間內準確輸入。
  • 等級制:共 6 級。級別越高 → 字符串長度越長、輸入次數越多、單次得分越高、時間限制不變 (60秒)。
  • 結束條件:輸入錯誤即時結束;超時結束;通關 6 級勝利。
  • 顯示信息:每輪輸入正確顯示當前級別、累計積分、已用時間。

運行效果圖

二、 面向對象設計 (CRC 卡片法)

類名職責關鍵屬性關鍵行為協作對象
Level級別參數數據模型 (數據容器)levelNo, strLength, strTimes, timeLimit, perScoreGetter/Setter—
LevelParam級別配置倉庫 (靜態常量池)static final Level[] levels靜態代碼塊初始化 6 級參數Game, Player 讀取
Player玩家狀態與遊戲主循環levelNo, currScore, startTime, endTimeplay() 驅動遊戲流程Game (調用生成/判斷)
Game遊戲核心邏輯 (字符串生成、比對、計分、超時判定)player (關聯引用)getStr(), strThesame(out, in)Player (回調狀態)
Test啟動類—main() 創建 Player 啟動Player

類圖

三、 核心代碼實現

1. Level.java — 純數據封裝

package cn.hyj.quickhit;
public class Level {
    private int levelNo, strLength, strTimes, timeLimit, perScore;
    // 無參/全參構造、Getter/Setter 略
}

2. LevelParam.java — static 靜態工廠/常量池

package cn.hyj.quickhit;
public class LevelParam {
    public static final Level[] levels = new Level[6];
    static { // 靜態代碼塊:類加載時一次性初始化
        levels[0] = new Level(1, 2, 5, 60, 1);
        levels[1] = new Level(2, 3, 6, 60, 2);
        levels[2] = new Level(3, 4, 7, 60, 5);
        levels[3] = new Level(4, 5, 8, 60, 8);
        levels[4] = new Level(5, 6, 9, 60, 10);
        levels[5] = new Level(6, 7, 10, 60, 15);
    }
}

3. Game.java — 核心邏輯與隨機生成

package cn.hyj.quickhit;
import java.util.Random;

public class Game {
    Player player; // 關聯玩家對象
    public Game(Player p) { this.player = p; }

    // 生成指定長度隨機字符串 (字符池: > < * & # @)
    public String getStr() {
        int len = LevelParam.levels[player.getLevelNo() - 1].getStrLength();
        StringBuilder sb = new StringBuilder();
        Random rd = new Random();
        String pool = "><*&#@";
        for (int i = 0; i < len; i++) {
            sb.append(pool.charAt(rd.nextInt(pool.length())));
        }
        System.out.println(sb); // 控制台輸出提示
        return sb.toString();
    }

    // 比對輸入、計分、超時判定、升級邏輯
    public void strThesame(String outStr, String inStr) {
        if (!outStr.equals(inStr)) {
            System.out.println("輸入錯誤,退出!"); System.exit(0);
        }
        // 正確邏輯
        long now = System.currentTimeMillis();
        Level curLevel = LevelParam.levels[player.getLevelNo() - 1];
        // 超時判定
        if (curLevel.getTimeLimit() < (now - player.getStartTime()) / 1000) {
            System.out.println("超時,退出!"); System.exit(0);
        }
        // 計分、計時
        player.setCurrScore(player.getCurrScore() + curLevel.getPerScore());
        player.setEndTime((int)((now - player.getStartTime()) / 1000));
        System.out.printf("輸入正確!級別:%d 積分:%d 已用:%d秒%n", 
            player.getLevelNo(), player.getCurrScore(), player.getEndTime());
    }
}

4. Player.java — 狀態管理與雙層循環驅動

package cn.hyj.quickhit;
import java.util.Scanner;

public class Player {
    private int levelNo = 0; // 從0開始,play()中先++變1
    private int currScore = 0;
    private long startTime;
    private int endTime;
    // Getter/Setter 略

    public void play() {
        Game game = new Game(this); // this 傳遞當前玩家引用
        Scanner sc = new Scanner(System.in);

        // 外層循環:遍歷 6 個級別
        for (int i = 0; i < LevelParam.levels.length; i++) {
            levelNo++; // 升級
            currScore = 0; // 級別積分歸零
            startTime = System.currentTimeMillis(); // 計時歸零
            
            if (levelNo == 6) { System.out.println("高手,恭喜通關!"); break; }

            // 內層循環:當前級別需輸入的次數
            int times = LevelParam.levels[levelNo - 1].getStrTimes();
            for (int j = 0; j < times; j++) {
                String out = game.getStr();
                String in = sc.next(); // 讀取玩家輸入 (按空格/換行分隔)
                game.strThesame(out, in);
            }
        }
    }
}

5. Test.java — 啟動入口

package cn.hyj.quickhit;
public class Test {
    public static void main(String[] args) {
        new Player().play();
    }
}

四、 OOP 知識點總結對照表

知識點項目體現位置
封裝`Level`/`Player` 私有屬性 + 公共 Getter/Setter
構造方法重載`Level`、`Player`、`Game` 提供無參/全參構造
this 關鍵字`Player.play()` 中 `new Game(this)` 傳遞當前對象;構造方法區分同名屬性
static 關鍵字`LevelParam.levels` 靜態常量數組,屬於類不屬於實例,全局共享配置
對象協作`Player` 持有 `Game` 引用,`Game` 回調 `Player` 狀態 (單向關聯)
靜態代碼塊`LevelParam` 類加載時初始化級別數據
面向對象建模從名詞提取類 (Player, Game, Level),分配職責 (高內聚低耦合)

五、 可優化擴展方向

  • 將字符池、級別配置外部化至 properties/JSON 文件。
  • 引入介面 `IGameLogic` 解耦 `Game` 具體實現 (策略模式)。
  • 使用 `System.nanoTime()` 替代 `currentTimeMillis()` 提高計時精度。
  • 將 `System.exit(0)` 替換為拋出自定義異常 `GameOverException`,主循環捕獲優雅結束。
  • GUI 化:Swing/JavaFX 實現圖形界面、倒計時可視化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved