forked from woowacourse/kotlin-omok
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Omok.kt
39 lines (36 loc) · 1.35 KB
/
Omok.kt
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
package domain.game
import domain.board.Board
import domain.player.BlackPlayer
import domain.player.WhitePlayer
import domain.rule.OmokRule
import domain.stone.Stone
import domain.stone.StoneColor
import listener.OmokStartEndEventListener
import listener.OmokTurnEventListener
class Omok(
private val startEndEventListener: OmokStartEndEventListener,
private val turnEventListener: OmokTurnEventListener,
private val rule: OmokRule
) {
fun run() {
startEndEventListener.onStartGame()
var curStoneColor: StoneColor = StoneColor.BLACK
var curBoard = Board(BlackPlayer(), WhitePlayer(), rule)
do {
curBoard = takeTurn(curBoard, curStoneColor)
startEndEventListener.onEndTurn(curBoard.getPlayers())
curStoneColor = curStoneColor.next()
} while (curBoard.isRunning())
if (curBoard.isLose()) startEndEventListener.onEndGame(curStoneColor)
else startEndEventListener.onEndGame(curStoneColor.next())
}
private fun takeTurn(board: Board, stoneColor: StoneColor): Board {
val newStone = Stone.of(turnEventListener.onTakeTurn(stoneColor))
val newBoard = board.putStone(stoneColor, newStone)
if (newBoard == null) {
turnEventListener.onNotPlaceable()
return takeTurn(board, stoneColor)
}
return newBoard
}
}