Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class SnakesAndLadders: DiceGame { // 프로토콜의 조건에 맞추기위해 dice라는 프로퍼티는 gettable하게 구현되어 있고, play()메소드가 구현되어 있다.
- let finalSquare = 25
- let dice = Dice(sides: 6, generator: LinearCongruentialGenerator())
- var square = 0
- var board: [Int]
- init() {
- board = Array(repeating: 0, count: finalSquare + 1)
- board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
- board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
- }
- // 강한 참조 순환을 막기위해 약한 참조를 함
- weak var delegate: DiceGameDelegate? // 게임 진행에 반드시 필요한 것은 아니기 때문에 옵셔널로 정의
- /// 게임의 전체 로직이 들어있는 메소드
- func play() { // 바로 위에 정의한 delegate가 DiceGameDelegation 옵셔널타입이므로 play() 메소드는 delegate의 메소드를 호출할때마다 옵셔널 체이닝을 한다.
- square = 0
- /// DiceGameDelegation의 게임 진행상황을 tracking하는 메소드(게임 시작)
- delegate?.gameDidStart(self)
- gameLoop: while square != finalSquare {
- let diceRoll = dice.roll()
- /// DiceGameDelegation의 게임 진행상황을 tracking하는 메소드(게임 진행)
- delegate?.game(self, didStartNewTurnWithDiceRoll: diceRoll)
- switch square + diceRoll {
- case finalSquare:
- break gameLoop
- case let newSquare where newSquare > finalSquare:
- continue gameLoop
- default:
- square += diceRoll
- square += board[square]
- }
- }
- /// DiceGameDelegation의 게임 진행상황을 tracking하는 메소드(게임 종료)
- delegate?.gameDidEnd(self)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement