每個程式設計師的成長之路,都離不開「造輪子」的過程。這次我們來回顧一個經典的入門專案——控制台版打字遊戲。雖然代碼簡單、邏輯粗糙,甚至還有不少 Bug,但它完美展示了「遊戲本質上就是數據與邏輯的互動」這一核心思想。
整個專案僅包含五個類,分工明確:

// Player.java - 玩家狀態封裝
public class Player {
private int levelNo; // 當前關卡
private int curScore; // 當前得分
private long starTime; // 開始時間戳
private int elapsedTime; // 耗時秒數
// ... getter/setter 省略
public void play() {
new Game().printResult(); // 委託給遊戲邏輯
}
}
// LevelParam.java - 靜態配置表,難度逐級遞增
public class LevelParam {
public final static Level[] level = new Level[6];
static {
level[0] = new Level(1, 2, 10, 30, 1); // 第1關:長度2,10次,30秒,1分
level[1] = new Level(2, 3, 9, 26, 2); // 第2關:長度3,9次,26秒,2分
// ... 至第6關:長度7,5次,12秒,15分
}
}
public void printResult() {
long starTime = System.currentTimeMillis();
player.setStarTime(starTime);
for (int i = 1; i <= LevelParam.level.length; i++) {
int count = 0, allScore = 0;
starTime = System.currentTimeMillis(); // 每關重置計時
while (count < LevelParam.level[i-1].getStrTime()) {
// 1. 生成隨機字符串(含 > < * & % #)
String liveChar = printStr(LevelParam.level[i-1].getLevalNo());
System.out.println(liveChar);
// 2. 讀取玩家輸入
String startChar = inputScanner.next();
// 3. 超時判定(全局 & 當關)
if ((System.currentTimeMillis() - player.getStarTime())/1000
> LevelParam.level[i-1].getTimeLinit()) {
System.out.println("輸入太慢,遊戲結束");
System.exit(1);
}
// 4. 正確性判定
if (liveChar.equals(startChar)) {
allScore += LevelParam.level[i-1].getPerScore();
count++;
System.out.printf("正確!關卡%d 積分%d 耗時%d秒%n",
i, allScore, (System.currentTimeMillis()-starTime)/1000);
} else {
System.out.println("輸入錯誤,遊戲結束!");
System.exit(1);
}
}
// 關卡通關,更新基準時間
player.setStarTime(System.currentTimeMillis());
}
System.out.println("恭喜通關!");
}
「所有遊戲本質上都是一堆數據,卻能讓人著迷。」——這句話道出了程式設計的魅力。
雖然代碼「很爛」,但它是我思想的具體化。每一行笨拙的代碼,都是通往精通必經的腳印。
學習其實沒那麼難,關鍵在於動手寫、敢犯錯、勤復盤。
完整代碼已開源,歡迎交流指正。下一步計劃:引入狀態模式重構遊戲流程、加入排行榜持久化、嘗試 JavaFX 做圖形化版本。Let's code! 🚀