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

Java 實現排球比賽計分系統(五局三勝、領先兩分、控制台交互)

     編輯:Java 相關知識

本文記錄一個純 Java 控制台程式實現的排球計分系統,遵循國際標準規則:五局三勝、每局 25 分(決勝局 15 分)、必須領先 2 分、平分後繼續直至領先 2 分。代碼採用靜態數組存儲比分、Scanner 交互、靜態方法封裝邏輯,適合初學者理解流程控制、數組操作、用戶交互基礎語法。

一、需求規則摘要

  • 五局三勝制,先贏 3 局者勝。
  • 前 4 局:先得 25 分且領先 2 分勝;24:24 後須領先 2 分(無上限)。
  • 第 5 局(決勝局):先得 15 分且領先 2 分勝;14:14 後須領先 2 分。
  • 每輪輸入獲分方編號(1/2),即時顯示當前比分。
  • 支援查詢歷史局比分、中途退出顯示最終結果。

二、核心數據結構

// scoreArr[局數][隊伍] 存儲每局雙方得分
static int[][] scoreArr = new int[5][2]; 
// result[局數] 存儲每局最終結果字符串
static String[] result = new String[5];  
// 隊伍獲局數統計
static int team1Wins = 0, team2Wins = 0;

三、完整代碼(單文件可直接運行)

package volleyball;

import java.util.Scanner;

public class VolleyballScoringSystem {
    static Scanner sc = new Scanner(System.in);
    static int[][] scoreArr = new int[5][2];
    static String[] result = new String[5];
    static int team1Wins = 0, team2Wins = 0;

    public static void main(String[] args) {
        printWelcome();
        for (int set = 0; set < 5; ) {
            System.out.println("\n請選擇操作:1.開始計分  2.查詢局數  3.退出系統");
            int choice = sc.nextInt();
            switch (choice) {
                case 1:
                    System.out.println("=== 第 " + (set + 1) + " 局開始 ===");
                    playSet(set);
                    set++;
                    break;
                case 2:
                    querySet();
                    break;
                case 3:
                    printFinalResult();
                    return;
                default:
                    System.out.println("輸入錯誤,請重新輸入。");
            }
        }
        // 5 局結束自動輸出最終結果
        printFinalResult();
    }

    // 單局計分邏輯
    static void playSet(int setIndex) {
        int target = (setIndex == 4) ? 15 : 25; // 第5局15分,其餘25分
        int t1 = 0, t2 = 0; // 本局臨時得分
        int round = 0;

        while (true) {
            System.out.print("請輸入得分方 (1.中國隊  2.美國隊): ");
            int team = sc.nextInt();
            if (team == 1) t1++;
            else if (team == 2) t2++;
            else { System.out.println("輸入無效"); continue; }

            round++;
            System.out.println("第 " + round + " 輪結束,當前比分: " + t1 + " : " + t2);

            // 勝負判定:達到目標分且領先2分
            if ((t1 >= target || t2 >= target) && Math.abs(t1 - t2) >= 2) {
                scoreArr[setIndex][0] = t1;
                scoreArr[setIndex][1] = t2;
                if (t1 > t2) {
                    result[setIndex] = "第 " + (setIndex+1) + " 局: " + t1 + ":" + t2 + "  中國隊獲勝";
                    team1Wins++;
                } else {
                    result[setIndex] = "第 " + (setIndex+1) + " 局: " + t1 + ":" + t2 + "  美國隊獲勝";
                    team2Wins++;
                }
                System.out.println(result[setIndex]);
                // 提前結束判定:某隊已贏3局
                if (team1Wins == 3 || team2Wins == 3) {
                    System.out.println("比賽結束!");
                    printFinalResult();
                    System.exit(0);
                }
                return; // 結束本局
            }
        }
    }

    static void querySet() {
        System.out.print("請輸入要查詢的局數 (1-5): ");
        int q = sc.nextInt();
        if (q < 1 || q > 5) { System.out.println("局數範圍 1-5"); return; }
        if (result[q-1] == null) System.out.println("該局尚未開始。");
        else System.out.println(result[q-1]);
    }

    static void printWelcome() {
        System.out.println("========================================");
        System.out.println("       歡迎使用排球比賽計分系統");
        System.out.println("   規則:五局三勝,前4局25分,決勝局15分");
        System.out.println("   必須領先2分;平分後繼續至領先2分");
        System.out.println("========================================");
    }

    static void printFinalResult() {
        System.out.println("\n=== 比賽最終結果 ===");
        for (String r : result) {
            if (r != null) System.out.println(r);
        }
        System.out.println("總局分: 中國隊 " + team1Wins + " : " + team2Wins + " 美國隊");
        if (team1Wins > team2Wins) System.out.println("🏆 中國隊獲得最終勝利!");
        else System.out.println("🏆 美國隊獲得最終勝利!");
        System.out.println("感謝使用,再見!");
    }
}

四、運行示例

========================================
       歡迎使用排球比賽計分系統
   規則:五局三勝,前4局25分,決勝局15分
   必須領先2分;平分後繼續至領先2分
========================================

請選擇操作:1.開始計分  2.查詢局數  3.退出系統
1
=== 第 1 局開始 ===
請輸入得分方 (1.中國隊  2.美國隊): 1
第 1 輪結束,當前比分: 1 : 0
...
第 25 輪結束,當前比分: 25 : 23
第 1 局: 25:23  中國隊獲勝

請選擇操作:1.開始計分  2.查詢局數  3.退出系統
2
請輸入要查詢的局數 (1-5): 1
第 1 局: 25:23  中國隊獲勝
...

五、代碼設計亮點與不足

亮點不足/可優化
規則邏輯清晰:目標分動態、領先判定獨立靜態變量耦合高,難以單元測試
交互菜單靈活:支援中途查詢、退出無輸入驗證(非數字會拋異常)
提前結束優化:某隊贏3局即停止無持久化,重啟數據丟失
單文件可運行,零依賴控制台交互不適合 Web/移動端

六、擴展方向

  1. 引入 `Team`、`Set`、`Match` 實體類,分離領域模型。
  2. 使用狀態機模式管理比賽狀態(未開始、進行中、局間休息、結束)。
  3. 增加 Swing/JavaFX 圖形界面或 Spring Boot + WebSocket 實時網頁版。
  4. 接入數據庫記錄歷史比賽、導出 PDF 報表。
  5. 支援更多規則:換邊、暫停、挑戰、自由人替換等。

七、總結

這個排球計分系統雖簡單,但完整演示了**需求分析→數據建模→流程控制→交互邏輯→邊界判定**的完整開發微循環。初學者可通過修改規則參數(如改為乒乓球 11 分制)、添加輸入驗證、重構為 OO 設計,逐步掌握從「能跑通」到「好維護」的代碼進化之路。

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