/// <summary> /// 駒の種類にかかわりなく、指定の位置に着手可能な指し手をすべて列挙します。 /// </summary> public IEnumerable <BoardMove> ListupMoves(BWType bwType, Square dstSquare) { // 打てる駒をすべて列挙します。 foreach (var pieceType in EnumEx.GetValues <PieceType>()) { if (GetCapturedPieceCount(pieceType, bwType) <= 0) { continue; } var move = BoardMove.CreateDrop(bwType, dstSquare, pieceType); // 駒打ちが可能なら、それも該当手となります。 if (CanMove(move, MoveFlags.CheckOnly)) { yield return(move); } } // 移動による指し手をすべて列挙します。 foreach (var srcSquare in Board.AllSquares()) { var moves = GetAvailableMove(bwType, srcSquare, dstSquare); foreach (var move in moves) { yield return(move); } } }
/// <summary> /// 玉の数を取得します。 /// </summary> private int GetGyokuCount(BWType bwType) { var list = from sq in Board.AllSquares() let piece = this[sq] where piece != null where piece.PieceType == PieceType.Gyoku where piece.BWType == bwType select sq; return(list.Count()); }
/// <summary> /// 局面上にある駒の数を取得します。 /// </summary> public int GetPieceCount(PieceType pieceType, BWType bwType) { var list = from sq in Board.AllSquares() let piece = this[sq] where piece != null where piece.PieceType == pieceType where piece.BWType == bwType select sq; return(list.Count()); }
/// <summary> /// 玉のいる位置を取得します。 /// </summary> public Square GetGyoku(BWType bwType) { var list = from sq in Board.AllSquares() let piece = this[sq] where piece != null where piece.PieceType == PieceType.Gyoku where piece.BWType == bwType select sq; return(list.FirstOrDefault()); }
/// <summary> /// 盤上の駒や持ち駒の先手・後手をすべて入れ替えます。 /// </summary> public void FlipPieces() { // すべての駒の先後を入れ替えます。 Board.AllSquares() .Where(_ => this[_] != null) .ForEach(_ => this[_].BWType = this[_].BWType.Flip()); // 各駒の位置を入れ替えます。 for (var rank = 1; rank <= Board.BoardSize / 2 + 1; ++rank) { // 5段目は途中の列まで交換します。 var fileMax = Board.BoardSize / (rank == 5 ? 2 : 1); for (var file = 1; file <= fileMax; ++file) { var sq1 = new Square(file, rank); var sq2 = sq1.Flip(); var p = this[sq1]; this[sq1] = this[sq2]; this[sq2] = p; } } // 持ち駒の先後を入れ替えます。(数を設定し直します) var result = from bwType in new BWType[] { BWType.Black, BWType.White } let countList = ( from type in EnumEx.GetValues <PieceType>() let count = GetHand(type, bwType) select new { PieceType = type, Count = count } ).ToList() select new { BWType = bwType, CountList = countList }; result.ToList().ForEach(_ => { var flipped = _.BWType.Flip(); _.CountList.ForEach(__ => SetHand(__.PieceType, flipped, __.Count)); }); }
/// <summary> /// 指定の局面で指せるすべての手を取得します。 /// </summary> public IEnumerable <Move> ListupMoves() { return(Board.AllSquares() .SelectMany(_ => ListupMoves(Turn, _))); }