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段所得分数进行累计,即为该局得分。
附二:
作者制作的代码效果图

e044032a-3714-4bb7-9d48-f4297a21b7e9|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: C#, 代码
IT技术