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