保齡球計分程序

保齡球規(guī)則:

  1. 一局比賽共有 10 個計分格。選手在每一格里有 2 次機會擊倒所有 10 個球瓶。
    如果球手在一個計分格里,第一投便擊倒全部 10 個球瓶,則記為一次“全中”,
    無需進(jìn)行第二投。如果球手在一個計分格里,兩次投球才將全部 10 個球瓶擊倒,
    則記為一次“補中”。例如,球手可能第一投擊倒 7 個球瓶,第二投擊倒余下 3 個。
    如果球手第一投沒有擊倒任何球瓶,但第二投擊倒所有 10 支球瓶,鑒于球手兩次投球才擊倒所有球瓶,仍記為一次“補中”而非“全中”。球手兩次投球后仍未能擊倒所有 10 支球瓶,則記為一次“失誤”。
  2. 失誤的計分方法。對于失誤的計分,只需將兩次投球分別擊倒的瓶數(shù)相加,即可得出本格最終分?jǐn)?shù)。例如:如果球手第一輪第一投擊倒 3 支球瓶,第二投擊倒 2 支球瓶,則第一格計 5 分。如果球手第二輪共擊倒 7 支球瓶,則第二格計 12(5+7) 分。
  3. 補中后的計分方法。如果球員補中,那么計分卡第一格記錄球員第一投擊倒的球瓶數(shù),第二格畫一條反斜線。補中分?jǐn)?shù)為“10 分加上球手下一格第一投擊倒的瓶數(shù)”。
    例如:如果球員在第一格補中,第二格第一投擊倒 7 支球瓶,則第一格最終分?jǐn)?shù)為 17。
  4. 全中后的計分方法。若球手打出全中,則在當(dāng)格第一行記一個“X”。全中分?jǐn)?shù)為“10 分加上球手之后兩次投球擊倒瓶數(shù)”。例如,如果球手在第一格打出全中,而后在第二格第一球擊倒 5 瓶,第二球擊倒 4 瓶,則第一格最終分?jǐn)?shù)為 19。如果球手接連打出兩個全中,則之后一投的分?jǐn)?shù)仍然記入第一格內(nèi)。例如,如果球手在前三格均打出全中,則第一格最終分?jǐn)?shù)為 30。
  5. 第 10 格如果打出“全中”,則追加兩次投球機會;如果打出“補中”,則追加一次投球機會。

要求:通過鍵盤輸入每一格第一次和第二次擊中的球瓶數(shù)量,如果“全中”,
當(dāng)前格只輸入一次。第 10 格根據(jù)第 5 條規(guī)則可能會追加一次或兩次輸入,
輸入完成后顯示當(dāng)前局的得分。

計分程序:

package org.mobiletrain;

public class BowlingGame {
    public static final int TOTAL_ROUND = 10;   // 總局?jǐn)?shù)

    private int[] scores;                       // 記錄每局得分的數(shù)組
    private int[][] numberOfHits;               // 記錄每局兩球擊倒瓶子個數(shù)的數(shù)組
    private int lastOneHit, lastTwoHit;         // 最后兩次擊球
    private int totalScore;                     // 總成績

    private int currentRound;                   // 當(dāng)前第幾局
    private boolean firstHit;                   // 是否是每局的第一次擊球

    public BowlingGame() {
        scores = new int[TOTAL_ROUND];
        numberOfHits = new int[TOTAL_ROUND][2];
        firstHit = true;
    }

    /**
     * 扔出一顆球
     * @param num 打倒瓶子的數(shù)量
     */
    public void throwTheBall(int num) {
        if(firstHit) {  // 第一顆  球
            numberOfHits[currentRound][0] = num;
            if(num != 10) {
                firstHit = false;   // 第一顆球沒有全中則要打第二顆
            }
            else {
                currentRound += 1;  // 第一顆球全中直接進(jìn)入下一局
            }
        }
        else {
            numberOfHits[currentRound][1] = num;
            currentRound += 1;      // 打完第二顆球進(jìn)入下一局
            firstHit = true;        // 準(zhǔn)備投擲下一局的第一顆球
        }
    }

    public void calcScore() {
        // from round 1 to round 9
        for(int i = 0; i < numberOfHits.length - 1; i++) {
            if(numberOfHits[i][0] == 10) {  // Strike(全中)
                scores[i] += 10;
                if(numberOfHits[i + 1][0] == 10) {
                    scores[i] += 10;
                    if(i < 8) {
                        scores[i] += numberOfHits[i + 2][0];
                    }
                    else {
                        scores[i] += lastOneHit;
                    }
                }
                else {
                    scores[i] += numberOfHits[i + 1][0] + numberOfHits[i + 1][1];
                }
            }
            else if(numberOfHits[i][0] + numberOfHits[i][1] == 10) { // Spare(補中)
                scores[i] += 10;
                scores[i] += numberOfHits[i + 1][0];
            }
            else {
                scores[i] += numberOfHits[i][0] + numberOfHits[i][1];
            }
        }
        // the last round
        if(numberOfHits[9][0] == 10) {
            scores[9] += 10;
            scores[9] += lastOneHit + lastTwoHit;
        }
        else if(numberOfHits[9][0] + numberOfHits[9][1] == 10) {
            scores[9] += 10;
            scores[9] += lastOneHit;
        }
        else {
            scores[9] += numberOfHits[9][0] + numberOfHits[9][1];
        }
    }

    /**
     * 設(shè)置最后第一球擊倒瓶子數(shù)
     * @param num 擊倒瓶子數(shù)
     */
    public void setLastOneHit(int num) {
        this.lastOneHit = num;
    }

    /**
     * 設(shè)置最后第二球擊倒瓶子數(shù)
     * @param num 瓶子數(shù)
     */
    public void setLastTwoHit(int num) {
        this.lastTwoHit = num;
    }

    /**
     * 計算總分?jǐn)?shù)
     * @return 總分?jǐn)?shù)
     */
    public int getTotalScore() {
        for(int i = 0; i < scores.length; i++) {
            totalScore += scores[i];
        }
        return totalScore;
    }

    /**
     * 獲得指定局?jǐn)?shù)的累積得分
     * @param round 局?jǐn)?shù)
     * @return 從第一局到指定局?jǐn)?shù)的累積得分
     */
    public int getScoreByRound(int round) {
        int sum = 0;
        for(int i = 0; i <= round; i++) {
            sum += scores[i];
        }
        return sum;
    }
}

測試代碼:

package org.mobiletrain;

import java.text.DecimalFormat;
import java.util.Scanner;

/**
 * 保齡球計分程序
 * @author 
 *
 */
class Test01 {

    public static void main(String[] args) {
        DecimalFormat formatter = new DecimalFormat("00");
        Scanner sc = new Scanner(System.in);
        
        int firstHit = 0, secondHit = 0;
        BowlingGame game = new BowlingGame();
        for(int i = 0; i < BowlingGame.TOTAL_ROUND; i++) {
            System.out.println("=====第" + formatter.format(i + 1) + "回合=====");
            System.out.print("第一次擊中: ");
            firstHit = sc.nextInt();
            game.throwTheBall(firstHit);
            if(firstHit < 10) { // 第一次沒有全中就要打第二顆
                System.out.print("第二次擊中: ");
                secondHit = sc.nextInt();
                game.throwTheBall(secondHit);
            }
            if(i == BowlingGame.TOTAL_ROUND - 1) {
                // 第十局如果全中或補中則要繼續(xù)投擲球
                if(firstHit == 10 || firstHit + secondHit == 10) {
                    System.out.print("加一球: ");
                    int lastOne = sc.nextInt();
                    game.setLastOneHit(lastOne);
                    if(firstHit == 10) {    // 第一顆球全中則還要再投擲一顆球
                        System.out.print("加二球: ");
                        int lastTow = sc.nextInt();
                        game.setLastTwoHit(lastTow);
                    }
                }
            }
        }
        
        game.calcScore();   // 計算成績
        
        // 打印每一局的累積得分
        for(int i = 0; i < BowlingGame.TOTAL_ROUND; i++) {
            System.out.print(game.getScoreByRound(i) + "\t");
        }
        
        System.out.println("\n總分: " + game.getTotalScore());    // 打印總分?jǐn)?shù)
        
        sc.close();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java Web階段附加 題目1 自己實現(xiàn)一個功能類似于ArrayList的容器MyArrayList,MyArr...
    迷茫o閱讀 147評論 0 0
  • “今個兒讓大家起個大早,實在是因為黃帝故里拜祖大典人潮洶涌,必須及早到達(dá),才能占到好位置。”河洛哥對著自媒會一群人...
    輕醒閱讀 375評論 2 2
  • 周二給大家分享的是 "糖醋荷包蛋“” 哈哈 我對雞蛋真是情有獨鐘啊, 沒辦法,誰讓它的做法特別多呢? 這道菜呢,是...
    吃貨李二慢閱讀 697評論 6 9
  • 想寫點什么,最近教師資格證報名考試,可是參考資料還沒有買。 昨天剛爬了華山回來,原以為出去一趟心情...
    寞小妍v閱讀 208評論 0 0
  • 題型:1、單選10個 15分 2、名詞解釋5個 15分 3、簡答5個40分 4、案例分析10分(第一章講過的) 5...
    用余生追趕時光閱讀 9,274評論 1 27

友情鏈接更多精彩內(nèi)容