|
9 | 9 | import Foundation
|
10 | 10 |
|
11 | 11 | public final class Frame {
|
12 |
| - |
13 | 12 | public static let maxiumPinsCount: UInt = 10
|
14 | 13 | public var state: FrameState
|
15 |
| - |
| 14 | + |
16 | 15 | public var calcualtedScore: UInt { state.calcualtedScore(self) }
|
17 |
| - |
| 16 | + |
18 | 17 | public var isCompleted: Bool { state.isFrameCompleted(self) }
|
19 |
| - |
| 18 | + |
20 | 19 | public var isCompletelyScored: Bool { state.canScore(self) }
|
21 |
| - |
| 20 | + |
22 | 21 | weak var scoringFrame: Frame?
|
23 |
| - |
| 22 | + |
24 | 23 | let isLastFrame: Bool
|
25 |
| - |
| 24 | + |
26 | 25 | var pinsLeft: UInt { Frame.maxiumPinsCount - (pinsKnockedDown.first ?? 0) }
|
27 |
| - |
| 26 | + |
28 | 27 | private(set) var pinsKnockedDown = [UInt]()
|
29 |
| - |
| 28 | + |
30 | 29 | public init(lastFrame: Bool = false) {
|
31 |
| - self.isLastFrame = lastFrame |
32 |
| - self.state = InitialState() |
| 30 | + isLastFrame = lastFrame |
| 31 | + state = InitialState() |
33 | 32 | }
|
34 |
| - |
| 33 | + |
35 | 34 | public func addPinsKnockedDown(_ count: UInt) { state.addPinsKnockedDown(count, frame: self) }
|
36 |
| - |
| 35 | + |
37 | 36 | func addballsKnockedDown(count: UInt) { pinsKnockedDown.append(count) }
|
38 |
| - |
| 37 | + |
39 | 38 | func getScoringFramePinsKnockedDown(ballIndex: Int) -> [UInt] {
|
40 | 39 | guard let scoringFrame = scoringFrame, ballIndex != 0 else { return [] }
|
41 |
| - |
| 40 | + |
42 | 41 | let allFrames = scoringFrame.pinsKnockedDown + (scoringFrame.scoringFrame?.pinsKnockedDown ?? [])
|
43 |
| - |
| 42 | + |
44 | 43 | let ballsKnockDownNeeded = allFrames.count - ballIndex
|
45 |
| - |
| 44 | + |
46 | 45 | guard ballsKnockDownNeeded >= 0 else {
|
47 | 46 | return []
|
48 | 47 | }
|
49 | 48 | return Array(allFrames[..<ballIndex])
|
50 | 49 | }
|
51 |
| - |
| 50 | + |
52 | 51 | func getFirstBallRolledState(pinsDown: UInt) -> FrameState {
|
53 | 52 | let state = OneBallState()
|
54 | 53 | state.addPinsKnockedDown(pinsDown, frame: self)
|
55 | 54 | return state
|
56 | 55 | }
|
57 |
| - |
| 56 | + |
58 | 57 | func getStrikeState(pinsDown: UInt) -> FrameState {
|
59 | 58 | let state: FrameState = isLastFrame ? FinalFrameStrikeState() : StrikeState()
|
60 | 59 | state.addPinsKnockedDown(pinsDown, frame: self)
|
61 | 60 | return state
|
62 | 61 | }
|
63 |
| - |
| 62 | + |
64 | 63 | func getSpareState(pinsDown: UInt) -> FrameState {
|
65 |
| - let state:FrameState = isLastFrame ? FinalFrameSpareState() : SpareState() |
| 64 | + let state: FrameState = isLastFrame ? FinalFrameSpareState() : SpareState() |
66 | 65 | state.addPinsKnockedDown(pinsDown, frame: self)
|
67 | 66 | return state
|
68 | 67 | }
|
69 |
| - |
| 68 | + |
70 | 69 | func getMissedState(pinsDown: UInt) -> FrameState {
|
71 | 70 | let state = MissedState()
|
72 | 71 | state.addPinsKnockedDown(pinsDown, frame: self)
|
73 | 72 | return state
|
74 | 73 | }
|
75 | 74 | }
|
76 | 75 |
|
77 |
| -extension Frame : CustomDebugStringConvertible { |
| 76 | +extension Frame: CustomDebugStringConvertible { |
78 | 77 | public var debugDescription: String { pinsKnockedDown.debugDescription }
|
79 | 78 | }
|
0 commit comments