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; }
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()); } }
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); } }