Beispiel #1
0
        void UndoMove(Move move, bool overwrite = true)
        {
            --CurrentValue;

            if (overwrite)
            {
                RemoveItem(MoveList.Count - 1, 1);
                MoveList.RemoveAt(MoveList.Count - 1);
            }
            ScreenControl.Interactable(MyColor == SColor.NB, Winner != SColor.NB);

            if (move.IsSpecial())
            {
                return;
            }

            var us = Position.sideToMove.Not();
            var st = Position.State();

            Debug.Assert(move == st.lastMove);

            Square to   = move.To();
            Piece  toPc = Position.PieceOn(to);

            PieceNo    pn   = Position.PieceNoOn(to);
            SquareHand from = move.IsDrop()
                ? Util.MakeSquareHand(us, move.DroppedPiece())
                : (SquareHand)move.From();
            Piece fromPc = move.IsPromote() ? toPc.RawType() : toPc;

            PiecePrefabs.MovePiece(from, fromPc, pn, move.IsPromote());

            Piece capPc = st.capturedPiece;

            if (capPc != Piece.NO_PIECE)
            {
                // 駒台の駒をtoに移動
                Piece   pr  = capPc.RawType();
                PieceNo pn2 = Position.HandPieceNo(us, pr, Position.Hand(us).Count(pr) - 1);

                Debug.Assert(pn2 != PieceNo.NONE);
                PiecePrefabs.CapturePiece((SquareHand)to, capPc.Type(), pn2, MyColor == SColor.NB);

                // テキストを非表示にする
                // Counters(Util.MakeSquareHand(us, pr)).text = null;
            }

            BoardManager.UnDoMove();
        }
Beispiel #2
0
        public void DoMove(Move move, bool overwrite = true)
        {
            //Debug.Log(USIExtensions.USI(move));

            if (overwrite)
            {
                // 上書きする指し手の数
                var num = MoveList.Count - Position.gamePly;
                if (num > 0)
                {
                    // 棋譜を上書きする
                    RemoveItem(Position.gamePly, num);
                    MoveList.RemoveRange(Position.gamePly, num);
                    CurrentValue = Position.gamePly;
                }

                EntryItem(move);
                MoveList.Add(move);
            }
            ++CurrentValue;
            //Debug.Log(CurrentValue);

            var us   = Position.sideToMove;
            var from = move.From();

            if (move.IsSpecial())
            {
                if (move == Move.RESIGN)
                {
                    Winner = us.Not();
                }

                ScreenControl.Interactable(MyColor == SColor.NB, true);
                return;
            }
            ScreenControl.Interactable(MyColor == SColor.NB, false);

            Piece movedPc      = move.IsDrop() ? move.DroppedPiece() : Position.PieceOn(from);
            Piece movedAfterPc = move.IsPromote() ? movedPc.ToInt() + Piece.PROMOTE : movedPc;

            PieceNo pn = move.IsDrop()
                ? Position.HandPieceNo(us, movedPc, Position.Hand(us).Count(movedPc) - 1)
                : Position.PieceNoOn(from);

            Debug.Assert(pn != PieceNo.NONE);
            PiecePrefabs.MovePiece((SquareHand)move.To(), movedAfterPc, pn, move.IsPromote());

            PieceNo pn2 = Position.PieceNoOn(move.To());

            if (pn2 != PieceNo.NONE)
            {
                var toPr = Position.PieceOn(move.To()).RawType();
                var sq   = Util.MakeSquareHand(us, toPr);
                PiecePrefabs.CapturePiece(sq, toPr, pn2, true);

                // テキストを表示
                // if (Position.Hand(us).Count(toPr) == 1)
                //    Counters(Util.MakeSquareHand(us, toPr)).text = "2";
            }

            BoardManager.DoMove(move);
            EndGame();
        }