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

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

package cn.hyj.quickhit;
public class Level {
private int levelNo, strLength, strTimes, timeLimit, perScore;
// 無參/全參構造、Getter/Setter 略
}
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);
}
}
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());
}
}
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);
}
}
}
}
package cn.hyj.quickhit;
public class Test {
public static void main(String[] args) {
new Player().play();
}
}
| 知識點 | 項目體現位置 |
|---|---|
| 封裝 | `Level`/`Player` 私有屬性 + 公共 Getter/Setter |
| 構造方法重載 | `Level`、`Player`、`Game` 提供無參/全參構造 |
this 關鍵字 | `Player.play()` 中 `new Game(this)` 傳遞當前對象;構造方法區分同名屬性 |
static 關鍵字 | `LevelParam.levels` 靜態常量數組,屬於類不屬於實例,全局共享配置 |
| 對象協作 | `Player` 持有 `Game` 引用,`Game` 回調 `Player` 狀態 (單向關聯) |
| 靜態代碼塊 | `LevelParam` 類加載時初始化級別數據 |
| 面向對象建模 | 從名詞提取類 (Player, Game, Level),分配職責 (高內聚低耦合) |