/// <summary> /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような) /// </summary> /// <param name="srcSky"></param> /// <param name="fingers"></param> /// <returns></returns> public static Maps_OneAndOne <Finger, SySet <SyElement> > GetPotentialMoves( SkyConst srcSky, Fingers fingers ) { if (fingers is null) { throw new ArgumentNullException(nameof(fingers)); } Maps_OneAndOne <Finger, SySet <SyElement> > kiki_fMs = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧 foreach (Finger finger in fingers.Items) { // ポテンシャル・ムーブを調べます。 SySet <SyElement> move = Util_Sky_SyugoQuery.KomaKidou_Potential(finger, srcSky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。 if (!move.IsEmptySet()) { // 移動可能升があるなら Util_Sky258A.AddOverwrite(kiki_fMs, finger, move); } } return(kiki_fMs); }
/// <summary> /// マージします。 /// </summary> /// <param name="right"></param> public static void Merge( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus, Maps_OneAndOne <Finger, SySet <SyElement> > right ) { right.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { Util_Sky258A.AddOverwrite(komabetuMasus, key, value); //if (komabetuMasus.entries.ContainsKey(entry.Key)) //{ // // キーが重複していれば、value同士でマージします。 // komabetuMasus.entries[entry.Key].AddSupersets(entry.Value); //} //else //{ // // 新キーなら // komabetuMasus.entries.Add(entry.Key, entry.Value); //} }); }
/// <summary> /// 指定された手の中から、王手局面を除外します。 /// /// 王手回避漏れを防ぎたいんだぜ☆ /// </summary> /// <param name="km_available">自軍の各駒の移動できる升セット</param> /// <param name="sbGohosyu"></param> public static Maps_OneAndOne <Finger, SySet <SyElement> > LA_RemoveMate( int yomikaisiTemezumi, bool isHonshogi, Maps_OneAndMulti <Finger, IMove> genTeban_komabetuAllMove1, // 指定局面で、どの駒が、どんな手を指すことができるか SkyConst src_Sky, //指定局面。 #if DEBUG KaisetuBoards logF_kiki, #endif string hint) { Node <IMove, KyokumenWrapper> hubNode = ConvStarbetuMoves.ToNextNodes_AsHubNode( genTeban_komabetuAllMove1, src_Sky ); // ハブ・ノード自身はダミーノードなんだが、子ノードに、次のノードが入っている。 Util_NodeAssert361.AssertNariMove(hubNode, "#LA_RemoveMate(1)"); //ここはok #if DEBUG Util_LegalMove.Log1(hubNode, src_Sky.Temezumi, hint); #endif if (isHonshogi) { // 王手が掛かっている局面を除きます。 Util_LegalMove.LAA_RemoveNextNode_IfMate( yomikaisiTemezumi, hubNode, src_Sky.Temezumi, src_Sky.KaisiPside #if DEBUG , logF_kiki #endif ); } Util_NodeAssert361.AssertNariMove(hubNode, "#LA_RemoveMate(2)王手局面削除直後");//ここはok // 「指し手一覧」を、「星別の全指し手」に分けます。 Maps_OneAndMulti <Finger, IMove> starbetuAllMoves2 = Util_Sky258A.SplitMoveByStar(src_Sky, hubNode); Util_Sasu269.AssertNariMove(starbetuAllMoves2, "#LA_RemoveMate(3)更に変換後");//ここはok // // 「星別の指し手一覧」を、「星別の進むマス一覧」になるよう、データ構造を変換します。 // Maps_OneAndOne <Finger, SySet <SyElement> > starbetuSusumuMasus = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの星を、どこに進める」の一覧 foreach (KeyValuePair <Finger, List <IMove> > entry in starbetuAllMoves2.Items) { Finger finger = entry.Key; List <IMove> teList = entry.Value; // ポテンシャル・ムーブを調べます。 SySet <SyElement> masus_PotentialMove = new SySet_Default <SyElement>("ポテンシャルムーブ"); foreach (IMove te in teList) { RO_Star koma = Util_Starlightable.AsKoma(te.Now); masus_PotentialMove.AddElement(koma.Masu); } if (!masus_PotentialMove.IsEmptySet()) { // 空でないなら Util_Sky258A.AddOverwrite(starbetuSusumuMasus, finger, masus_PotentialMove); } } return(starbetuSusumuMasus); }