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

Java 入門實戰:打造簡易鍵盤輸入遊戲

     編輯:Java 綜合教學

從零開始:用 Java 寫一個「快速擊鍵」小遊戲

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

專案結構一覽

整個專案僅包含五個類,分工明確:

  • Player:玩家數據模型(關卡、分數、計時)
  • Game:遊戲核心邏輯(生成字符、判定輸入、計分、超時處理)
  • Level:關卡參數實體(長度、次數、時間限制、單題分值)
  • LevelParam:關卡配置表(靜態初始化 6 個遞增難度關卡)
  • Test:啟動入口

專案類結構圖

核心代碼解析

1. 數據模型層

// 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(); // 委託給遊戲邏輯
    }
}

2. 關卡配置體系

// 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分
    }
}

3. 遊戲主邏輯(Game.java 核心片段)

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("恭喜通關!");
}

已知問題與改進方向

  1. 迴圈邏輯缺陷:`for (int j=0; j<=count; j++)` 導致每輪額外迭代一次
  2. 隨機生成偏差:`random.nextInt(strLength)` 範圍與 switch case 不匹配,導致字符分布不均
  3. 資源洩漏:`Scanner` 未關閉,`System.exit()` 強制終止不優雅
  4. 彈性不足:關卡參數硬編碼,難以擴展

開發感悟

「所有遊戲本質上都是一堆數據,卻能讓人著迷。」——這句話道出了程式設計的魅力。
雖然代碼「很爛」,但它是我思想的具體化。每一行笨拙的代碼,都是通往精通必經的腳印。
學習其實沒那麼難,關鍵在於動手寫、敢犯錯、勤復盤。

給初學者的建議

  • 先跑通再優化:不要一開始就追求完美架構
  • 善用除錯工具:觀察變量變化比死讀代碼有效百倍
  • 重構是常態:今天的「爛代碼」是明天重構的最佳素材

完整代碼已開源,歡迎交流指正。下一步計劃:引入狀態模式重構遊戲流程、加入排行榜持久化、嘗試 JavaFX 做圖形化版本。Let's code! 🚀

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