예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        /// <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);
            }
        }
예제 #3
0
        /// <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);
            }
        }
예제 #4
0
        /// <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);
            }
        }
예제 #5
0
        /// <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);
            }
        }
예제 #6
0
        /// <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);
            }
        }
예제 #7
0
        /// <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);
            }
        }
예제 #8
0
        /// <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);
            }
        }
예제 #9
0
        /// <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]);
            }
        }
예제 #10
0
        /// <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]);
            }
        }
예제 #11
0
 /// <summary>
 /// 局面と差し手をファイルに保存します。
 /// </summary>
 public void Save(TextWriter writer, KifuObject kifu)
 {
     WriteHeader(writer, kifu);
     WriteBoard(writer, kifu.StartBoard);
     WriteMoveNode(writer, kifu.RootNode);
 }
예제 #12
0
        /// <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);
            }
        }
예제 #13
0
 /// <summary>
 /// 局面と差し手をファイルに保存します。
 /// </summary>
 public void Save(TextWriter writer, KifuObject kifu)
 {
     WriteHeader(writer, kifu);
     WriteBoard(writer, kifu.StartBoard);
     WriteMoveNode(writer, kifu.RootNode);
 }