Exemple #1
0
        public PieceKnight(Enums.GameSide manSide, Position position)
            : base(position)
        {
            this.GameSide = manSide;
            switch (manSide)
            {
            case Enums.GameSide.White:
                this.PieceType = Enums.PieceType.WhiteKnight;
                break;

            case Enums.GameSide.Black:
                this.PieceType = Enums.PieceType.BlackKnight;
                break;
            }
        }
Exemple #2
0
        public PieceQueen(Enums.GameSide side, Position position)
            : base(position)
        {
            this.GameSide = side;
            switch (side)
            {
            case Enums.GameSide.White:
                this.PieceType = Enums.PieceType.WhiteQueen;
                break;

            case Enums.GameSide.Black:
                this.PieceType = Enums.PieceType.BlackQueen;
                break;
            }
        }
Exemple #3
0
        /// <summary>
        /// 根据指定的棋子战方与指定的棋子X坐标获取开局的棋子坐标
        /// </summary>
        /// <param name="side">指定的棋子战方</param>
        /// <param name="x">指定的棋子X坐标</param>
        protected static Position GetOpenningsPosition(Enums.GameSide side, int x)
        {
            Position point = Position.Empty;

            switch (side)
            {
            case Enums.GameSide.White:
                point = new Position(x, 1);
                break;

            case Enums.GameSide.Black:
                point = new Position(x, 8);
                break;
            }
            return(point);
        }
Exemple #4
0
        public PiecePawn(Enums.GameSide side, Position position)
            : base(position)
        {
            this.GameSide          = side;
            this.EnableEnPassanted = false;
            switch (side)
            {
            case Enums.GameSide.White:
                this.PieceType = Enums.PieceType.WhitePawn;
                break;

            case Enums.GameSide.Black:
                this.PieceType = Enums.PieceType.BlackPawn;
                break;
            }
        }
        public PieceKing(Enums.GameSide side, Position position)
            : base(position)
        {
            this.GameSide = side;
            this.IsMoved  = false;
            switch (side)
            {
            case Enums.GameSide.White:
                this.PieceType = Enums.PieceType.WhiteKing;
                break;

            case Enums.GameSide.Black:
                this.PieceType = Enums.PieceType.BlackKing;
                break;
            }
        }
Exemple #6
0
        /// <summary>
        /// 象的基本路线(即斜向)
        /// </summary>
        internal static void BishopShift(
            Enums.GameSide side, ISituation situation, Position position,
            Positions moveInPs, Positions capturePs)
        {
            bool     canContine = true;
            Position tgtPos     = Position.Empty;

            canContine = true;
            tgtPos     = position;
            while (canContine)
            {
                tgtPos     = tgtPos.ShiftEastNorth();
                canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs);
            }

            canContine = true;
            tgtPos     = position;
            while (canContine)
            {
                tgtPos     = tgtPos.ShiftEastSouth();
                canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs);
            }

            canContine = true;
            tgtPos     = position;
            while (canContine)
            {
                tgtPos     = tgtPos.ShiftWestNorth();
                canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs);
            }

            canContine = true;
            tgtPos     = position;
            while (canContine)
            {
                tgtPos     = tgtPos.ShiftWestSouth();
                canContine = Position.Shift(side, situation, tgtPos, moveInPs, capturePs);
            }
        }
Exemple #7
0
 /// <summary>
 /// 获取另一战方的“王”
 /// </summary>
 /// <param name="currSide">另一战方</param>
 /// <param name="pieces">棋子的集合</param>
 public PieceKing GetOtherGameSideKing(Enums.GameSide currSide)
 {
     if (currSide == Enums.GameSide.Black)
     {
         foreach (Piece piece in _pieces)
         {
             if (piece.PieceType == Enums.PieceType.WhiteKing)
             {
                 return((PieceKing)piece);
             }
         }
     }
     else
     {
         foreach (Piece piece in _pieces)
         {
             if (piece.PieceType == Enums.PieceType.BlackKing)
             {
                 return((PieceKing)piece);
             }
         }
     }
     throw new GameException(ExString.PieceKingIsNull);
 }
        /// <summary>
        /// 从当前的位置移动到新位置。
        /// 而后,判断该位置中是否有棋子,并根据判断结果更新两个Position集合(可移动"位置"集合,可杀棋"位置"集合)。
        /// 并返回是否可以继续移动的判断。
        /// </summary>
        /// <param name="situation">当前局面</param>
        /// <param name="tgtPos">目标位置</param>
        /// <param name="moveInPs">可移动"位置"集合</param>
        /// <param name="capturePs">可杀棋"位置"集合</param>
        /// <param name="enableToMoved">该棋格为空时,是否可以移入,一般是指“兵”,“兵”的斜向的两个棋格对于“兵”来讲能吃子不能移入。</param>
        /// <returns>移动到新位置后是否可以继续移动(当目标棋格中无棋子)</returns>
        public static bool Shift(
            Enums.GameSide side, ISituation situation,
            Position tgtPos, Positions moveInPs, Positions capturePs, bool enableToMoved)
        {
            if (tgtPos == Position.Empty)
            {
                return(false);
            }

            char pieceChar;

            if (situation.TryGetPiece(tgtPos.Dot, out pieceChar))
            {
                if (char.IsLower(pieceChar) && side == Enums.GameSide.White)
                {
                    capturePs.Add(tgtPos);
                }
                if (char.IsUpper(pieceChar) && side == Enums.GameSide.Black)
                {
                    capturePs.Add(tgtPos);
                }
                return(false);
            }
            else
            {
                if (enableToMoved)
                {
                    moveInPs.Add(tgtPos);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
Exemple #9
0
        /// <summary>
        /// 移动指定位置棋格的棋子
        /// </summary>
        /// <param name="pair">指定的成对的位置,First值为源棋格,Second值是目标棋格</param>
        public void PieceMoveIn(PositionPair pair)
        {
            Enums.ActionCollection actions = new Enums.ActionCollection();
            Piece piece;

            if (this.TryGetPiece(pair.First.Dot, out piece))
            {
                //第1步,判断一下过路兵的格子的逻辑
                if (piece is PiecePawn)
                {
                    if (pair.First.Y == pair.Second.Y)
                    {
                        return;
                    }
                }
                actions.Add(Enums.Action.General);
                //第2步,判断目标棋格中是否有棋子。
                //如果有棋子,更改Action,调用PieceMoveOut方法。
                if (this.ContainsPiece(pair.Second.Dot))
                {
                    actions.Add(Enums.Action.Capture);
                    this.PieceMoveOut(pair.Second);
                }

                //第3步,调用内部方法PieceMoveIn,移动棋子,并更改FEN记录
                this.PieceMoveIn(piece, actions, pair.First, pair.Second);

                //第4步,如上一步棋出现过“过路兵”的局面,而现在进行了新的一步棋了,故而取消上一步棋的“过路兵”局面。
                if (_piecePawnByEnPassanted != null)
                {
                    _piecePawnByEnPassanted.EnableEnPassanted = false;
                    _piecePawnByEnPassanted = null;
                }

                //第5步,判断是否过路兵的局面
                if (piece is PiecePawn)
                {
                    #region 过路兵
                    //成为能被吃过路兵的“兵”
                    if ((pair.First.Y == 1 && pair.Second.Y == 3) || (pair.First.Y == 6 && pair.Second.Y == 4))
                    {
                        char     pawnChar;
                        Position tmpPos = pair.Second.ShiftWest();
                        if (tmpPos != null)
                        {
                            if (this.TryGetPiece(tmpPos.Dot, out pawnChar))
                            {
                                Enums.GameSide side = char.IsLower(pawnChar) ? Enums.GameSide.Black : Enums.GameSide.White;
                                if (this.GameSide == side)
                                {
                                    _piecePawnByEnPassanted = piece as PiecePawn;
                                    _piecePawnByEnPassanted.EnableEnPassanted = true;
                                }
                            }
                        }
                        tmpPos = pair.Second.ShiftEast();
                        if (tmpPos != null)
                        {
                            if (this.TryGetPiece(tmpPos.Dot, out pawnChar))
                            {
                                Enums.GameSide side = char.IsLower(pawnChar) ? Enums.GameSide.Black : Enums.GameSide.White;
                                if (this.GameSide == side)
                                {
                                    _piecePawnByEnPassanted = piece as PiecePawn;
                                    _piecePawnByEnPassanted.EnableEnPassanted = true;
                                }
                            }
                        }
                    }
                    else
                    {
                        ((PiecePawn)piece).EnableEnPassanted = false;
                    }
                    #endregion
                }

                //第6步,移动棋子后,根据移动棋子后的局面生成Action,主要是判断另一战方的“王”是否被将军
                actions.Add(this.IsCheckPieceKing(piece));


                //第7步,注册棋子移动后事件
                OnPieceMoveInEvent(piece, actions, pair);
            }
        }
 public PieceKing(Enums.GameSide side) : this(side, Position.Empty)
 {
 }
 public static bool Shift(
     Enums.GameSide side, ISituation situation,
     Position tgtPos, Positions moveInPs, Positions capturePs)
 {
     return(Shift(side, situation, tgtPos, moveInPs, capturePs, true));
 }