@@ -2,6 +2,19 @@ public class Board: PlayingGrid {
22
33 private ( set) public var rows : [ [ Bool ] ]
44
5+ private let emptyBoard : [ [ Bool ] ]
6+
7+ private struct PlacedTile {
8+ let square : Square
9+ let tile : Tile
10+ }
11+
12+ private var placedTiles = [ PlacedTile] ( ) {
13+ didSet {
14+ updateRows ( )
15+ }
16+ }
17+
518 public struct Size {
619 let height : Int
720 let width : Int
@@ -23,6 +36,7 @@ public class Board: PlayingGrid {
2336 rows += [ paddingHorizontal + emptyRow + paddingHorizontal]
2437 }
2538 rows += fullPaddingVertical
39+ emptyBoard = rows
2640 }
2741}
2842
@@ -31,7 +45,7 @@ extension Board {
3145
3246 for tileSquare in tile. squares ( ) {
3347 let boardSquare = tileSquare. offsetBy ( atSquare)
34- if !squareWithinBoard ( boardSquare) {
48+ if !squareWithinGrid ( boardSquare) {
3549 return false
3650 }
3751 if tileSquare. occupied == true && squareOccupied ( boardSquare) {
@@ -40,4 +54,48 @@ extension Board {
4054 }
4155 return true
4256 }
57+
58+ public func positionTile( tile: Tile , atSquare square: Square ) -> Bool {
59+ if !canPositionTile( tile, atSquare: square) {
60+ return false
61+ }
62+ placedTiles. append ( PlacedTile ( square: square, tile: tile) )
63+ return true
64+ }
65+
66+ public func tileAtSquare( square: Square ) -> Tile ? {
67+ for placedTile in placedTiles {
68+ let locationInTile = square. offsetBy ( - placedTile. square)
69+ if placedTile. tile. squareWithinGrid ( locationInTile) {
70+ let occupiedSquares = placedTile. tile. squares ( ) . filter { $0. occupied == true }
71+ for tileSquare in occupiedSquares {
72+ if tileSquare == locationInTile {
73+ return placedTile. tile
74+ }
75+ }
76+ }
77+ }
78+ return nil
79+ }
80+
81+ public func removeTile( tile: Tile ) -> Tile ? {
82+ if let index = placedTiles. indexOf ( { $0. tile === tile } ) {
83+ placedTiles. removeAtIndex ( index)
84+ return tile
85+ }
86+ return nil
87+ }
88+ }
89+
90+ extension Board {
91+ private func updateRows( ) {
92+ rows = emptyBoard
93+ for placedTile in placedTiles {
94+ let occupiedSquares = placedTile. tile. squares ( ) . filter { $0. occupied == true }
95+ for tileSquare in occupiedSquares {
96+ let boardLocation = tileSquare. offsetBy ( placedTile. square)
97+ rows [ boardLocation. row] [ boardLocation. column] = true
98+ }
99+ }
100+ }
43101}
0 commit comments