internal void Select(ChessBoard board, SquareCoordinates coord) { ChessPiece selectedPiece = board.GetPiece(coord); if (moves == null) { if (selectedPiece != null && selectedPiece.White == white) { firstSelection = coord; moves = GameLogic.MoveSet(board, coord, this); board.HighlightSquare(coord, Color.Yellow); FirstSquareSelected(board, coord, moves); } } else { if (coord == firstSelection) { MoveSet prevMoves = moves; ResetSelected(); board.UnhighlightSquare(coord); Unselected(board, coord, prevMoves); } else { Move m = GetMove(moves, coord); if (m != null) { ChessPiece movedPiece, takenPiece = null; MoveSet prevMoves = moves; ResetSelected(); board.UnhighlightSquare(firstSelection); if (m.Overtaken) takenPiece = board.ClearSquare(m.TakenPiece); movedPiece = board.ClearSquare(firstSelection); movedPiece.LastSquare = firstSelection; movedPiece.LastMove = board.CurrentMove; board.DrawPiece(coord, movedPiece); material.MovePiece(movedPiece.Type, firstSelection, coord); MadeMove(board, movedPiece, firstSelection, coord, prevMoves); board.UpdateLastMove(firstSelection, m, movedPiece, takenPiece); board.NextTurn(); } else if (moves.CheckableMoves.Contains(coord) && !board.ShowCheckedMoves) { MessageBox.Show(board, "You may not place the selected piece there\nsince it will either place your king in check\nor will leave your king in check.", "Illegal Move", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } }
internal void Castle(ChessBoard board, bool kingSide) { MoveSet prevMoves = moves; if (moves != null) { ResetSelected(); board.UnhighlightSquare(firstSelection); } SquareCoordinates kingStart, kingEnd, rookStart, rookEnd; ChessPiece piece; int rank = white ? 0 : 7; kingStart = new SquareCoordinates(4, rank); if (kingSide) { kingEnd = new SquareCoordinates(6, rank); rookStart = new SquareCoordinates(7, rank); rookEnd = new SquareCoordinates(5, rank); } else { kingEnd = new SquareCoordinates(2, rank); rookStart = new SquareCoordinates(0, rank); rookEnd = new SquareCoordinates(3, rank); } //rookEnd = new SquareCoordinates((kingStart.File + kingEnd.File) / 2, rank); piece = board.ClearSquare(kingStart); piece.LastSquare = kingStart; piece.LastMove = board.CurrentMove; board.DrawPiece(kingEnd, piece); material.MovePiece(PieceType.KING, kingStart, kingEnd); piece = board.ClearSquare(rookStart); piece.LastSquare = rookStart; piece.LastMove = board.CurrentMove; board.DrawPiece(rookEnd, piece); material.MovePiece(PieceType.ROOK, rookStart, rookEnd); PerformedCastle(board, kingSide, prevMoves); board.UpdateLastMoveFromCastle(kingSide); board.NextTurn(); }