diff --git a/ChineseChess.Core/Chess.cs b/ChineseChess.Core/Chess.cs
deleted file mode 100644
index 8b0e9dc..0000000
--- a/ChineseChess.Core/Chess.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChineseChess.Core
-{
- public class Chess
- {
- public ChessType Type { get; set; }
- public ChessCamp Camp { get; set; }
- public ChessboardPosition Position { get; set; }
- }
-}
\ No newline at end of file
diff --git a/ChineseChess.Core/ChessCamp.cs b/ChineseChess.Core/ChessCamp.cs
index 7faa01b..a78c99b 100644
--- a/ChineseChess.Core/ChessCamp.cs
+++ b/ChineseChess.Core/ChessCamp.cs
@@ -15,4 +15,10 @@
///
Black,
}
+
+ public static class ChessCampExtensions
+ {
+ public static ChessCamp RivalCamp(this ChessCamp camp)
+ => camp == ChessCamp.Red ? ChessCamp.Black : ChessCamp.Red;
+ }
}
\ No newline at end of file
diff --git a/ChineseChess.Core/ChessMove.cs b/ChineseChess.Core/ChessMove.cs
index fd7dd76..baff4df 100644
--- a/ChineseChess.Core/ChessMove.cs
+++ b/ChineseChess.Core/ChessMove.cs
@@ -1,27 +1,10 @@
-using System;
-
-namespace ChineseChess.Core
+namespace ChineseChess.Core
{
///
/// 棋子移动步骤
///
public class ChessMove
{
- private ChessMove()
- {
-
- }
-
- public static ChessMove GenMove(Chessboard chessboard, string move)
- {
- throw new NotImplementedException();
- }
-
- public static ChessMove GenMove(Chessboard chessboard, ChessCamp camp, ChessboardPosition start, ChessboardPosition end)
- {
- throw new NotImplementedException();
- }
-
///
/// 阵营
///
diff --git a/ChineseChess.Core/ChessReferee.cs b/ChineseChess.Core/ChessReferee.cs
new file mode 100644
index 0000000..61712f9
--- /dev/null
+++ b/ChineseChess.Core/ChessReferee.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace ChineseChess.Core
+{
+ class ChessReferee
+ {
+ public static ChessMove Move(Chessboard chessboard, string move)
+ {
+ throw new NotImplementedException();
+ }
+
+ public static ChessMove Move(Chessboard chessboard, ChessCamp camp, ChessboardPosition start, ChessboardPosition end)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/ChineseChess.Core/Chessboard.cs b/ChineseChess.Core/Chessboard.cs
index 90a7b4e..596fc5c 100644
--- a/ChineseChess.Core/Chessboard.cs
+++ b/ChineseChess.Core/Chessboard.cs
@@ -1,6 +1,107 @@
-namespace ChineseChess.Core
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace ChineseChess.Core
{
public class Chessboard
{
+ private readonly Stack Moves = new Stack();
+
+ private readonly List AlivingChessman = new List(32);
+
+ public event EventHandler ChessmanMovedEvent;
+
+ private void OnChessmanMoved(Chessman chessman, Chessman chessmanKilled)
+ => ChessmanMovedEvent?.Invoke(this, new ChessmanMovedEventArgs(chessman, chessmanKilled));
+
+ public Chessman GetChessmanByPos(ChessboardPosition position)
+ => AlivingChessman.FirstOrDefault(c => c.Position == position);
+
+ public IEnumerable GetChessmenByType(ChessType type, ChessCamp camp)
+ => AlivingChessman.Where(chess => chess.Type == type && chess.Camp == camp);
+
+ public IEnumerable GetChessmen() => AlivingChessman;
+
+ public IEnumerable GetMoves() => Moves;
+
+ ///
+ /// 移动棋子到目标位置,若目标位置存在棋子,则移除
+ ///
+ /// 棋子
+ /// 目标位置
+ /// 无法将棋子移动到己方棋子上
+ private void MoveChessman(Chessman chessman, ChessboardPosition target)
+ {
+ var tar = GetChessmanByPos(target);
+ if (tar != null)
+ {
+ if (chessman.Camp == tar.Camp)
+ throw new MoveException("无法将棋子移动到己方棋子上");
+
+ AlivingChessman.Remove(tar);
+ }
+ chessman.Position = target;
+ OnChessmanMoved(chessman, tar);
+ }
+
+ ///
+ /// 移动一步
+ ///
+ /// 移动方式
+ /// 未找到要进行移动的棋子
+ public void PushMove(ChessMove move)
+ {
+ var chessman = GetChessmanByPos(move.Start);
+ if (chessman == null)
+ throw new MoveException("未找到要进行移动的棋子");
+ MoveChessman(chessman, move.End);
+ Moves.Push(move);
+ }
+
+ ///
+ /// 退回上一步
+ ///
+ /// 已经退回到初始局面 or 未找到要进行移动的棋子
+ public void PopMove()
+ {
+ if (Moves.Count == 0)
+ throw new MoveException("已经退回到初始局面");
+ var move = Moves.Pop();
+
+ var chessman = GetChessmanByPos(move.End);
+ if (chessman == null)
+ throw new MoveException("未找到要进行移动的棋子");
+ MoveChessman(chessman, move.Start);
+ if (move.Killed != null)
+ AlivingChessman.Add(new Chessman((ChessType)move.Killed, chessman.Camp.RivalCamp(), move.End));
+ }
+ }
+
+ public class ChessmanMovedEventArgs : EventArgs
+ {
+ public ChessmanMovedEventArgs(Chessman chessman, Chessman chessmanKilled)
+ {
+ Chessman = chessman;
+ ChessmanKilled = chessmanKilled;
+ }
+
+ public Chessman Chessman { get; set; }
+ public Chessman ChessmanKilled { get; set; }
+ }
+
+ public class MoveException : Exception
+ {
+ public MoveException(string message) : base(message)
+ {
+ }
+
+ public MoveException(string message, Exception innerException) : base(message, innerException)
+ {
+ }
+
+ public MoveException() : this("移动失败")
+ {
+ }
}
}
\ No newline at end of file
diff --git a/ChineseChess.Core/Chessman.cs b/ChineseChess.Core/Chessman.cs
new file mode 100644
index 0000000..fcb084f
--- /dev/null
+++ b/ChineseChess.Core/Chessman.cs
@@ -0,0 +1,16 @@
+namespace ChineseChess.Core
+{
+ public class Chessman
+ {
+ public Chessman(ChessType type, ChessCamp camp, ChessboardPosition position)
+ {
+ Type=type;
+ Camp=camp;
+ Position=position;
+ }
+
+ public ChessType Type { get; set; }
+ public ChessCamp Camp { get; set; }
+ public ChessboardPosition Position { get; set; }
+ }
+}
\ No newline at end of file