永垂不垮的“Bob大叔”保龄球计分代码

posted at 2025.5.30 14:03 by Administrator

保龄球记分代码是“Bob大叔Robert C. Martin)的经典之作,是无数C#程序员的必记代码。

C#代码介绍如下:

using System;
 
namespace BaoLingQuJiFen{
    class Program{
        public class Game{
            private int currentFrame = 0;
            private bool isFirstthrow = true;
            private Scorer scorer = new Scorer();
            public int Score{
                get { return ScoreForFrame(currentFrame); }
            }
            public void Add(int pins){
                scorer.AddThrow(pins);
                AdjustCurrentFrame(pins);
            }
            private void AdjustCurrentFrame(int pins){
                if (LastBallInFrame(pins))
                    AdvanceFrame();
                else
                    isFirstthrow = false;
            }
            private bool LastBallInFrame(int pins){
                return Strike(pins) || (!isFirstthrow);
            }
            private bool Strike(int pins){
                return (isFirstthrow && pins == 10);
            }
            private void AdvanceFrame(){
                currentFrame++;
                if (currentFrame > 10)
                    currentFrame = 10;
            }
            public int ScoreForFrame(int theFrame){
                return scorer.ScoreForFrame(theFrame);
            }
        }
        public class Scorer{
            private int ball;
            private int[] throws = newint[21];
            private int currentThrow;
            public void AddThrow(int pins){
                throws[currentThrow++] = pins;
            }
            public int ScoreForFrame(int theFrame){
                ball = 0;
                int score = 0;
                for (int currentFrame = 0; currentFrame < theFrame; currentFrame++){
                    if (Strike()){
                        score += 10 + NextTwoBallsForStrike;
                        ball++;
                    }
                    else if (Spare() ){
                        score += 10 + NextBallForSpare;
                        ball += 2;
                    }
                    else{
                        score += TwoBallsInFrame;
                        ball += 2;
                    }
                }
                return score;
            }
            private int NextTwoBallsForStrike{
                get { return (throws[ball + 1] + throws[ball + 2]); }
            }
            private int NextBallForSpare{
                get { return throws[ball + 2]; }
            }
            private bool Strike(){
                return throws[ball] == 10;
            }
            private int TwoBallsInFrame{
                get { return (throws[ball] + throws[ball + 1]); }
            }
            private bool Spare(){
                return throws[ball] + throws[ball + 1] == 10;
            }
        }
        static void Main(string[] args) {
            Game game = new Game();   //以下演示代码系作者添加
            game.Add(10);
            game.Add(5);
            game.Add(5);
            game.Add(5);
            game.Add(3);
            Console.WriteLine(game.Score);
        }
    }
}

附一:

保龄球记分规则如下:

每局比赛由10段组成,前9段中运动员每段有两次投球机会:

1)如该段第一次投球击倒全部10个球瓶,则不需第二次投球,该段计为全中,该段全中所击倒的瓶数(10分)加随后两次投球所击倒的瓶数为该段所得的分数;

2)若该段第一次投球未能击倒全部10个球瓶,则可投第二次,若第二次投球将剩余的球瓶全部击倒,则该段计为补中,该段两次投球所击到的瓶数(10分)加下一次投球所击倒的瓶数为该段所得的分数;

3)若该段两次投球未能将10个球瓶全部击倒,则称为失误,该段得分为两次投球所击倒的全部瓶数。在第10段中,如果在第一或第二次投球中出现了全中或补中,则运动员可进行第三次投球,该段所得分数为该段实际击倒的球瓶数量。

按上述规定将运动员10段所得分数进行累计,即为该局得分。

附二:

作者制作的代码效果图

风雷制作

Tags: ,

IT技术

添加评论

  Country flag

biuquote
  • 评论
  • 在线预览
Loading