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; }
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); }
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(); }
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; }
/// <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++; }
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(); }