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