/// <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); } }
/// <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> /// 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 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); }
/// <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; }
/// <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(); }
/// <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; } }
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; }
private void 下移_Click(object sender, EventArgs e) { MoveNode md = new MoveNode(treeView1); md.MoveDown(); }
/// <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 ? "+" : "")); }
private void Form1_Load(object sender, EventArgs e) { textBox3.Text = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory )+"\\New"; moveNode1 = new MoveNode(treeView1); //RELOAD Reload(); }
/// <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); } }
/// <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 ? "+" : "")); }
/// <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 }; }
/// <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; }