/// <summary> /// Gets all possible moves of bishops of given player /// </summary> private static List <GameMove> GetMovesForBishops(ChessboardModel chessboard, PlayerColor playerColor) { var acumulator = new List <GameMove>(); var upLeft = new GameMoveVector(-1, 1); var upRight = new GameMoveVector(1, 1); var downLeft = new GameMoveVector(-1, -1); var downRight = new GameMoveVector(1, -1); for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { var position = new ChessPosition(x, y); var figure = chessboard.GetFigureOnPosition(position); if ( figure != null && figure.Type == FigureType.Bishop && figure.Color == playerColor ) { acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, upLeft)); acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, upRight)); acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, downLeft)); acumulator.AddRange(CanMoveOrAttackIterative(chessboard, playerColor, position, downRight)); } } } acumulator.RemoveAll(x => x == null); return(acumulator); }
/// <summary> /// Gets all possible moves of king of given player /// </summary> private static List <GameMove> GetMovesForKing(ChessboardModel chessboard, PlayerColor playerColor) { var acumulator = new List <GameMove>(); var up = new GameMoveVector(0, 1); var left = new GameMoveVector(-1, 0); var down = new GameMoveVector(0, -1); var right = new GameMoveVector(1, 0); var upLeft = new GameMoveVector(-1, 1); var upRight = new GameMoveVector(1, 1); var downLeft = new GameMoveVector(-1, -1); var downRight = new GameMoveVector(1, -1); for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { var position = new ChessPosition(x, y); var figure = chessboard.GetFigureOnPosition(position); if ( figure != null && figure.Type == FigureType.King && figure.Color == playerColor ) { acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(up))); acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(left))); acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(down))); acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(right))); acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(upLeft))); acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(upRight))); acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(downLeft))); acumulator.Add(CanMoveOrAttack(chessboard, playerColor, position, position.Add(downRight))); } } } acumulator.RemoveAll(x => x == null); return(acumulator); }
/// <summary> /// Get position after translating by given vector /// </summary> /// <param name="vector">Vector move translation</param> /// <returns>Transalted position</returns> public ChessPosition Add(GameMoveVector vector) { return(new ChessPosition(this.X + vector.X, this.Y + vector.Y)); }
/// <summary> /// Gets moves in direction of vector, until figure of playing player is encountered, or positions ain't valid /// </summary> /// <param name="playerColor">Capturing player</param> /// <param name="from">Position to move from</param> /// <param name="vector">Vector to move to</param> private static List <GameMove> CanMoveOrAttackIterative(ChessboardModel chessboard, PlayerColor playerColor, ChessPosition from, GameMoveVector vector) { var acumulator = new List <GameMove>(); var temp = from; while (true) { temp = temp.Add(vector); var attack = CanAttack(chessboard, playerColor, from, temp); var move = CanMove(chessboard, playerColor, from, temp); acumulator.Add(move); acumulator.Add(attack); if (attack != null) { return(acumulator); } if (move == null) { return(acumulator); } } }