/// <summary> /// ヘッダ部分を出力します。 /// </summary> private void WriteHeader(TextWriter writer, KifuObject kifu) { writer.WriteLine("' ---- Ragnarok 棋譜ファイル ----"); // 対局者名は別腹で行きます。 var value = kifu.Header[KifuHeaderType.BlackName]; if (value != null) { writer.WriteLine("N+{0}", value); } value = kifu.Header[KifuHeaderType.WhiteName]; if (value != null) { writer.WriteLine("N-{0}", value); } // 他のヘッダアイテムを書き出します。 foreach (var item in kifu.Header) { var name = CsaUtil.GetHeaderName(item.Key); if (name == null) { continue; } writer.WriteLine("${0}:{1}", name, item.Value); } }
/// <summary> /// CSA形式の指し手を出力します。 /// </summary> private void WriteMoveNode(TextWriter writer, MoveNode node) { var csaList = KifuObject.Convert2List(node) .Select(_ => _.ToCsa()); // 各指し手行を出力します。 foreach (var csa in csaList) { writer.WriteLine(csa); } }
/// <summary> /// 局面と差し手をファイルに保存します。 /// </summary> public void Save(TextWriter writer, KifuObject kifu) { WriteHeader(writer, kifu); WriteBoard(writer, kifu.StartBoard); if (IsKif) { WriteMoveNodeKif(writer, kifu.RootNode, kifu.StartBoard, false); } else { WriteMoveNodeKi2(writer, kifu.RootNode, kifu.StartBoard); } }
/// <summary> /// ki2形式の指し手を出力します。 /// </summary> private void WriteMoveNodeKi2(TextWriter writer, MoveNode node, Board board) { var moveList = KifuObject.Convert2List(node); var lineList = board.ConvertMove(moveList, false) .Select(_ => _.ToString()) .TakeBy(6) .Select(_ => string.Join(" ", _.ToArray())); // 各指し手行を出力します。 foreach (var line in lineList) { writer.WriteLine(line); } }
/// <summary> /// ヘッダ部分を出力します。 /// </summary> private void WriteHeader(TextWriter writer, KifuObject kifu) { writer.WriteLine("# ---- 棋譜ファイル ----"); foreach (var item in kifu.Header) { var name = KifUtil.GetHeaderName(item.Key); if (name == null) { continue; } writer.WriteLine("{0}:{1}", name, item.Value); } }
/// <summary> /// ki2形式の指し手を出力します。 /// </summary> private void WriteMoveNodeKi2(TextWriter writer, MoveNode node, Board board) { // 先頭ノードは指し手がありませんが // コメントは存在することがあります。 WriteComment(writer, node); var moveList = KifuObject.Convert2List(node); var lineList = board.ConvertLiteralListFromMove(moveList, false) .Where(_ => _ != null && _.Validate()) .Where(_ => _.SpecialMoveType == SpecialMoveType.None) .Select(_ => Stringizer.ToString(_, MoveTextStyle.Normal)) .TakeBy(6) .Select(_ => string.Join(" ", _.ToArray())); // 各指し手行を出力します。 foreach (var line in lineList) { writer.WriteLine(line); } }
/// <summary> /// 棋譜の出力+入力を行い、ファイルが正しく扱えているか調べます。 /// </summary> public static void ReadWriteTest(KifuObject kifu0, KifuFormat format, int moveCount) { // 棋譜の書き出し var wrote = KifuWriter.WriteTo(kifu0, format); Assert.IsNotNullOrEmpty(wrote); // 棋譜の読み込み パート2 var kifu1 = KifuReader.LoadFrom(wrote); Assert.NotNull(kifu1); // 読み込んだ棋譜の確認 Assert.LessOrEqual(moveCount, kifu1.MoveList.Count()); // 局面の比較を行います。 var board0 = kifu0.StartBoard.Clone(); kifu0.MoveList.ForEach(_ => board0.DoMove(_)); var board1 = kifu1.StartBoard.Clone(); kifu1.MoveList.ForEach(_ => board1.DoMove(_)); Assert.True(Board.BoardEquals(kifu0.StartBoard, kifu1.StartBoard)); Assert.True(kifu0.RootNode.NodeEquals(kifu1.RootNode, true)); Assert.True(Board.BoardEquals(board0, board1)); // ヘッダ要素を比較します。 Assert.AreEqual(kifu0.Header.Count(), kifu1.Header.Count()); foreach (var item0 in kifu0.Header) { Assert.True(kifu1.Header.Contains(item0.Key)); Assert.AreEqual(item0.Value, kifu1.Header[item0.Key]); } }
/// <summary> /// 棋譜の出力+入力を行い、ファイルが正しく扱えているか調べます。 /// </summary> public static void ReadWriteTest(KifuObject kifu0, KifuFormat format, int moveCount) { // 棋譜の書き出し var wrote = KifuWriter.WriteTo(kifu0, format); Assert.IsNotNullOrEmpty(wrote); // 棋譜の読み込み パート2 var kifu1 = KifuReader.LoadFrom(wrote); Assert.NotNull(kifu1); // 読み込んだ棋譜の確認 Assert.LessOrEqual(moveCount, kifu1.MoveList.Count()); // 局面の比較を行います。 var board0 = kifu0.StartBoard.Clone(); kifu0.MoveList.ForEach(_ => board0.DoMove(_)); var board1 = kifu1.StartBoard.Clone(); kifu1.MoveList.ForEach(_ => board1.DoMove(_)); Assert.True(Board.BoardEquals(kifu0.StartBoard, kifu1.StartBoard)); Assert.True(kifu0.RootNode.NodeEquals(kifu1.RootNode)); Assert.True(Board.BoardEquals(board0, board1)); // ヘッダ要素を比較します。 Assert.AreEqual(kifu0.Header.Count(), kifu1.Header.Count()); foreach (var item0 in kifu0.Header) { Assert.True(kifu1.Header.Contains(item0.Key)); Assert.AreEqual(item0.Value, kifu1.Header[item0.Key]); } }
/// <summary> /// 局面と差し手をファイルに保存します。 /// </summary> public void Save(TextWriter writer, KifuObject kifu) { WriteHeader(writer, kifu); WriteBoard(writer, kifu.StartBoard); WriteMoveNode(writer, kifu.RootNode); }
/// <summary> /// 局面と差し手をファイルに保存します。 /// </summary> public void Save(TextWriter writer, KifuObject kifu) { WriteHeader(writer, kifu); WriteBoard(writer, kifu.StartBoard); if (IsKif) { WriteMoveNodeKif(writer, kifu.RootNode, false); } else { WriteMoveNodeKi2(writer, kifu.RootNode, kifu.StartBoard); } }