/// <summary> /// 各段の駒文字を返します。 /// </summary> private static IEnumerable <string> RankToSfen(Board board, int rank) { var spaceCount = 0; for (var file = Board.BoardSize; file >= 1; --file) { var piece = board[file, rank]; if (piece == null) { // 駒がない場合 spaceCount += 1; } else { // 駒がある場合 if (spaceCount > 0) { yield return(spaceCount.ToString()); spaceCount = 0; } yield return(SfenUtil.PieceToSfen(piece)); } } // 空白の数は数字で示します。 if (spaceCount > 0) { yield return(spaceCount.ToString()); } }
/// <summary> /// 持ち駒をSFEN形式に変換します。 /// </summary> private static string HandToSfen(Board board) { var handList = from turn in new BWType[] { BWType.Black, BWType.White } from pieceType in EnumEx.GetValues <PieceType>() let obj = new { Piece = new BoardPiece(pieceType, false, turn), Count = board.GetHand(pieceType, turn), } where obj.Count > 0 select string.Format("{0}{1}", (obj.Count > 1 ? obj.Count.ToString() : ""), SfenUtil.PieceToSfen(obj.Piece)); // ToArray()しないと、MONOでstring.Joinのコンパイルに失敗します。 var array = handList.ToArray(); return(array.Any() ? string.Join("", array) : "-"); }