private AIBoardNode GetFlippedTile(Move move) { CardinalDirection direction = move.EndPosition.Row < move.StartPosition.Row ? (move.EndPosition.Column < move.StartPosition.Column ? CardinalDirection.Northwest : CardinalDirection.Northeast) : (move.EndPosition.Column < move.StartPosition.Column ? CardinalDirection.Southwest : CardinalDirection.Southeast); switch (direction) { case CardinalDirection.Northwest: return TileBoard[move.EndPosition.Row, move.EndPosition.Column]; case CardinalDirection.Northeast: return TileBoard[move.EndPosition.Row, move.EndPosition.Column - 1]; case CardinalDirection.Southwest: return TileBoard[move.EndPosition.Row - 1, move.EndPosition.Column]; case CardinalDirection.Southeast: return TileBoard[move.StartPosition.Row, move.StartPosition.Column]; default: throw new ArgumentOutOfRangeException(move.ToString() + " must be a flipping move!"); } }
public bool IsValidMove(Move move) { bool valid = true; //is the move in bounds? if (!IsValidPosition(move.StartPosition.Row, move.StartPosition.Column, PieceType.Peg) || !IsValidPosition(move.EndPosition.Row, move.EndPosition.Column, PieceType.Peg)) { valid = false; } //Does the start space have the player's piece? else if (PegBoard[move.StartPosition.Row, move.StartPosition.Column].Color != move.PlayerColor) { valid = false; } //Is the end space empty? else if (PegBoard[move.EndPosition.Row, move.EndPosition.Column].Color != CreeperColor.Empty) { valid = false; } else { if ((Math.Abs(move.StartPosition.Row - move.EndPosition.Row) > 1) || (Math.Abs(move.StartPosition.Column - move.EndPosition.Column) > 1) || (move.StartPosition.Equals(move.EndPosition))) { valid = false; } if (Math.Abs(Math.Abs(move.StartPosition.Row - move.EndPosition.Row) - Math.Abs(move.StartPosition.Column - move.EndPosition.Column)) == 2 && PegBoard[move.StartPosition.Row + ((move.EndPosition.Row - move.StartPosition.Row) / 2), move.StartPosition.Column + ((move.EndPosition.Column - move.StartPosition.Column) / 2)].Color == move.PlayerColor.Opposite()) { valid = true; } else if (move.PlayerColor == CreeperColor.Empty || move.PlayerColor == CreeperColor.Invalid) { throw new ArgumentOutOfRangeException(move.ToString()); } } return valid; }