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