/// <summary> /// 局面文字列を書き出す /// フォーマットは引数のkfで指定する。 /// </summary> /// <param name="filename"></param> /// <param name="kf"></param> public string ToPositionString(KifuFileType kt) { string result = string.Empty; switch (kt) { // 局面出力の専用ルーチンを使用 case KifuFileType.KIF: case KifuFileType.KI2: result = ToKifPositionString(kt); break; case KifuFileType.SVG: result = ToSvgPositionString(); break; // 局面出力を用意していないものは、棋譜書き出しルーチンを流用して出力する default: var kifu = new KifuManager(); // 経路を消すためにsfen化して代入しなおして書き出す kifu.FromString($"sfen {Position.ToSfen()}"); kifu.KifuHeader.PlayerNameBlack = KifuHeader.PlayerNameBlack; kifu.KifuHeader.PlayerNameWhite = KifuHeader.PlayerNameWhite; result = kifu.ToString(kt); break; // ToDo : 他の形式もサポートする } return(result); }
/// <summary> /// 局面文字列を書き出す /// フォーマットは引数のkfで指定する。 /// </summary> /// <param name="filename"></param> /// <param name="kf"></param> public string ToPositionString(KifuFileType kt) { string result = string.Empty; switch (kt) { case KifuFileType.SVG: // SVG形式は専用ルーチンを使用 result = ToSvgString(); break; default: // SVG形式以外は、棋譜書き出しルーチンを流用して出力する var kifu = new KifuManager(); // 経路を消すためにsfen化して代入しなおして書き出す kifu.FromString($"sfen {Position.ToSfen()}"); kifu.KifuHeader.PlayerNameBlack = KifuHeader.PlayerNameBlack; kifu.KifuHeader.PlayerNameWhite = KifuHeader.PlayerNameWhite; result = kifu.ToString(kt); break; // ToDo : 他の形式もサポートする } return(result); }
// -- static method /// <summary> /// rootSfen(開始局面のsfen)とmoves(手順)を指定して、棋譜形式の文字列を得る。 /// /// エラーがあればnullが返る。 /// </summary> /// <param name="rootSfen"></param> /// <param name="moves"></param> /// <returns></returns> public static string ToStringFromRootSfenAndMoves(KifuFileType type, string rootSfen, List <Move> moves) { // 一度、sfenから生成するのがお手軽か? var kifuManager = new KifuManager(); var sfen = Core.Util.RootSfenAndMovesToUsiString(rootSfen, moves); var error = kifuManager.FromString(sfen); return(error == null?kifuManager.ToString(type) : null); }
/// <summary> /// contentの棋譜を分岐棋譜としてマージする。 /// マージした棋譜の本譜の末尾のnodeを表示している状態になる。 /// この動作が気に要らなければ、呼び出し側で分岐の起点に移動するなどすべき。 /// /// LocalGameServerから呼び出される用。 /// </summary> /// <param name="content"></param> /// <returns></returns> public string MergeFromString(string content) { // イベントの一時抑制 var e = Tree.PropertyChangedEventEnable; Tree.PropertyChangedEventEnable = false; // マージする棋譜の本譜の末尾のsfen string leafSfen = null; try { var kifuManager = new KifuManager(); var error = kifuManager.FromString(content); if (error != null) { return(error); } // 末尾の局面に移動しているはずなので、それをsfen化しておく。(あとでその局面に移動したい考え) leafSfen = kifuManager.Tree.position.ToSfen(); int pliesFromRoot = kifuManager.Tree.pliesFromRoot; Debug.Assert(kifuManager.Tree.currentNode.prevNode != null); // thisとkifuManagerの棋譜のマージを行う。 error = Tree.Merge(kifuManager.Tree); if (error != null) { return(error); } // -- マージは完了した。 // このタイミングで棋譜Listを同期させる必要がある。 // (検討モードだと、現在の選択行の後方に棋譜行が存在している状態で呼び出されているため) Tree.RewindToRoot(); Tree.ClearKifuForward(); // マージする棋譜の末尾の局面に移動する。 error = FastForwardSfen(leafSfen); if (error != null) { return(error); } } finally { // イベントの一時抑制を解除して、更新通知を送る。 Tree.PropertyChangedEventEnable = true; Tree.RaisePropertyChanged("KifuList", new List <KifuListRow>(Tree.KifuList)); Tree.RaisePropertyChanged("Position", Tree.position.Clone()); } #if false var kif = ToString(KifuFileType.KIF); Console.WriteLine(kif); #endif return(null); }