コード例 #1
0
        /// <summary>
        /// 実際に指し手を進めます。
        /// </summary>
        private void MakeMove(Move move)
        {
            if (move == null || !move.Validate())
            {
                return;
            }

            Board.DoMove(move);
            BoardModel.FireBoardChanged(
                this, new BoardChangedEventArgs(Board, move, false, true));
        }
コード例 #2
0
ファイル: GLShogiElement.cs プロジェクト: Shiiina/Ragnarok
        /// <summary>
        /// 局面を設定します。
        /// </summary>
        public void SetBoard(Board board, Move move, bool isUndo = false)
        {
            if (board == null)
            {
                throw new ArgumentNullException("board");
            }

            EndMove();

            if (!ReferenceEquals(Board, board))
            {
                Board = board;
            }

            BoardModel.FireBoardChanged(
                this, new BoardChangedEventArgs(board, move, isUndo, false));
        }
コード例 #3
0
        /// <summary>
        /// 編集モードでの駒の移動を行います。
        /// </summary>
        /// <remarks>
        /// 駒の移動元・移動先は
        /// ・盤面上のマス
        /// ・駒台 or 駒箱
        /// の2種類があります。
        /// </remarks>
        private void DoMoveEditing(Square dstSquare, BWType?boxColor)
        {
            var piece     = this.movingPiece.BoardPiece;
            var srcSquare = this.movingPiece.Square;

            if (dstSquare == null && boxColor == null)
            {
                throw new ArgumentException("DoMoveEditing");
            }

            // 駒箱から持ってきた場合は先手側の駒として置きます。
            var bwType = (
                piece.BWType == BWType.None ?
                ViewSide : piece.BWType);

            // 先に盤面の状態を元に戻しておきます。
            EndMove();

            // 盤上に駒を動かす場合は、2歩を禁止する必要があります。
            if (dstSquare != null && piece.Piece == Piece.Hu)
            {
                // 同じ筋に動かす場合は2歩の判定を行いません。
                if ((srcSquare == null || dstSquare.File != srcSquare.File) &&
                    (Board.GetPawnCount(bwType, dstSquare.File) > 0))
                {
                    return;
                }
            }

            if (dstSquare != null &&
                Board.IsPromoteForce(piece.Piece, piece.BWType, dstSquare))
            {
                piece.IsPromoted = true;
            }

            // 移動元の駒の消去
            if (srcSquare != null)
            {
                // 盤上の移動前にあった駒を削除します。
                Board[srcSquare] = null;
            }
            else
            {
                // 駒箱などの駒の数を減らします。
                DecHandCount(piece.PieceType, piece.BWType);
            }

            if (boxColor != null)
            {
                // 駒箱へ移動する場合
                IncHandCount(piece.PieceType, boxColor.Value);
            }
            else if (dstSquare != null)
            {
                // 移動先が盤上の場合
                var target = Board[dstSquare];
                if (target != null)
                {
                    IncHandCount(target.PieceType, piece.BWType);

                    Board[dstSquare] = null;
                }

                // 移動先の駒を増やします。
                Board[dstSquare] =
                    new BoardPiece(piece.PieceType, piece.IsPromoted, bwType);
            }

            BoardModel.FireBoardChanged(
                this, new BoardChangedEventArgs(Board, true));
        }