From f6f3bbbc5b7741ad0db3c88a398cfc3943988529 Mon Sep 17 00:00:00 2001 From: "Ramaekers,Aldrik A.N" Date: Wed, 16 Sep 2020 09:42:04 +0200 Subject: work --- Pieces/King.cs | 181 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 123 insertions(+), 58 deletions(-) (limited to 'Pieces/King.cs') diff --git a/Pieces/King.cs b/Pieces/King.cs index 945c476..0a98597 100644 --- a/Pieces/King.cs +++ b/Pieces/King.cs @@ -1,58 +1,123 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Chess.Pieces -{ - class King : ChessPiece - { - public King(bool isWhite) : base(isWhite) - { - PieceImage = new Bitmap(!isWhite ? Chess.Properties.Resources.b_king_png_shadow_256px : Chess.Properties.Resources.w_king_png_shadow_256px); - } - - public override bool CanMoveTo(ChessBoard board, BoardTile currentTile, BoardTile destinationTile) - { - MoveCheckResult result; - - result = CanMoveDown(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - result = CanMoveUp(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - result = CanMoveLeft(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - result = CanMoveRight(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - // diagonal - - result = CanMoveDownLeft(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - result = CanMoveDownRight(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - result = CanMoveUpLeft(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - result = CanMoveUpRight(board, currentTile, destinationTile, 1); - if (result == MoveCheckResult.CanMove) return true; - if (result == MoveCheckResult.CantMove) return false; - - return false; - } - } -} +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Chess.Pieces +{ + class King : ChessPiece + { + bool isInInitialPosition = true; + + public King(bool isWhite) : base(isWhite) + { + PieceImage = new Bitmap(!isWhite ? Chess.Properties.Resources.b_king_png_shadow_256px : Chess.Properties.Resources.w_king_png_shadow_256px); + } + + public override void PostMovementEvent(BoardTile tile) + { + isInInitialPosition = false; + + base.PostMovementEvent(tile); + } + + internal override MoveCheckResult CanMoveLeft(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + MoveCheckResult result = base.CanMoveLeft(board, currentTile, destinationTile, count); + + // Check for legal castling move + if (isInInitialPosition) + { + var rooks = board.TilesByPieceType(typeof(Rook), this.IsWhite); + + foreach(var rook in rooks) + { + if (rook != destinationTile) continue; + + if (rook.OccupyingPiece is Rook piece) + { + if (piece.IsInInitialPosition) + { + if (rook.X == 0) + { + // check right path + if (board.Tiles[currentTile.Y, currentTile.X - 1].OccupyingPiece == null && rook.CanMoveTo(board, board.Tiles[currentTile.Y, currentTile.X - 1])) + { + result = MoveCheckResult.CanMove; + } + } + else if (rook.X == 7) + { + // check left path + if (board.Tiles[currentTile.Y, currentTile.X + 1].OccupyingPiece == null && rook.CanMoveTo(board, board.Tiles[currentTile.Y, currentTile.X + 1])) + { + result = MoveCheckResult.CanMove; + } + } + } + } + } + + } + + return result; + } + + public override bool CanMoveTo(ChessBoard board, BoardTile currentTile, BoardTile destinationTile) + { + MoveCheckResult result; + + result = CanMoveDown(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + result = CanMoveUp(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + result = CanMoveLeft(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + result = CanMoveRight(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + // diagonal + + result = CanMoveDownLeft(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + result = CanMoveDownRight(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + result = CanMoveUpLeft(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + result = CanMoveUpRight(board, currentTile, destinationTile, 1); + if (result == MoveCheckResult.CanMove) return true; + if (result == MoveCheckResult.CantMove) return false; + + return false; + } + + internal BoardTile GetCastleLocation(ChessBoard board, BoardTile currentTile, BoardTile destinationTile) + { + if (destinationTile.X < currentTile.X) + { + return board.Tiles[currentTile.Y, currentTile.X - 2]; + } + else if (destinationTile.X > currentTile.X) + { + return board.Tiles[currentTile.Y, currentTile.X + 2]; + } + + return destinationTile; + } + } +} -- cgit v1.2.3-70-g09d2