public static int CountAllElements(Maps_OneAndMulti <Finger, IMove> collection) { int count = 0; foreach (KeyValuePair <Finger, List <IMove> > entry in collection.Items) { foreach (IMove starbeam in entry.Value) { count++; } } return(count); }
/// <summary> /// 無ければ追加、あれば上書き。 /// </summary> /// <param name="hKoma"></param> /// <param name="masus"></param> public static void AddOverwrite( Maps_OneAndMulti <Finger, SyElement> komabetuMasu, Finger finger, SyElement masu) { if (komabetuMasu.Items.ContainsKey(finger)) { komabetuMasu.Items[finger].Add(masu);//追加します。 } else { // 無かったので、新しく追加します。 List <SyElement> list = new List <SyElement>(); list.Add(masu); komabetuMasu.Items.Add(finger, list); } }
/// <summary> /// FIXME: 使ってない? /// /// 変換「自駒が動ける升」→「自駒が動ける手」 /// </summary> /// <param name="kmDic_Self"></param> /// <returns></returns> public static Maps_OneAndMulti <Finger, IMove> ToKomabetuMove( Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self, Node <IMove, KyokumenWrapper> siteiNode_genzai ) { Maps_OneAndMulti <Finger, IMove> komaTe = new Maps_OneAndMulti <Finger, IMove>(); // // kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { foreach (SyElement masuHandle in value.Elements) { RO_Star koma = Util_Starlightable.AsKoma(siteiNode_genzai.Value.KyokumenConst.StarlightIndexOf(key).Now); IMove move = new RO_Starbeam( //key, // 元 koma, // 先 new RO_Star( koma.Pside, Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(masuHandle)], koma.Haiyaku //TODO:成るとか考えたい ), PieceType.None //取った駒不明 ); //sbSfen.Append(sbSfen.ToString()); if (komaTe.ContainsKey(key)) { // すでに登録されている駒 komaTe.AddExists(key, move); } else { // まだ登録されていない駒 komaTe.AddNew(key, move); } } }); return(komaTe); }
/// <summary> /// 指し手一覧を、駒毎に分けます。 /// TODO: これ、SkyConstに移動できないか☆? /// </summary> /// <param name="hubNode">指し手一覧</param> /// <returns>駒毎の、全指し手</returns> public static Maps_OneAndMulti <Finger, IMove> SplitMoveByStar( SkyConst src_Sky, Node <IMove, KyokumenWrapper> hubNode) { Maps_OneAndMulti <Finger, IMove> enable_teMap = new Maps_OneAndMulti <Finger, IMove>(); hubNode.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> nextNode, ref bool toBreak) => { IMove nextMove = nextNode.Key; Finger figKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky, Util_Starlightable.AsKoma(nextMove.LongTimeAgo).Masu).ToFirst(); enable_teMap.Put_NewOrOverwrite(figKoma, nextMove); }); return(enable_teMap); }
/// <summary> /// 変換「各(自駒が動ける升)」→「各(自駒が動ける手)」 /// </summary> /// <param name="komaBETUSusumeruMasus">駒別の進める升</param> /// <param name="siteiNode">指定ノード</param> /// <returns></returns> public static Maps_OneAndMulti <Finger, IMove> ToKomaBetuAllMoves( List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus, SkyConst src_Sky//Node<Starbeamable, KyokumenWrapper> siteiNode ) { Maps_OneAndMulti <Finger, IMove> result_komabetuAllMove = new Maps_OneAndMulti <Finger, IMove>(); komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma, SySet <SyElement> susumuMasuSet, ref bool toBreak) => { // 動かす星。 RO_Star srcStar = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); foreach (SyElement susumuMasu in susumuMasuSet.Elements)// 星が進める升。 { // 移動先の星(升の変更) RO_Star dstStar = new RO_Star( srcStar.Pside, susumuMasu, //Masu_Honshogi.Items_All[Util_Masu10.AsMasuNumber(susumuMasu)], srcStar.Komasyurui // srcStar.Haiyaku//TODO:ここで、駒の種類が「成り」に上書きされているバージョンも考えたい ); IMove move = new RO_Starbeam( srcStar, // 移動元 dstStar, // 移動先 PieceType.None //取った駒不明 ); result_komabetuAllMove.Put_NewOrOverwrite(figKoma, move); //FIXME: 1つの駒に指し手は1つ?? // これが通称【水際のいんちきプログラム】なんだぜ☆ // 必要により、【成り】の指し手を追加します。 Util_Sasu269.Add_KomaBETUAllNariMoves( result_komabetuAllMove, figKoma, //動かす駒 srcStar, //動かす星 dstStar //移動先の星 ); } }); return(result_komabetuAllMove); }
/// <summary> /// 変換:星別指し手一覧 → 次の局面の一覧をもった、入れ物ノード。 /// </summary> /// <param name="kifu"></param> /// <param name="pside_genTeban"></param> /// <returns>次の局面一覧を持った、入れ物ノード(ハブ・ノード)</returns> public static KifuNode ToNextNodes_AsHubNode( Maps_OneAndMulti <Finger, IMove> komabetuAllMove, SkyConst src_Sky//Node<Starbeamable, KyokumenWrapper> to_parentNode,//親となる予定のノード ) { KifuNode hubNode = new KifuNodeImpl(null, null);//蝶番 #if DEBUG string dump = komabetuAllMove.Dump(); #endif foreach (KeyValuePair <Finger, List <IMove> > entry1 in komabetuAllMove.Items) { Finger figKoma = entry1.Key; // 動かす駒 foreach (IMove move in entry1.Value) // 駒の動ける升 { string sfenText = ConvMoveStrSfen.ToMoveStrSfen(move); if (hubNode.ContainsKey_ChildNodes(sfenText)) { // 既存の指し手なら無視 Logger.Trace($"既存の指し手なので無視します1。sfenText=[{sfenText}]"); } else { // 指したあとの次の局面を作るだけ☆ hubNode.PutAdd_ChildNode(ConvMoveStrSfen.ToMoveStrSfen(move), new KifuNodeImpl(move, new KyokumenWrapper( Util_Sasu341.Sasu( src_Sky, // to_parentNode.Value.ToKyokumenConst,//指定局面 figKoma, //動かす駒 Util_Starlightable.AsKoma(move.Now).Masu, //移動先升 false //成りません。 )))); } } } return(hubNode); }
public static void AssertNariMove(Maps_OneAndMulti <Finger, IMove> komabetuAllMove, string hint) { /* * foreach(KeyValuePair<Finger, List<ShootingStarlightable>> komaAllMove in komabetuAllMove.Items) * { * foreach(ShootingStarlightable move in komaAllMove.Value) * { * Starlightable lightable = move.Now; * RO_Star_Koma koma = Util_Starlightable.AsKoma(lightable); * * if (KomaSyurui14Array.IsNari(koma.Syurui)) * { * MessageBox.Show($"指し手に成りが含まれています。[{koma.Masu.Word}][{koma.Syurui}]", $"デバッグ:{hint}"); * //Logger.Trace("指し手に成りが含まれています。"); * goto gt_EndMethod; * } * } * } * gt_EndMethod: * ; */ }
/// <summary> /// これが通称【水際のいんちきプログラム】なんだぜ☆ /// 必要により、【成り】の指し手を追加します。 /// </summary> public static void Add_KomaBETUAllNariMoves( Maps_OneAndMulti <Finger, IMove> komaBETUAllMoves, Finger figKoma, RO_Star srcKoma, RO_Star dstKoma ) { bool isPromotionable; if (!Util_Sasu269.IsPromotionable(out isPromotionable, srcKoma, dstKoma)) { goto gt_EndMethod; } // 成りの資格があれば、成りの指し手を作ります。 if (isPromotionable) { //MessageBox.Show($"成りの資格がある駒がありました。 src=[{srcKoma.Masu.Word}][{srcKoma.Syurui}]"); IMove move = new RO_Starbeam( //figKoma,//駒 srcKoma,// 移動元 new RO_Star( dstKoma.Pside, dstKoma.Masu, Util_Komasyurui14.ToNariCase(dstKoma.Komasyurui) //強制的に【成り】に駒の種類を変更 ), // 移動先 PieceType.None //取った駒不明 ); // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。 komaBETUAllMoves.AddNotOverwrite(figKoma, move); } gt_EndMethod: ; }
public Maps_OneAndMulti <T1, T2> ToClone() { Maps_OneAndMulti <T1, T2> map2 = new Maps_OneAndMulti <T1, T2>(); foreach (KeyValuePair <T1, List <T2> > entry1 in this.Items) { T1 key1 = entry1.Key; List <T2> values1 = entry1.Value; foreach (T2 value1 in values1) { if (map2.ContainsKey(key1)) { map2.AddExists(key1, value1); } else { map2.AddNew(key1, value1); } } } return(map2); }
/// <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); }