From b5760ff8eb3b12a0b1610fc9552ccfcf9609ed2a Mon Sep 17 00:00:00 2001 From: jie65535 Date: Fri, 4 Jun 2021 15:47:43 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=20=E8=87=AA=E7=BB=98?= =?UTF-8?q?=E6=A3=8B=E7=9B=98=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChineseChess.Core/ChessMove.cs | 10 +++ ChineseChess/CGame.cs | 119 +++++++++++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 6 deletions(-) diff --git a/ChineseChess.Core/ChessMove.cs b/ChineseChess.Core/ChessMove.cs index baff4df..cd97296 100644 --- a/ChineseChess.Core/ChessMove.cs +++ b/ChineseChess.Core/ChessMove.cs @@ -5,6 +5,16 @@ /// public class ChessMove { + public ChessMove(ChessCamp camp, ChessType chess, ChessType? killed, ChessboardPosition start, ChessboardPosition end, string text) + { + Camp=camp; + Chess=chess; + Killed=killed; + Start=start; + End=end; + Text=text; + } + /// /// 阵营 /// diff --git a/ChineseChess/CGame.cs b/ChineseChess/CGame.cs index 7c8fba9..9ab4d14 100644 --- a/ChineseChess/CGame.cs +++ b/ChineseChess/CGame.cs @@ -50,13 +50,29 @@ namespace ChineseChess protected override void OnClick(EventArgs e) { - Chessman selected = null; - if (_CurrMouseOverPos.HasValue) - selected = _Game.Chessboard.GetChessmanByPos(_CurrMouseOverPos.Value); - if (_CurrSelectedChessman != selected) + try { - _CurrSelectedChessman = selected; - Invalidate(); + Chessman selected = null; + if (_CurrMouseOverPos.HasValue) + selected = _Game.Chessboard.GetChessmanByPos(_CurrMouseOverPos.Value); + if (_CurrSelectedChessman == null) + { + if (selected != null) + { + _CurrSelectedChessman = selected; + Invalidate(); + } + } + else if (_CurrSelectedChessman != selected) + { + _Game.Chessboard.PushMove(new ChessMove(_CurrSelectedChessman.Camp, _CurrSelectedChessman.Type, selected?.Type, _CurrSelectedChessman.Position, _CurrMouseOverPos.Value, string.Empty)); + _CurrSelectedChessman = null; + Invalidate(); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); } base.OnClick(e); } @@ -71,6 +87,95 @@ namespace ChineseChess DrawImageByCentre(g, _ResHelper.GetChessmanBitmap(chessman.Type, chessman.Camp), GetChessboardGridPoint(pos)); } + private void DrawChessborad(Graphics g, Rectangle rect, Pen pen) + { + Size blockCount = new Size(8, 9); + Size cellSize = new Size(rect.Width / blockCount.Width, rect.Height / blockCount.Height); + Point begin = default, end = default; + + // 绘制横线 + begin.X = rect.Left; + end.X = rect.Right; + for (int i = 0; i <= blockCount.Height; i++) + { + end.Y = begin.Y = rect.Top + cellSize.Height * i; + g.DrawLine(pen, begin, end); + } + + // 绘制纵线 + begin.Y = rect.Top; + end.Y = rect.Bottom; + g.DrawLine(pen, rect.Left, begin.Y, rect.Left, end.Y); + g.DrawLine(pen, rect.Right, begin.Y, rect.Right, end.Y); + int upEndY = rect.Top + cellSize.Height * (blockCount.Height / 2); + int dnBegY = rect.Top + cellSize.Height * (blockCount.Height / 2 + 1); + for (int i = 1; i < blockCount.Width; i++) + { + begin.X = end.X = rect.Left + cellSize.Width * i; + g.DrawLine(pen, begin.X, begin.Y, end.X, upEndY); + g.DrawLine(pen, begin.X, dnBegY, end.X, end.Y); + } + + // 绘制斜线 + Point centerPoint = new Point(rect.Left + rect.Width / 2, rect.Top + cellSize.Height); + int left = centerPoint.X - cellSize.Width; + int right = centerPoint.X + cellSize.Width; + int up = centerPoint.Y - cellSize.Height; + int down = centerPoint.Y + cellSize.Height; + g.DrawLine(pen, left, up, right, down); + g.DrawLine(pen, right, up, left, down); + + centerPoint.Y = rect.Bottom - cellSize.Height; + up = centerPoint.Y - cellSize.Height; + down = centerPoint.Y + cellSize.Height; + g.DrawLine(pen, left, up, right, down); + g.DrawLine(pen, right, up, left, down); + + // 绘制对位 + Size offsetSize = new Size(cellSize.Width / 10, cellSize.Height / 10); + Point[] begOffset = new Point[4] + { + new Point(-offsetSize.Width, -offsetSize.Height), + new Point(offsetSize.Width, -offsetSize.Height), + new Point(offsetSize.Width, offsetSize.Height), + new Point(-offsetSize.Width, offsetSize.Height), + }; + Size lineSize = new Size(cellSize.Width / 5, cellSize.Height / 5); + Point[,] endOffsets = new Point[4, 2] + { + { new Point(0, -lineSize.Height), new Point(-lineSize.Width, 0) }, + { new Point(0, -lineSize.Height), new Point(lineSize.Width, 0) }, + { new Point(0, lineSize.Height), new Point(lineSize.Width, 0) }, + { new Point(0, lineSize.Height), new Point(-lineSize.Width, 0) }, + }; + + void drawTarget(Point point) + { + for (int i = 0; i < 4; i++) + { + begin = new Point(point.X + begOffset[i].X, point.Y + begOffset[i].Y); + for (int j = 0; j < 2; j++) + { + end = new Point(begin.X + endOffsets[i, j].X, begin.Y + endOffsets[i, j].Y); + if (rect.Contains(begin) && rect.Contains(end)) + g.DrawLine(pen, begin, end); + } + } + } + + // 画卒线 兵位 + for (int i = 0; i < 5; i++) + { + drawTarget(new Point(rect.Left + i*2 * cellSize.Width, rect.Top + 3 * cellSize.Height)); + drawTarget(new Point(rect.Left + i*2 * cellSize.Width, rect.Top + 6 * cellSize.Height)); + } + // 画三线 炮位 + drawTarget(new Point(rect.Left + cellSize.Width, rect.Top + 2 * cellSize.Height)); + drawTarget(new Point(rect.Right - cellSize.Width, rect.Top + 2 * cellSize.Height)); + drawTarget(new Point(rect.Left + cellSize.Width, rect.Bottom - 2 * cellSize.Height)); + drawTarget(new Point(rect.Right - cellSize.Width, rect.Bottom - 2 * cellSize.Height)); + } + private Point GetChessboardGridPoint(ChessboardPosition position) { return new Point(position.Col * _ResHelper.ChessboardCellSize.Width + _ResHelper.ChessboardOffset.Width, @@ -98,6 +203,8 @@ namespace ChineseChess protected override void OnPaintBackground(PaintEventArgs pevent) { + //pevent.Graphics.FillRectangle(Brushes.White, pevent.ClipRectangle); + //DrawChessborad(pevent.Graphics, new Rectangle(((Point)_ResHelper.ChessboardOffset), _ResHelper.ChessboardGridSize), Pens.Black); pevent.Graphics.DrawImage(_ChessboardBitmap, 0, 0, _ChessboardBitmap.Width, _ChessboardBitmap.Height); } }