diff options
Diffstat (limited to 'ChessPiece.cs')
| -rw-r--r-- | ChessPiece.cs | 157 |
1 files changed, 141 insertions, 16 deletions
diff --git a/ChessPiece.cs b/ChessPiece.cs index 68bc1cf..5a27177 100644 --- a/ChessPiece.cs +++ b/ChessPiece.cs @@ -9,6 +9,13 @@ using System.Drawing.Imaging; namespace Chess { + internal enum MoveCheckResult + { + CanMove, + CantMove, + ContinueCheck, + } + public abstract class ChessPiece { internal Bitmap PieceImage; @@ -19,32 +26,150 @@ namespace Chess IsWhite = isWhite; } - public abstract bool MoveTo(); - public abstract void Draw(Graphics graphics, float x, float y, float tileWidth, float tileHeight); + internal MoveCheckResult CanMoveUpLeft(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + for (int t = 1; t <= count; t++) + { + Point p1 = new Point(currentTile.X - t, currentTile.Y - t); + + var enemy = board.PieceAt(p1.X, p1.Y); + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy == null)) return MoveCheckResult.CanMove; + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; + } + + return MoveCheckResult.ContinueCheck; + } + + internal MoveCheckResult CanMoveUpRight(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + for (int t = 1; t <= count; t++) + { + Point p1 = new Point(currentTile.X + t, currentTile.Y - t); + + var enemy = board.PieceAt(p1.X, p1.Y); + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy == null)) return MoveCheckResult.CanMove; + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; + } + + return MoveCheckResult.ContinueCheck; + } + - public Bitmap ResizeImage(Image image, int width, int height) + internal MoveCheckResult CanMoveDownRight(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) { - var destRect = new Rectangle(0, 0, width, height); - var destImage = new Bitmap(width, height); + for (int t = 1; t <= count; t++) + { + Point p1 = new Point(currentTile.X + t, currentTile.Y + t); + + var enemy = board.PieceAt(p1.X, p1.Y); + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy == null)) return MoveCheckResult.CanMove; + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; + } - destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); + return MoveCheckResult.ContinueCheck; + } - using (var graphics = Graphics.FromImage(destImage)) + internal MoveCheckResult CanMoveDownLeft(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + for (int t = 1; t <= count; t++) { - graphics.CompositingMode = CompositingMode.SourceCopy; - graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - graphics.SmoothingMode = SmoothingMode.HighQuality; - graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + Point p1 = new Point(currentTile.X - t, currentTile.Y + t); + + var enemy = board.PieceAt(p1.X, p1.Y); + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy == null)) return MoveCheckResult.CanMove; + if ((p1.X == destinationTile.X && p1.Y == destinationTile.Y) && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; + } - using (var wrapMode = new ImageAttributes()) + return MoveCheckResult.ContinueCheck; + } + + internal MoveCheckResult CanMoveLeft(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + if (currentTile.Y != destinationTile.Y) return MoveCheckResult.ContinueCheck; + + if (destinationTile.X < currentTile.X) + { + for (int t = 1; t <= count; t++) { - wrapMode.SetWrapMode(WrapMode.TileFlipXY); - graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); + var enemy = board.PieceAt(currentTile.X - t, currentTile.Y); + if (currentTile.X - t == destinationTile.X && (enemy == null)) return MoveCheckResult.CanMove; + if (currentTile.X - t == destinationTile.X && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; } } - return destImage; + return MoveCheckResult.ContinueCheck; + } + + internal MoveCheckResult CanMoveRight(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + if (currentTile.Y != destinationTile.Y) return MoveCheckResult.ContinueCheck; + + if (destinationTile.X > currentTile.X) + { + for (int t = 1; t <= count; t++) + { + var enemy = board.PieceAt(currentTile.X + t, currentTile.Y); + if (currentTile.X + t == destinationTile.X && (enemy == null)) return MoveCheckResult.CanMove; + if (currentTile.X + t == destinationTile.X && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; + } + } + + return MoveCheckResult.ContinueCheck; + } + + internal MoveCheckResult CanMoveDown(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + if (currentTile.X != destinationTile.X) return MoveCheckResult.ContinueCheck; + + if (destinationTile.Y > currentTile.Y) + { + for (int t = 1; t <= count; t++) + { + var enemy = board.PieceAt(currentTile.X, currentTile.Y + t); + if (currentTile.Y + t == destinationTile.Y && (enemy == null)) return MoveCheckResult.CanMove; + if (currentTile.Y + t == destinationTile.Y && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; + } + } + + return MoveCheckResult.ContinueCheck; + } + + internal MoveCheckResult CanMoveUp(ChessBoard board, BoardTile currentTile, BoardTile destinationTile, int count = 8) + { + if (currentTile.X != destinationTile.X) return MoveCheckResult.ContinueCheck; + + if (destinationTile.Y < currentTile.Y) + { + for (int t = 1; t <= count; t++) + { + var enemy = board.PieceAt(currentTile.X, currentTile.Y - t); + if (currentTile.Y - t == destinationTile.Y && (enemy == null)) return MoveCheckResult.CanMove; + if (currentTile.Y - t == destinationTile.Y && (enemy != null && enemy.IsWhite != this.IsWhite)) return MoveCheckResult.CanMove; + if (enemy != null && enemy != this) return MoveCheckResult.ContinueCheck; + } + } + + return MoveCheckResult.ContinueCheck; + } + + public abstract bool CanMoveTo(ChessBoard board, BoardTile currentTile, BoardTile destinationTile); + public void Draw(Graphics graphics, float x, float y, float tileWidth, float tileHeight) + { + if (PieceImage != null) + { + var image = ImageHelper.ResizeImage(PieceImage, (int)tileWidth, (int)tileHeight); + + graphics.DrawImage(image, new PointF(x * tileWidth + (tileWidth/ 40), y * tileHeight + (tileWidth / 40))); + + image.Dispose(); + } } } } |
