/// <summary> /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような) /// /// TODO: 打ち歩詰めチェック /// /// </summary> /// <param name="src_Sky"></param> /// <param name="fingers"></param> /// <returns></returns> public static List_OneAndMulti <Finger, SySet <SyElement> > Get_PotentialMove_Motikoma( SkyConst src_Sky, Fingers fingers, SySet <SyElement> okenaiMasus ) { // 「どの持ち駒を」「どこに置いたとき」「どこに利きがある」のコレクション。 List_OneAndMulti <Finger, SySet <SyElement> > resultOmm = new List_OneAndMulti <Finger, SySet <SyElement> >(); foreach (Finger donoKoma in fingers.Items) { // ポテンシャル・ムーブを調べます。 RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(donoKoma).Now); PieceType syurui = Haiyaku184Array.Syurui(koma.Haiyaku); // 置ける升 SySet <SyElement> okeruMasus = Util_Sky.KomaKidou_Potential(donoKoma, src_Sky); // 置けない升を引きます。 okeruMasus = okeruMasus.Minus_Closed(okenaiMasus); if (syurui == PieceType.P) { // 二歩チェック int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); Fingers sujiKomas = Util_Sky.Fingers_InSuji(src_Sky, suji); Starlight fu = src_Sky.StarlightIndexOf(donoKoma); Fingers existFu = Util_Sky.Matches(fu, src_Sky, sujiKomas); if (0 < existFu.Count) { // 二歩だ☆! goto gt_Next; } // TODO:打ち歩詰めチェック } if (!okeruMasus.IsEmptySet()) { // 空でないなら resultOmm.AddNew(donoKoma, okeruMasus); } gt_Next: ; } return(resultOmm); }
public void Log3( SkyConst src_Sky, Playerside tebanKurau, //手番(喰らう側) Playerside tebanSeme, //手番(利きを調べる側) Fingers fingers_kurau_IKUSA, //戦駒(喰らう側) Fingers fingers_kurau_MOTI, // 持駒(喰らう側) Fingers fingers_seme_IKUSA, //戦駒(利きを調べる側) Fingers fingers_seme_MOTI // 持駒(利きを調べる側) ) { // 攻め手の駒の位置 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove); foreach (Finger finger in fingers_seme_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu2.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } foreach (Finger finger in fingers_seme_MOTI.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); this.BrdMove.KomaMasu3.Add(km); } foreach (Finger finger in fingers_kurau_MOTI.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu4.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } this.BrdMove = boardLog_clone; }
public static string MoveToStringForLog(ShootingStarlightable move) { string moveInfo; RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); moveInfo = KomaSyurui14Array.ToIchimoji(Haiyaku184Array.Syurui(koma.Haiyaku)); return(moveInfo); }
public static string MoveToStringForLog(ShootingStarlightable move, Playerside pside_genTeban) { string result; if (null == move) { result = "合法手はありません。"; goto gt_EndMethod; } RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); // 指し手を「△歩」といった形で。 result = KomaSyurui14Array.ToNimoji(Haiyaku184Array.Syurui(koma.Haiyaku), pside_genTeban); gt_EndMethod: return(result); }
/// <summary> /// ハブ・ノードの次ノード・リストをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="hubNode"></param> /// <param name="comment"></param> /// <param name="logTag"></param> /// <returns></returns> public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <ShootingStarlightable, KyokumenWrapper> hubNode, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> node, ref bool toBreak) => { ShootingStarlightable move = node.Key; RO_Star_Koma srcKoma1 = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); Finger srcKoma2 = Util_Sky.Fingers_AtMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst(); // 駒1つ PieceType ks14 = Haiyaku184Array.Syurui(dstKoma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // マス sb.AppendLine(" { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },"); string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, srcKoma2, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");//FIXME:おかしい? // コメント sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
/// <summary> /// 駒別マスをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="km_move"></param> /// <param name="comment"></param> /// <returns></returns> public static string JsonKyokumens_MultiKomabetuMasus(bool enableLog, SkyConst src_Sky_base, Maps_OneAndOne <Finger, SySet <SyElement> > km_move, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } km_move.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { // 駒1つ RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky_base.StarlightIndexOf(key).Now); PieceType ks14 = Haiyaku184Array.Syurui(koma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // 全マス foreach (Basho masu in value.Elements) { sb.AppendLine(" { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(masu) + " },"); } string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, key, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(koma.Masu) + " },");//FIXME:おかしい? // コメント sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
public static string Finger_ToString(SkyConst src_Sky, Finger finger, string extentionWithDot) { string komaImg = ""; if ((int)finger < Finger_Honshogi.Items_KomaOnly.Length) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Playerside pside = koma.Pside; PieceType ks14 = Haiyaku184Array.Syurui(koma.Haiyaku); komaImg = Util_GraphicalLog.PsideKs14_ToString(pside, ks14, extentionWithDot); } else { komaImg = Util_GraphicalLog.PsideKs14_ToString(Playerside.Empty, PieceType.None, extentionWithDot); } return(komaImg); }
public void Log4( SkyConst src_Sky, Playerside tebanSeme,//手番(利きを調べる側) Maps_OneAndOne <Finger, SySet <SyElement> > kmMove_seme_IKUSA ) { // 戦駒の移動可能場所 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove); kmMove_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""); foreach (Basho masu in value.Elements) { boardLog_clone.Masu_theMove.Add((int)masu.MasuNumber); } }); this.BrdMove = boardLog_clone; }
/// <summary> /// /// </summary> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="back"></param> /// <returns></returns> private static PieceType Kifusasi30_Naru( ShootingStarlightable move, bool back) { //------------------------------------------------------------ // 確定 : 移動先升 //------------------------------------------------------------ PieceType syurui2; { //---------- // 成るかどうか //---------- RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); if (Util_Sky.IsNattaMove(move)) { if (back) { // 正順で成ったのなら、巻戻しでは「非成」に戻します。 syurui2 = KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku)); } else { syurui2 = Haiyaku184Array.Syurui(koma.Haiyaku); } } else { syurui2 = Haiyaku184Array.Syurui(koma.Haiyaku); } } return(syurui2); }
/// <summary> /// 将棋盤上での検索 /// </summary> /// <param name="srcAll">候補マス</param> /// <param name="komas"></param> /// <returns></returns> public static bool Hit_JfugoParser( Playerside pside, PieceType syurui, SySet <SyElement> srcAll, KifuTree kifu, out Finger foundKoma) { SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst; bool hit = false; foundKoma = Fingers.Error_1; foreach (Basho masu1 in srcAll.Elements)//筋・段。(先後、種類は入っていません) { foreach (Finger koma1 in Finger_Honshogi.Items_KomaOnly) { RO_Star_Koma koma2 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma1).Now); if (pside == koma2.Pside && Okiba.ShogiBan == Util_Masu.GetOkiba(koma2.Masu) && KomaSyurui14Array.Matches(syurui, Haiyaku184Array.Syurui(koma2.Haiyaku)) && masu1 == koma2.Masu ) { // 候補マスにいた //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hit = true; foundKoma = koma1; break; } } } return(hit); }
/// <summary> /// 符号1「7g7f」を元に、move を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ExecuteSfenMoves_FromTextSub( bool isHonshogi, string str1, //123456789 か、 PLNSGKRB string str2, //abcdefghi か、 * string str3, //123456789 string str4, //abcdefghi string strNari, //+ out ShootingStarlightable move, KifuTree kifu, string hint, int tesumi_yomiGenTeban//読み進めている現在の手目済 ) { move = Util_Sky.NullObjectMove; SkyConst src_Sky = kifu.NodeAt(tesumi_yomiGenTeban).Value.ToKyokumenConst; Debug.Assert(!Util_MasuNum.OnKomabukuro(Util_Masu.AsMasuNumber(((RO_Star_Koma)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), "[" + tesumi_yomiGenTeban + "]手目、駒が駒袋にあった。"); try { PieceType uttaSyurui; // 打った駒の種類 int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI; int srcDan = Util_Koma.CTRL_NOTHING_PROPERTY_DAN; if ("*" == str2) { //>>>>>>>>>> 「打」でした。 Converter04.SfenUttaSyurui(str1, out uttaSyurui); } else { //>>>>>>>>>> 指しました。 uttaSyurui = PieceType.None;//打った駒はない☆ //------------------------------ // 1 //------------------------------ if (!int.TryParse(str1, out srcSuji)) { } //------------------------------ // 2 //------------------------------ srcDan = Converter04.Alphabet_ToInt(str2); } //------------------------------ // 3 //------------------------------ int suji; if (!int.TryParse(str3, out suji)) { } //------------------------------ // 4 //------------------------------ int dan; dan = Converter04.Alphabet_ToInt(str4); Finger koma; if ("*" == str2) { //>>>>> 「打」でした。 Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.CurNode; // 駒台から、打った種類の駒を取得 koma = Util_Sky.FingerNow_BySyuruiIgnoreCase( siteiNode.Value.ToKyokumenConst, Converter04.Pside_ToKomadai(kifu.CountPside(kifu.CurNode)),//Okiba.Sente_Komadai,//FIXME: uttaSyurui); if (Fingers.Error_1 == koma) { throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。"); } //// FIXME: 打のとき、srcSuji、srcDan が Int.Min } else { //>>>>> 打ではないとき koma = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan) ).ToFirst(); if (Fingers.Error_1 == koma) { // // エラーの理由: // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど // var sky2 = Util_Sky.Json_1Sky(src_Sky, "エラー駒になったとき", $"{hint}_SF解3", tesumi_yomiGenTeban); throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗: 将棋盤から [{srcSuji}]筋、[{srcDan}]段 にある駒を掴もうとしましたが、駒がありませんでした。 isHonshogi=[{isHonshogi}] str1=[{str1}] str2=[{str2}] str3=[{str3}] str4=[{str4}] strNari=[{strNari}] hint=[{hint}] tesumi_yomiGenTeban=[{tesumi_yomiGenTeban}] 局面=sfen {Util_SfenStartposWriter.CreateSfenstring(new StartposExporter(src_Sky), true)} {sky2}"); } } PieceType dstSyurui; PieceType srcSyurui; Okiba srcOkiba; SyElement srcMasu; if ("*" == str2) { //>>>>> 打った駒の場合 dstSyurui = uttaSyurui; srcSyurui = uttaSyurui; switch (kifu.CountPside(kifu.CurNode)) { case Playerside.P2: srcOkiba = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba = Okiba.Sente_Komadai; break; default: srcOkiba = Okiba.Empty; break; } int lastTesumi = kifu.CountTesumi(kifu.CurNode); Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.NodeAt(lastTesumi); Finger srcKoma = Util_Sky.FingerNow_BySyuruiIgnoreCase(siteiNode.Value.ToKyokumenConst, srcOkiba, srcSyurui); RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now); srcMasu = dstKoma.Masu; } else { //>>>>> 盤上の駒を指した場合 RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma).Now); dstSyurui = Haiyaku184Array.Syurui(dstKoma.Haiyaku); srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。 srcOkiba = Okiba.ShogiBan; srcMasu = Util_Masu.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan); } //------------------------------ // 5 //------------------------------ if ("+" == strNari) { // 成りました dstSyurui = KomaSyurui14Array.NariCaseHandle[(int)dstSyurui]; } //------------------------------ // 結果 //------------------------------ // 棋譜 move = new RO_ShootingStarlight( //koma,//TODO: new RO_Star_Koma( kifu.CountPside(kifu.CurNode), srcMasu,//FIXME:升ハンドルにしたい srcSyurui ), new RO_Star_Koma( kifu.CountPside(kifu.CurNode), Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい dstSyurui ), PieceType.None//符号からは、取った駒は分からない ); } catch (Exception ex) { //>>>>> エラーが起こりました。 // どうにもできないので 経路と情報を付け足して 更に外側に投げます。 throw new Exception($"{ex.GetType().Name}:{ex.Message} in TuginoItte_Sfen.GetData_FromTextSub(A) str1=「{str1}」 str2=「{str2}」 str3=「{str3}」 str4=「{str4}」 strNari=「{strNari}」 "); } }
/// <summary> /// 指定された局面で、指定された手番の駒の、利きマスを算出します。 /// 持ち駒は盤上にないので、利きを調べる必要はありません。 /// /// 「手目」は判定できません。 /// /// </summary> /// <param name="kouho"></param> /// <param name="sbGohosyu"></param> /// <param name="logger"></param> public static List_OneAndMulti <Finger, SySet <SyElement> > LAAAA_GetEffect( bool enableLog, bool isHonshogi, SkyConst src_Sky, Playerside pside_genTeban3, bool isAiteban, GraphicalLog_File logF_kiki, string logBrd_caption, int yomuDeep_forLog,//脳内読み手数 int tesumi_yomiCur_forLog, ShootingStarlightable move_forLog ) { GraphicalLog_Board logBrd_kiki = new GraphicalLog_Board(); logBrd_kiki.Caption = logBrd_caption;// "利き_" logBrd_kiki.Tesumi = tesumi_yomiCur_forLog; logBrd_kiki.NounaiYomiDeep = yomuDeep_forLog; //logBrd_kiki.Score = 0.0d; logBrd_kiki.GenTeban = pside_genTeban3;// 現手番 logF_kiki.boards.Add(logBrd_kiki); // 《1》 List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect = new List_OneAndMulti <Finger, SySet <SyElement> >();//盤上の駒の利き { // 《1.1》 Playerside tebanSeme; //手番(利きを調べる側) Playerside tebanKurau; //手番(喰らう側) { if (isAiteban) { tebanSeme = Converter04.AlternatePside(pside_genTeban3); tebanKurau = pside_genTeban3; } else { tebanSeme = pside_genTeban3; tebanKurau = Converter04.AlternatePside(pside_genTeban3); } if (Playerside.P1 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Sente; } else if (Playerside.P2 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Gote; } } // 《1.2》 Fingers fingers_seme_IKUSA; //戦駒(利きを調べる側) Fingers fingers_kurau_IKUSA; //戦駒(喰らう側) Fingers dust1; Fingers dust2; Util_Things.AAABAAAA_SplitGroup( out fingers_seme_IKUSA, out fingers_kurau_IKUSA, out dust1, out dust2, src_Sky, tebanSeme, tebanKurau ); // 攻め手の駒の位置 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(logBrd_kiki); foreach (Finger finger in fingers_seme_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); logBrd_kiki.KomaMasu2.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } logBrd_kiki = boardLog_clone; // 《1.3》 SySet <SyElement> masus_seme_IKUSA = Converter04.Fingers_ToMasus(fingers_seme_IKUSA, src_Sky); // 盤上のマス(利きを調べる側の駒) SySet <SyElement> masus_kurau_IKUSA = Converter04.Fingers_ToMasus(fingers_kurau_IKUSA, src_Sky); // 盤上のマス(喰らう側の駒) // 駒のマスの位置は、特にログに取らない。 // 《1.4》 Maps_OneAndOne <Finger, SySet <SyElement> > kmEffect_seme_IKUSA = Util_Things.Get_KmEffect_seme_IKUSA( fingers_seme_IKUSA,//この中身がおかしい。 masus_seme_IKUSA, masus_kurau_IKUSA, src_Sky, enableLog, Converter04.MoveToStringForLog(move_forLog, pside_genTeban3) );// 利きを調べる側の利き(戦駒) // 戦駒の利き logBrd_kiki = new GraphicalLog_Board(logBrd_kiki); kmEffect_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""); foreach (Basho masu in value.Elements) { boardLog_clone.Masu_theEffect.Add((int)masu.MasuNumber); } }); logBrd_kiki = boardLog_clone; // 《1》 = 《1.4》の戦駒+持駒 sMs_effect.AddRange_New(kmEffect_seme_IKUSA); } return(sMs_effect); }
/// <summary> /// /// </summary> /// <param name="figMovedKoma"></param> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="kifu"></param> /// <param name="isMakimodosi"></param> private static void Kifusasi25( out Finger figMovedKoma, ShootingStarlightable move, KifuTree kifu, bool isMakimodosi , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { figMovedKoma = Fingers.Error_1; SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst; //------------------------------------------------------------ // 選択 : 動かす駒 //------------------------------------------------------------ if (isMakimodosi) { // [巻戻し]のとき //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // 打った駒も、指した駒も、結局は将棋盤の上にあるはず。 RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); // 動かす駒 figMovedKoma = Util_Sky.Finger_AtMasuNow_Shogiban( src_Sky, koma.Pside, koma.Masu//[巻戻し]のときは、先位置が 駒の居場所。 ); } else { // 進むとき //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //------------------------------ // 符号の追加(一手進む) //------------------------------ KifuNode genKyokumenCopyNode = new KifuNodeImpl(move, new KyokumenWrapper(src_Sky), KifuNodeImpl.GetReverseTebanside(((KifuNode)kifu.CurNode).Tebanside)); // TODO: ↓? ((KifuNode)kifu.CurNode).AppendChildA_New(genKyokumenCopyNode); kifu.CurNode = genKyokumenCopyNode; if (Util_Sky.IsDaAction(move)) { //---------- // 駒台から “打” //---------- RO_Star_Koma srcKoma = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); figMovedKoma = Util_Sky.FingerNow_BySyuruiIgnoreCase( src_Sky, Util_Masu.GetOkiba(srcKoma.Masu), Haiyaku184Array.Syurui(dstKoma.Haiyaku) ); } else { //---------- // 将棋盤から //---------- RO_Star_Koma srcKoma = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); figMovedKoma = Util_Sky.Finger_AtMasuNow_Shogiban( src_Sky, dstKoma.Pside, Util_Masu.OkibaSujiDanToMasu( Util_Masu.GetOkiba(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(dstKoma.Masu)]), Util_Masu.AsMasuNumber(srcKoma.Masu) ) ); } } }
public ISfenPosition1 ToRO_Kyokumen1() { ISfenPosition1 ro_Kyokumen1 = new SfenPosition1Impl(); SkyConst src_Sky = this.Value.ToKyokumenConst; for (int suji = 1; suji < 10; suji++) { for (int dan = 1; dan < 10; dan++) { Finger koma0 = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan) ).ToFirst(); if (Fingers.Error_1 != koma0) { RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma0).Now); ro_Kyokumen1.Ban[suji][dan] = KomaSyurui14Array.SfenText( Haiyaku184Array.Syurui(koma1.Haiyaku), koma1.Pside ); } } } int mK = 0; int mR = 0; int mB = 0; int mG = 0; int mS = 0; int mN = 0; int mL = 0; int mP = 0; int mk = 0; int mr = 0; int mb = 0; int mg = 0; int ms = 0; int mn = 0; int ml = 0; int mp = 0; this.GetMoti( src_Sky, out mK, out mR, out mB, out mG, out mS, out mN, out mL, out mP, out mk, out mr, out mb, out mg, out ms, out mn, out ml, out mp ); ro_Kyokumen1.MotiP1[0] = mR; ro_Kyokumen1.MotiP1[1] = mB; ro_Kyokumen1.MotiP1[2] = mG; ro_Kyokumen1.MotiP1[3] = mS; ro_Kyokumen1.MotiP1[4] = mN; ro_Kyokumen1.MotiP1[5] = mL; ro_Kyokumen1.MotiP1[6] = mP; ro_Kyokumen1.MotiP2[0] = mr; ro_Kyokumen1.MotiP2[1] = mb; ro_Kyokumen1.MotiP2[2] = mg; ro_Kyokumen1.MotiP2[3] = ms; ro_Kyokumen1.MotiP2[4] = mn; ro_Kyokumen1.MotiP2[5] = ml; ro_Kyokumen1.MotiP2[6] = mp; return(ro_Kyokumen1); }
public string ToSfenstring(Playerside pside) { SkyConst src_Sky = this.Value.ToKyokumenConst; StringBuilder sb = new StringBuilder(); sb.Append("sfen "); for (int dan = 1; dan <= 9; dan++) { int spaceCount = 0; for (int suji = 9; suji >= 1; suji--) { // 将棋盤上のどこかにある駒? Finger koma0 = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan) ).ToFirst(); if (Fingers.Error_1 != koma0) { if (0 < spaceCount) { sb.Append(spaceCount); spaceCount = 0; } RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma0).Now); sb.Append(KomaSyurui14Array.SfenText( Haiyaku184Array.Syurui(koma1.Haiyaku), koma1.Pside )); } else { spaceCount++; } } if (0 < spaceCount) { sb.Append(spaceCount); spaceCount = 0; } if (dan != 9) { sb.Append("/"); } } sb.Append(" "); //------------------------------------------------------------ // 先後 //------------------------------------------------------------ switch (pside) { case Playerside.P2: sb.Append("w"); break; default: sb.Append("b"); break; } sb.Append(" "); //------------------------------------------------------------ // 持ち駒 //------------------------------------------------------------ { int mK = 0; int mR = 0; int mB = 0; int mG = 0; int mS = 0; int mN = 0; int mL = 0; int mP = 0; int mk = 0; int mr = 0; int mb = 0; int mg = 0; int ms = 0; int mn = 0; int ml = 0; int mp = 0; this.GetMoti( src_Sky, out mK, out mR, out mB, out mG, out mS, out mN, out mL, out mP, out mk, out mr, out mb, out mg, out ms, out mn, out ml, out mp ); if (0 == mK + mR + mB + mG + mS + mN + mL + mP + mk + mr + mb + mg + ms + mn + ml + mp) { sb.Append("-"); } else { if (0 < mK) { if (1 < mK) { sb.Append(mK); } sb.Append("K"); } if (0 < mR) { if (1 < mR) { sb.Append(mR); } sb.Append("R"); } if (0 < mB) { if (1 < mB) { sb.Append(mB); } sb.Append("B"); } if (0 < mG) { if (1 < mG) { sb.Append(mG); } sb.Append("G"); } if (0 < mS) { if (1 < mS) { sb.Append(mS); } sb.Append("S"); } if (0 < mN) { if (1 < mN) { sb.Append(mN); } sb.Append("N"); } if (0 < mL) { if (1 < mL) { sb.Append(mL); } sb.Append("L"); } if (0 < mP) { if (1 < mP) { sb.Append(mP); } sb.Append("P"); } if (0 < mk) { if (1 < mk) { sb.Append(mk); } sb.Append("k"); } if (0 < mr) { if (1 < mr) { sb.Append(mr); } sb.Append("r"); } if (0 < mb) { if (1 < mb) { sb.Append(mb); } sb.Append("b"); } if (0 < mg) { if (1 < mg) { sb.Append(mg); } sb.Append("g"); } if (0 < ms) { if (1 < ms) { sb.Append(ms); } sb.Append("s"); } if (0 < mn) { if (1 < mn) { sb.Append(mn); } sb.Append("n"); } if (0 < ml) { if (1 < ml) { sb.Append(ml); } sb.Append("l"); } if (0 < mp) { if (1 < mp) { sb.Append(mp); } sb.Append("p"); } } } // 手目 sb.Append(" 1"); return(sb.ToString()); }
/// <summary> /// 棋譜データを元に、符号リスト1(*1)を出力します。 /// /// *1…「▲2六歩△8四歩▲7六歩」といった書き方。 /// /// </summary> /// <param name="fugoList"></param> public static string ToJapaneseKifuText( KifuTree kifu ) { StringBuilder sb = new StringBuilder(); sb.Append("position "); sb.Append(kifu.GetProperty(KifuTreeImpl.PropName_Startpos)); sb.Append(" moves "); // 採譜用に、新しい対局を用意します。 KifuTree saifuKifu; { saifuKifu = new KifuTreeImpl( new KifuNodeImpl( Util_Sky.NullObjectMove, new KyokumenWrapper(new SkyConst(Util_Sky.New_Hirate())), //日本の符号読取時 Playerside.P2 ) ); saifuKifu.Clear();// 棋譜を空っぽにします。 saifuKifu.SetProperty(KifuTreeImpl.PropName_FirstPside, Playerside.P1); saifuKifu.SetProperty(KifuTreeImpl.PropName_Startpos, "startpos");//平手の初期局面 // FIXME:平手とは限らないのでは? } kifu.ForeachHonpu(kifu.CurNode, (int tesumi, KyokumenWrapper kWrap, Node <ShootingStarlightable, KyokumenWrapper> node6, ref bool toBreak) => { if (0 == tesumi) { goto gt_EndLoop; } FugoJ fugo; //------------------------------ // 符号の追加(記録係) //------------------------------ KyokumenWrapper saifu_kWrap = saifuKifu.CurNode.Value; KifuNode newNode = new KifuNodeImpl( node6.Key, new KyokumenWrapper(saifu_kWrap.ToKyokumenConst), KifuNodeImpl.GetReverseTebanside(((KifuNode)saifuKifu.CurNode).Tebanside) ); // TODO: ↓? ((KifuNode)saifuKifu.CurNode).AppendChildA_New(newNode); saifuKifu.CurNode = newNode; RO_Star_Koma koma = Util_Koma.AsKoma(((ShootingStarlightable)node6.Key).LongTimeAgo); fugo = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma.Haiyaku)](node6.Key, saifu_kWrap);//「▲2二角成」なら、馬(dst)ではなくて角(src)。 sb.Append(fugo.ToText_UseDou(node6)); gt_EndLoop: ; }); return(sb.ToString()); }
private void GetMoti( SkyConst src_Sky, out int mK, out int mR, out int mB, out int mG, out int mS, out int mN, out int mL, out int mP, out int mk, out int mr, out int mb, out int mg, out int ms, out int mn, out int ml, out int mp ) { mK = 0; mR = 0; mB = 0; mG = 0; mS = 0; mN = 0; mL = 0; mP = 0; mk = 0; mr = 0; mb = 0; mg = 0; ms = 0; mn = 0; ml = 0; mp = 0; // 先手 Fingers komasS = Util_Sky.Fingers_ByOkibaNow(src_Sky, Okiba.Sente_Komadai); foreach (Finger figKoma in komasS.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); PieceType syurui = KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku)); if (PieceType.K == syurui) { mK++; } else if (PieceType.R == syurui) { mR++; } else if (PieceType.B == syurui) { mB++; } else if (PieceType.G == syurui) { mG++; } else if (PieceType.S == syurui) { mS++; } else if (PieceType.N == syurui) { mN++; } else if (PieceType.L == syurui) { mL++; } else if (PieceType.P == syurui) { mP++; } else { } } // 後手 Fingers komasG = Util_Sky.Fingers_ByOkibaNow(src_Sky, Okiba.Gote_Komadai); foreach (Finger figKoma in komasG.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf((int)figKoma).Now); PieceType syurui = KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku)); if (PieceType.K == syurui) { mk++; } else if (PieceType.R == syurui) { mr++; } else if (PieceType.B == syurui) { mb++; } else if (PieceType.G == syurui) { mg++; } else if (PieceType.S == syurui) { ms++; } else if (PieceType.N == syurui) { mn++; } else if (PieceType.L == syurui) { ml++; } else if (PieceType.P == syurui) { mp++; } else { } } }