Example #1
0
        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));
        }
Example #2
0
 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;
 }
Example #3
0
        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);
        }