保齡球計分程序

保齡球規(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)系作者
  • 序言:七十年代末只厘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舅巷,更是在濱河造成了極大的恐慌羔味,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钠右,死亡現(xiàn)場離奇詭異赋元,居然都是意外死亡,警方通過查閱死者的電腦和手機飒房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門搁凸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狠毯,你說我怎么就攤上這事护糖。” “怎么了嚼松?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵嫡良,是天一觀的道長锰扶。 經(jīng)常有香客問我,道長寝受,這世上最難降的妖魔是什么坷牛? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮很澄,結(jié)果婚禮上漓帅,老公的妹妹穿的比我還像新娘。我一直安慰自己痴怨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布器予。 她就那樣靜靜地躺著浪藻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乾翔。 梳的紋絲不亂的頭發(fā)上爱葵,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音反浓,去河邊找鬼萌丈。 笑死,一個胖子當(dāng)著我的面吹牛雷则,可吹牛的內(nèi)容都是我干的辆雾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼月劈,長吁一口氣:“原來是場噩夢啊……” “哼度迂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猜揪,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤惭墓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后而姐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腊凶,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年拴念,在試婚紗的時候發(fā)現(xiàn)自己被綠了钧萍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡丈莺,死狀恐怖划煮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缔俄,我是刑警寧澤弛秋,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布器躏,位于F島的核電站,受9級特大地震影響蟹略,放射性物質(zhì)發(fā)生泄漏登失。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一挖炬、第九天 我趴在偏房一處隱蔽的房頂上張望揽浙。 院中可真熱鬧,春花似錦意敛、人聲如沸馅巷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钓猬。三九已至,卻和暖如春撩独,著一層夾襖步出監(jiān)牢的瞬間敞曹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工综膀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澳迫,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓剧劝,卻偏偏與公主長得像橄登,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子担平,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

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