Exemplo n.º 1
0
        /// <summary>
        /// 変化の分岐を含めて出力します。
        /// </summary>
        private void WriteMoveNodeKif(TextWriter writer, MoveNode node,
                                      bool hasVariation)
        {
            if (node == null)
            {
                return;
            }

            // とりあえず指し手を書きます。
            if (node.Move != null)
            {
                writer.WriteLine(MakeLineKif(node, hasVariation));
            }

            // 次の指し手があればそれも出力します。
            for (var i = 0; i < node.NextNodes.Count(); ++i)
            {
                var child = node.NextNodes[i];
                var hasVariationNext = (i < node.NextNodes.Count() - 1);

                if (i > 0)
                {
                    writer.WriteLine();
                    writer.WriteLine();
                    writer.WriteLine("変化:{0}手", child.MoveCount);
                }

                WriteMoveNodeKif(writer, child, hasVariationNext);
            }
        }
Exemplo n.º 2
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);
            }
        }
Exemplo n.º 3
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);
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 変化の分岐を含めて出力します。
        /// </summary>
        private void WriteMoveNodeKif(TextWriter writer, MoveNode node,
                                      bool hasVariation)
        {
            if (node == null)
            {
                return;
            }

            // とりあえず指し手を書きます。
            if (node.Move != null)
            {
                WriteMakeKif(writer, node, hasVariation);
            }

            // ついでにコメント行も出力します。
            // 先頭ノードは指し手がありませんが
            // コメントは存在することがあります。
            if (!string.IsNullOrEmpty(node.Comment))
            {
                WriteCommentKif(writer, node);
            }

            // 次の指し手があればそれも出力します。
            for (var i = 0; i < node.NextNodes.Count(); ++i)
            {
                var child = node.NextNodes[i];
                var hasVariationNext = (i < node.NextNodes.Count() - 1);

                if (i > 0)
                {
                    writer.WriteLine();
                    writer.WriteLine();
                    writer.WriteLine("変化:{0}手", child.MoveCount);
                }

                WriteMoveNodeKif(writer, child, hasVariationNext);
            }
        }
 /// <summary>
 /// Create a node for a move node
 /// </summary>
 /// <param name="position"></param>
 /// <param name="action"></param>
 /// <param name="dir"></param>
 /// <returns></returns>
 protected Node<MoveNode> CreateNode(DataBlock block, MoveNode.Type action, MoveNode.Direction dir)
 {
     return CreateNode(block.GridPosition, action, dir);
 }
Exemplo n.º 6
0
        /// <summary>
        /// ヘッダー行をパースします。
        /// </summary>
        private bool ParseLine(string line, CsaBoardParser parser)
        {
            if (line == null)
            {
                // ファイルの終了を意味します。
                return false;
            }

            if (CsaUtil.IsCommentLine(line))
            {
                return true;
            }

            // 局面の読み取りを試みます。
            if (parser.TryParse(line))
            {
                if (parser.HasBoard && !parser.IsBoardParsing)
                {
                    this.startBoard = parser.Board.Clone();
                    this.board = this.startBoard.Clone();
                }

                return true;
            }

            switch (line[0])
            {
                case 'V':
                    return true;

                case 'N':
                    ParseName(line);
                    return true;

                case '$':
                    ParseHeader(line);
                    return true;

                case '+': case '-':
                    var move = ParseMove(line);
                    var node = new MoveNode
                    {
                        Move = move,
                    };

                    this.lastNode.AddNext(node);
                    this.lastNode = node;
                    return true;

                case 'T':
                    var seconds = ParseTime(line);
                    if (this.lastNode != null)
                    {
                        this.lastNode.DurationSeconds = seconds;
                    }
                    return true;

                case '%':
                    return true;
            }

            return false;
        }
Exemplo n.º 7
0
        /// <summary>
        /// ファイル内容から棋譜ファイルを読み込みます。
        /// </summary>
        public KifuObject Load(TextReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException("reader");
            }

            this.reader = reader;
            this.currentLines = null;
            this.currentLineIndex = 0;
            this.lineNumber = 0;

            this.header = new KifuHeader();
            this.startBoard = null;
            this.board = null;
            this.rootNode = new MoveNode();
            this.lastNode = this.rootNode;

            return LoadCsa();
        }
Exemplo n.º 8
0
        /// <summary>
        /// このReaderで与えられたファイルを処理できるか調べます。
        /// </summary>
        public bool CanHandle(TextReader reader)
        {
            try
            {
                this.reader = reader;
                this.currentLines = null;
                this.currentLineIndex = 0;
                this.lineNumber = 0;

                this.header = new KifuHeader();
                this.startBoard = null;
                this.board = null;
                this.rootNode = new MoveNode();
                this.lastNode = this.rootNode;

                // ファイルを3行読めれば、CSA形式であると判断します。
                var parser = new CsaBoardParser();
                for (var i = 0; i < 3; ++i)
                {
                    var line = ReadNextLine();

                    if (line == null)
                    {
                        return true;
                    }

                    if (!ParseLine(line, parser))
                    {
                        return false;
                    }
                }

                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
Exemplo n.º 9
0
        private void 文件夹_Opening(object sender, CancelEventArgs e)
        {
            在文件资源管理器中打开ToolStrip1.Enabled = Directory.Exists(filename);
            删除ToolStripMenuItem.Enabled = Directory.Exists(filename);
            剪切ToolStripMenuItem.Enabled = Directory.Exists(filename);
            复制ToolStripMenuItem.Enabled = Directory.Exists(filename);
            复制ToolStripMenuItem.Enabled = Directory.Exists(filename);
            粘贴ToolStripMenuItem.Enabled = Directory.Exists(filename);
            重命名ToolStripMenuItem.Enabled = Directory.Exists(filename);
            属性RToolStripMenuItem.Enabled = Directory.Exists(filename);

            MoveNode md = new MoveNode(treeView1);
            moveup1.Enabled =  md.CanMoveUp;
            movedown1.Enabled = md.CanMoveDown;
        }
Exemplo n.º 10
0
 private void 下移_Click(object sender, EventArgs e)
 {
     MoveNode md = new MoveNode(treeView1);
     md.MoveDown();
 }
Exemplo n.º 11
0
        /// <summary>
        /// 指し手行、1行分を作成します。
        /// </summary>
        private string MakeLineKif(MoveNode node, bool hasVariation)
        {
            // 半角文字相当の文字数で空白の数を計算します。
            var moveText = node.Move.ToString();
            var hanLen = moveText.HankakuLength();

            return string.Format("{0,4} {1}{2} ( 0:00/00:00:00){3}",
                node.MoveCount,
                moveText,
                new string(' ', Math.Max(0, 14 - hanLen)),
                (hasVariation ? "+" : ""));
        }
Exemplo n.º 12
0
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox3.Text = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory )+"\\New";
            moveNode1 = new MoveNode(treeView1);

            //RELOAD

            Reload();
        }
Exemplo n.º 13
0
        /// <summary>
        /// コメント行を出力します。
        /// </summary>
        private void WriteCommentKif(TextWriter writer, MoveNode node)
        {
            var commentList = node.Comment.Split(
                new char[] { '\n' },
                StringSplitOptions.RemoveEmptyEntries);

            foreach (var comment in commentList)
            {
                writer.WriteLine("*{0}", comment);
            }
        }
Exemplo n.º 14
0
        /// <summary>
        /// 指し手行を出力します。
        /// </summary>
        private void WriteMakeKif(TextWriter writer, MoveNode node, bool hasVariation)
        {
            // 半角文字相当の文字数で空白の数を計算します。
            var moveText = node.Move.ToString();
            var hanLen = moveText.HankakuLength();

            writer.WriteLine(
                @"{0,4} {1}{2} ({3:mm\:ss}/{4:hh\:mm\:ss}){5}",
                node.MoveCount,
                moveText,
                new string(' ', Math.Max(0, 14 - hanLen)),
                node.Duration,
                node.TotalDuration,
                (hasVariation ? "+" : ""));
        }
Exemplo n.º 15
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="position"></param>
 /// <param name="action"></param>
 /// <param name="dir"></param>
 /// <returns></returns>
 protected Node<MoveNode> CreateNode(Point position, MoveNode.Type action, MoveNode.Direction dir)
 {
     var node = new MoveNode() { Position =position };
     node.Action = action;
     node.Dir = dir;
     return new Node<MoveNode>() { Value = node };
 }
Exemplo n.º 16
0
        /// <summary>
        /// Checks if node is still movable
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        protected Boolean IsValid(MoveNode from, MoveNode to)
        {
            // There was no previous node, so it's valid
            if (from.Action == MoveNode.Type.None)
                return true;

            // Already on the next node, so it's valid
            if (from.Equals(to))
                return true;

            // Look up if to is still a neighbour of from (pre-calc)
            List<Node<MoveNode>> neighbours = null;
            if (_neighbours.TryGetValue(from, out neighbours))
                return neighbours.Any(n => n.Value.Equals(to));

            // Fetch and look up
            return CreateMoveNodesFrom(new Node<MoveNode>() { Value = from }).Any(n => n.Value.Equals(to));
        }
 /// <summary>
 /// Wanders from a to b
 /// </summary>
 /// <param name="from"></param>
 /// <param name="to"></param>
 internal void Wander(MoveNode from, MoveNode? to)
 {
     this.PreviousNode = from;
     this.WanderingNode = to;
 }