-
Notifications
You must be signed in to change notification settings - Fork 179
/
TetrisWell.swift
65 lines (57 loc) · 1.3 KB
/
TetrisWell.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//
// TetrisWell.swift
// ARTetris
//
// Created by Yuri Strot on 6/29/17.
// Copyright © 2017 Exyte. All rights reserved.
//
/** Tetris well model */
class TetrisWell {
private let config: TetrisConfig
private var matrix: [[Bool]] = []
init(_ config: TetrisConfig) {
self.config = config
matrix.append([Bool](repeating: true, count: config.width + 2))
for _ in 0...config.height + 3 {
addLine()
}
}
public func hasCollision(_ state: TetrisState) -> Bool {
let tetromino = state.tetromino()
for i in 0...3 {
if (matrix[state.y + tetromino.y(i)][state.x + tetromino.x(i)]) {
return true
}
}
return false
}
public func add(_ current: TetrisState) {
let tetromino = current.tetromino()
for i in 0...3 {
matrix[current.y + tetromino.y(i)][current.x + tetromino.x(i)] = true
}
}
public func clearFilledLines() -> [Int] {
var toRemove: [Int] = []
loop: for i in 1...config.height + 1 {
for j in 1...config.width {
if (!matrix[i][j]) {
continue loop
}
}
toRemove.append(i)
}
toRemove.reverse()
for i in toRemove {
matrix.remove(at: i)
addLine()
}
return toRemove
}
private func addLine() {
var row = [Bool](repeating: false, count: config.width + 2)
row[0] = true
row[config.width + 1] = true
matrix.append(row)
}
}