public void ResetBoard()
 {
     for (int i = 0; i < GameParams.BoardHeight; i++)
     {
         var indexI     = GetDefaultBoardIndex(i);
         var pieceColor = i < 5 ? PieceColor.Red : PieceColor.Black;
         for (int j = 0; j < GameParams.BoardWidth; j++)
         {
             var indexJ    = 4 - Mathf.Abs(j - 4);
             var pieceType = defaultBoard[indexI, indexJ];
             BoardPieces[j, i] = new PieceInfo(pieceType, pieceColor);
         }
     }
 }
 public void SetPieceInfo(PiecePoint point, PieceInfo info)
 {
     BoardPieces[point.X, point.Y] = info;
 }
        private static HashSet <PiecePoint> GetActionPointsAroundEye(
            ChessBoard board,
            ChessPiece piece,
            Direction[] wayDirections,
            PiecePoint eyePoint,
            bool isStepPiece = true,
            bool isCannon    = false,
            bool isKing      = false,
            bool addition    = false)
        {
            var actionWays = new HashSet <PiecePoint>();

            foreach (var wayDirection in wayDirections)
            {
                var wayPoint = eyePoint ?? piece.PiecePoint;
                do
                {
                    wayPoint = wayPoint.GetPointInDirection(wayDirection);
                    var flag = GetLegalFlag(board, piece, wayPoint);
                    if (!IsLegal(flag) || (flag == LegalFlag.Eatting && isCannon && !addition))
                    {
                        break;
                    }
                    actionWays.Add(wayPoint);
                    if (IsLegalPointNotBlank(flag))
                    {
                        break;
                    }
                } while (!isStepPiece);
                if (isCannon)
                {
                    do
                    {
                        wayPoint = wayPoint.GetPointInDirection(wayDirection);
                    }while (IsLegalPoint(board, piece, wayPoint));
                    if (IsLegalPointNotBlank(board, piece, wayPoint))
                    {
                        actionWays.Add(wayPoint);
                    }
                }
            }
            if (isKing)
            {
                var pieceInfo = new PieceInfo();
                var wayPoint  = piece.PiecePoint;
                var direction = wayPoint.Y < 5 ? Direction.Up : Direction.Down;
                do
                {
                    wayPoint = wayPoint.GetPointInDirection(direction);
                    if (!ActionAreaRule.FullArea.IsPointInArea(wayPoint))
                    {
                        break;
                    }
                    pieceInfo = board.GetPieceInfo(wayPoint);
                } while (pieceInfo.IsBlank());
                if (pieceInfo.PieceType == PieceType.King)
                {
                    actionWays.Add(wayPoint);
                }
            }
            return(actionWays);
        }
 public ChessPiece(PiecePoint point, PieceInfo info)
 {
     PiecePoint = point;
     PieceInfo  = info;
 }
 public PieceInfo EatOrFusePiece(PieceInfo info)
 {
     return(PieceInfo * info);
 }
 public PieceInfo Divide(PieceInfo info)
 {
     return(PieceInfo - info);
 }
 public bool CanFuse(PieceInfo info)
 {
     return(PieceInfo.CanFuse(PieceInfo, info));
 }
 public bool CanEat(PieceInfo info)
 {
     return(PieceInfo.CanEat(PieceInfo, info));
 }