/// <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="isMakimodosi"></param> /// <param name="ittemodosuReference"></param> /// <param name="logTag"></param> public static void Before2( ref IttemodosuResult ittemodosuReference ) { Node <IMove, KyokumenWrapper> editNodeRef = ittemodosuReference.SyuryoNode_OrNull; IMove nextMove = editNodeRef.Key; if (ittemodosuReference.FoodKomaSyurui != PieceType.None) { // 元のキーの、取った駒の種類だけを差替えます。 nextMove = Util_Sky258A.BuildMove(editNodeRef.Key.LongTimeAgo, editNodeRef.Key.Now, ittemodosuReference.FoodKomaSyurui); // 現手番 Playerside genTebanside = ((KifuNode)editNodeRef).Value.KyokumenConst.KaisiPside; // キーを差替えたノード editNodeRef = new KifuNodeImpl(nextMove, new KyokumenWrapper(ittemodosuReference.Susunda_Sky_orNull));//, genTebanside } string nextMoveStr = ConvMoveStrSfen.ToMoveStrSfen(nextMove); ittemodosuReference.SyuryoNode_OrNull = editNodeRef;// この変数を返すのがポイント。棋譜とは別に、現局面。 //Util_IttesasuRoutine.iIttemodosuAfter3_ChangeCurrent(kifu_mutable); }
/// <summary> /// 移動前と、移動後の場所が異なっていれば真。 /// </summary> /// <returns></returns> public static bool DoneMove(RO_Starbeam ss) { bool result; RO_Star koma1 = Util_Starlightable.AsKoma(ss.Now); RO_Star koma2 = Util_Starlightable.AsKoma(Util_Sky258A.Src(ss).Now); result = Conv_SyElement.ToMasuNumber(koma1.Masu) != Conv_SyElement.ToMasuNumber(koma2.Masu); return(result); }
//Dictionary<Starbeamable, KyokumenWrapper> public static Dictionary <string, SasuEntry> KomabetuMasusToMoveBetuSky( List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky) { Dictionary <string, SasuEntry> moveBetuEntry = new Dictionary <string, SasuEntry>(); sMs.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now); foreach (SyElement dstMasu in value.Elements) { IMove move = Util_Sky258A.BuildMove( new RO_Star(src_Sky.KaisiPside, koma.Masu, koma.Haiyaku), new RO_Star(src_Sky.KaisiPside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。 PieceType.None ); string moveStr = ConvMoveStrSfen.ToMoveStrSfen(move);//重複防止用のキー SasuEntry sasuEntry = new SasuEntry( move, key, //動かす駒 dstMasu, //移動先升 false //成りません。 ); if (!moveBetuEntry.ContainsKey(moveStr)) { moveBetuEntry.Add(moveStr, sasuEntry); } } }); return(moveBetuEntry); /* * Dictionary<Starbeamable, KyokumenWrapper> result = new Dictionary<Starbeamable, KyokumenWrapper>(); * foreach (KeyValuePair<string, SasuEntry> entry in movebetuEntry) * { * result.Add( * entry.Value.NewMove, * new KyokumenWrapper(Util_Sasu341.Sasu( * src_Sky,//指定局面 * entry.Value.Finger,//動かす駒 * entry.Value.Masu,//移動先升 * entry.Value.Naru,//成りません。 * logTag * ))); * } * * return result; */ }
public static Dictionary <string, SasuEntry> ToMoveBetuSky1( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus, SkyConst src_Sky ) { Dictionary <string, SasuEntry> result_komabetuEntry = new Dictionary <string, SasuEntry>(); komabetuSusumuMasus.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(key).Now); foreach (SyElement dstMasu in value.Elements) { IMove move = Util_Sky258A.BuildMove( //key, new RO_Star(src_Sky.KaisiPside, koma.Masu, koma.Haiyaku), new RO_Star(src_Sky.KaisiPside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。 PieceType.None ); string moveStr = ConvMoveStrSfen.ToMoveStrSfen(move);//重複防止用のキー if (!result_komabetuEntry.ContainsKey(moveStr)) { result_komabetuEntry.Add( moveStr, new SasuEntry( move, key, //動かす駒 dstMasu, //移動先升 false //成りません ) ); } } }); return(result_komabetuEntry); }
/// <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); }