public static GameStatus CreateForMove(GameStatus status, GameMove move, GameMoveResultType result, Token attacker, Token defender) { var active = !result.IsGameOver(); var winner = result.GetWinner(status.CurrentPlayer, status.OtherPlayer); // switch current player var currentPlayer = status.OtherPlayer; var otherPlayer = status.CurrentPlayer; return(new GameStatus(currentPlayer, otherPlayer, winner, active, move, result, attacker, defender)); }
public GameStatus( Player currentPlayer, Player otherPlayer, Player winner, bool gameActive, GameMove currentMove, GameMoveResultType currentMoveResult, Token attackerToken, Token defenderToken) { this.CurrentPlayer = currentPlayer; this.OtherPlayer = otherPlayer; this.Winner = winner; this.GameActive = gameActive; this.CurrentMove = currentMove; this.CurrentMoveResult = currentMoveResult; this.AttackerToken = attackerToken; this.DefenderToken = defenderToken; }
public void MoveToken(GameMove move) { Token token = move.Token; Point moveTo = move.MoveTo; if (token.TokenType == TokenType.Empty || token.TokenType == TokenType.Flag || token.TokenType == TokenType.Bomb) { throw new InvalidMoveException(string.Format("Invalid move. Token type {0} cannot be moved.", token.TokenType)); } var defender = this.GameBoard.Get(moveTo); var result = token.Attack(defender); switch (result) { case GameMoveResultType.AttackerWins: this.GameBoard.Remove(defender.Point); token.SetPoint(moveTo); break; case GameMoveResultType.DefenderWins: this.GameBoard.Remove(token.Point); break; case GameMoveResultType.BothLose: this.GameBoard.Remove(token.Point); this.GameBoard.Remove(defender.Point); break; case GameMoveResultType.TokenMove: token.SetPoint(moveTo); break; } if (result != GameMoveResultType.FlagCapturedByAttacker) { var p1ActiveTokens = this.GameBoard.GetTokens().Count(x => x.PlayerID == Player1.ID && x.IsMovable()); var p2ActiveTokens = this.GameBoard.GetTokens().Count(x => x.PlayerID == Player2.ID && x.IsMovable()); if (p1ActiveTokens == 0) { if (p2ActiveTokens == 0) { result = GameMoveResultType.BothOutOfPieces; } else { result = GameMoveResultType.AttackerOutOfPieces; } } else if (p2ActiveTokens == 0) { result = GameMoveResultType.DefenderOutOfPieces; } } this.GameStatus = GameStatus.CreateForMove(this.GameStatus, move, result, token, defender); }