/// <summary> /// 盤1個分のログ。 /// </summary> public static void Build_LogBoard( Node <IMove, KyokumenWrapper> node_forLog, string nodePath, KifuNode niniNode, //任意のノード //KifuTree kifu_forAssert, KyokumenPngEnvironment reportEnvironment, KaisetuBoards logF_kiki ) { // // HTMLログ // if (logF_kiki.boards.Count < 30)//出力件数制限 { KaisetuBoard logBrd_move1 = new KaisetuBoard(); List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus; Playerside pside = niniNode.Value.KyokumenConst.KaisiPside; Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus( 2, //node_forLog, out komaBETUSusumeruMasus, true, //本将棋 niniNode.Value.KyokumenConst, //現在の局面 pside, false //#if DEBUG , new MmLogGenjoImpl( 0, //読み開始手目済み logBrd_move1, 0, //現在の手済み niniNode.Key ) //#endif ); logBrd_move1.moveOrNull = niniNode.Key; logBrd_move1.YomikaisiTemezumi = niniNode.Value.KyokumenConst.Temezumi;//読み開始手目済み // int.MinValue; logBrd_move1.Temezumi = int.MinValue; logBrd_move1.Score = (int)niniNode.Score; logF_kiki.boards.Add(logBrd_move1); } }
/// <summary> /// 指し手をぶら下げます。 /// /// ぶらさがるのは、現手番から見た「被王手の次の一手の局面」だけです。 /// ぶらさがりがなければ、「投了」を選んでください。 /// </summary> /// <param name="enableLog"></param> /// <param name="isHonshogi"></param> /// <param name="yomuDeep"></param> /// <param name="pside_yomiCur"></param> /// <param name="node_yomiCur"></param> /// <param name="logF_moveKiki"></param> /// <returns>複数のノードを持つハブ・ノード</returns> private static Dictionary <string, SasuEntry> WAAAA_Create_ChildNodes( Tansaku_Genjo genjo, IMove src_Sky_move, SkyConst src_Sky ) { //---------------------------------------- // ハブ・ノードとは //---------------------------------------- // // このハブ・ノード自身は空っぽで、ハブ・ノードの次ノードが、次局面のリストになっています。 // Dictionary <string, SasuEntry> moveBetuEntry; //---------------------------------------- // ①現手番の駒の移動可能場所_被王手含む //---------------------------------------- //---------------------------------------- // 盤1個分のログの準備 //---------------------------------------- #if DEBUG MmLogGenjoImpl mm_log_orNull = null; KaisetuBoard logBrd_move1; Tansaku_FukasaYusen_Routine.Log1(genjo, src_Sky_move, src_Sky, out mm_log_orNull, out logBrd_move1); #endif //---------------------------------------- // 進めるマス //---------------------------------------- List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus; Util_KyokumenMoves.LA_Split_KomaBETUSusumeruMasus( 1, out komaBETUSusumeruMasus, genjo.Args.IsHonshogi, //本将棋か src_Sky, //現在の局面 // FIXME:Lockすると、ここでヌルになる☆ src_Sky.KaisiPside, //手番 false //相手番か #if DEBUG , mm_log_orNull #endif ); //#if DEBUG // Logger.Trace("komaBETUSusumeruMasusの全要素=" + Util_List_OneAndMultiEx<Finger, SySet<SyElement>>.CountAllElements(komaBETUSusumeruMasus)); //#endif //#if DEBUG // string jsaMoveStr = Util_Translator_Move.ToMove(genjo.Node_yomiNext, genjo.Node_yomiNext.Value); // Logger.Trace($"[{jsaMoveStr}]の駒別置ける升 調べ\n{Util_List_OneAndMultiEx<Finger, SySet<SyElement>>.Dump(komaBETUSusumeruMasus, genjo.Node_yomiNext.Value.ToKyokumenConst)}"); //#endif //Moveseisei_FukasaYusen_Routine.Log2(genjo, logBrd_move1);//ログ試し //---------------------------------------- // ②利きから、被王手の局面を除いたハブノード //---------------------------------------- if (genjo.Args.IsHonshogi) { //---------------------------------------- // 本将棋 //---------------------------------------- //---------------------------------------- // 指定局面での全ての指し手。 //---------------------------------------- Maps_OneAndMulti <Finger, IMove> komaBetuAllMoves = Conv_KomabetuSusumeruMasus.ToKomaBetuAllMoves( komaBETUSusumeruMasus, src_Sky); //#if DEBUG // Logger.Trace("komaBETUAllMovesの全要素=" + Util_Maps_OneAndMultiEx<Finger, SySet<SyElement>>.CountAllElements(komaBETUAllMoves)); //#endif //---------------------------------------- // 本将棋の場合、王手されている局面は削除します。 //---------------------------------------- Maps_OneAndOne <Finger, SySet <SyElement> > starbetuSusumuMasus = Util_LegalMove.LA_RemoveMate( genjo.YomikaisiTemezumi, genjo.Args.IsHonshogi, komaBetuAllMoves,//駒別の全ての指し手 src_Sky, #if DEBUG genjo.Args.LogF_moveKiki, //利き用 #endif "読みNextルーチン"); //---------------------------------------- // 『駒別升ズ』を、ハブ・ノードへ変換。 //---------------------------------------- //成り以外の手 moveBetuEntry = Conv_KomabetuMasus.ToMoveBetuSky1( starbetuSusumuMasus, src_Sky ); //---------------------------------------- // 成りの指し手を作成します。(拡張) //---------------------------------------- //成りの手 Dictionary <string, SasuEntry> b_moveBetuEntry = Util_SasuEx.CreateNariMove(src_Sky, moveBetuEntry); // マージ foreach (KeyValuePair <string, SasuEntry> entry in b_moveBetuEntry) { if (!moveBetuEntry.ContainsKey(entry.Key)) { moveBetuEntry.Add(entry.Key, entry.Value); } } } else { //---------------------------------------- // 本将棋じゃないもの //---------------------------------------- //---------------------------------------- // 駒別置ける升 → 指し手別局面 //---------------------------------------- // // 1対1変換 // moveBetuEntry = Conv_KomabetuMasus.KomabetuMasusToMoveBetuSky( komaBETUSusumeruMasus, src_Sky ); //#if DEBUG // Logger.Trace($"駒別置ける升={komaBETUSusumeruMasus.Items.Count}件。 指し手別局面={ss.Count}件。"); // Debug.Assert(komaBETUSusumeruMasus.Items.Count == ss.Count, "変換後のデータ件数が異なります。[{komaBETUSusumeruMasus.Items.Count}]→[{ss.Count}]"); //#endif } return(moveBetuEntry);// result_hubNode; }