Example #1
0
        public static void CapturePiece(SquareHand sq, Piece pt, PieceNo pn, bool box2dEnable)
        {
            var pickedTo = Pieces[(int)pn];
            var sr       = pickedTo.GetComponent <SpriteRenderer>();

            sr.sprite = SpriteManager.GetSprite(pt);
            sr.flipX  = sr.flipY = !sr.flipX;

            pickedTo.transform.position = PositionConst.SquareToPosition(sq);
            pickedTo.GetComponent <BoxCollider2D>().enabled = box2dEnable;
        }
Example #2
0
        public static void MovePiece(SquareHand sq, Piece pc, PieceNo pn, bool newsprite)
        {
            var pickedFrom = Pieces[(int)pn];

            if (newsprite)
            {
                pickedFrom.GetComponent <SpriteRenderer>().sprite = SpriteManager.GetSprite(pc.Type());
            }

            // 駒をsqに移動
            pickedFrom.transform.position = PositionConst.SquareToPosition(sq);
        }
Example #3
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();
        }
Example #4
0
        public static void PutPiece(Square sq, Piece pc, PieceNo pn, SColor us, Transform parent)
        {
            var pieceObject = Instantiate(PiecePrefab, parent);

            pieceObject.transform.position = PositionConst.SquareToPosition(sq);

            var sr = pieceObject.GetComponent <SpriteRenderer>();

            sr.sprite = SpriteManager.GetSprite(pc.Type());
            sr.flipX  = sr.flipY = pc.PieceColor() == SColor.WHITE;

            var boxCollider = pieceObject.GetComponent <BoxCollider2D>();

            boxCollider.enabled = us == SColor.NB || us == pc.PieceColor();
            Pieces[(int)pn]     = pieceObject;
        }
Example #5
0
        /// <summary>
        /// 指し手で盤面を1手進める
        /// </summary>
        /// <param name="m"></param>
        public void DoMove(Move m)
        {
            Color  Us = sideToMove, them = Us.Not();
            Square to = m.To();

            // StateInfoの更新
            var newSt = new StateInfo
            {
                previous = st,
                key      = st.key
            };

            st = newSt;

            if (m.IsDrop())
            {
                Piece pr = m.DroppedPiece();
                Piece pc = Util.MakePiece(Us, pr);
                Hand(Us).Sub(pr);

                PieceNo pn = HandPieceNo(Us, pr, Hand(Us).Count(pr));

                PutPiece(to, pc, pn);

                // hash keyの更新
                st.key -= Zobrist.Hand(Us, pr);
                st.key += Zobrist.Psq(to, pc);

                st.capturedPiece = Piece.NO_PIECE;
            }
            else
            {
                Square  from     = m.From();
                PieceNo pn       = PieceNoOn(from);
                Piece   moved_pc = RemovePiece(from);

                PieceNoOn(from) = PieceNo.NONE;

                if ((Pieces(them) & to).IsNotZero())
                {
                    Piece to_pc = PieceOn(to);
                    Piece pr    = to_pc.RawType();

                    PieceNo pn2 = PieceNoOn(to);
                    HandPieceNo(Us, pr, Hand(Us).Count(pr)) = pn2;

                    Hand(Us).Add(pr);

                    // 捕獲された駒が盤上から消えるので局面のhash keyを更新する
                    st.key -= Zobrist.Psq(to, to_pc);
                    st.key += Zobrist.Hand(Us, pr);

                    RemovePiece(to);
                    st.capturedPiece = to_pc;
                }
                else
                {
                    st.capturedPiece = Piece.NO_PIECE;
                }

                Piece moved_after_pc = moved_pc + (m.IsPromote() ? Piece.PROMOTE.ToInt() : 0);
                PutPiece(to, moved_after_pc, pn);

                // fromにあったmoved_pcがtoにmoved_after_pcとして移動した。
                st.key -= Zobrist.Psq(from, moved_pc);
                st.key += Zobrist.Psq(to, moved_after_pc);
            }
            sideToMove = them;

            // -- update

            // bitboardを更新
            UpdateBitboards();

            // 王手関係の情報を更新
            SetCheckInfo(st);

            // 直前の指し手の更新
            st.lastMove = m;

            // Zobrist.sideはp1==0が保証されているのでこれで良い
            st.key.p.p0 ^= Zobrist.Side.p.p0;

            gamePly++;
        }
Example #6
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();
        }