Example #1
0
        public void Roll(int pins)
        {
            score += GetRollScore(state, pins);
            var isSpare  = !isFirstThrowInFrame && pins + prevPins == 10;
            var isStrike = pins == 10;

            state = GetNextState(state, isSpare, isStrike);
            isFirstThrowInFrame = isStrike || !isFirstThrowInFrame;
            prevPins            = pins;
        }
Example #2
0
        private int GetRollScore(PrevRollsState prevRollsState, int pins)
        {
            switch (prevRollsState)
            {
            case PrevRollsState.Spare:
            case PrevRollsState.NonStrikeThenStrike:
            case PrevRollsState.StrikeThenSimple:
                return(2 * pins);

            case PrevRollsState.StrikeThenStrike:
                return(3 * pins);

            case PrevRollsState.Simple:
                return(pins);

            default:
                throw new Exception(prevRollsState.ToString());
            }
        }
Example #3
0
        private PrevRollsState GetNextState(PrevRollsState prevRollsState, bool isSpare, bool isStrike)
        {
            var prevWasStrike =
                prevRollsState == PrevRollsState.NonStrikeThenStrike ||
                prevRollsState == PrevRollsState.StrikeThenStrike;

            if (isStrike)
            {
                return(prevWasStrike
                    ? PrevRollsState.StrikeThenStrike
                    : PrevRollsState.NonStrikeThenStrike);
            }
            else if (isSpare)
            {
                return(PrevRollsState.Spare);
            }
            else
            {
                return(prevWasStrike
                    ? PrevRollsState.StrikeThenSimple
                    : PrevRollsState.Simple);
            }
        }