public static Dictionary <ShootingStarlightable, KyokumenWrapper> KomabetuMasusToMovebetuSky( List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky, Playerside pside) { Dictionary <ShootingStarlightable, KyokumenWrapper> result = new Dictionary <ShootingStarlightable, KyokumenWrapper>(); sMs.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); foreach (SyElement dstMasu in value.Elements) { ShootingStarlightable move = Util_Sky.New( //key, new RO_Star_Koma(pside, koma.Masu, koma.Haiyaku), new RO_Star_Koma(pside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。 PieceType.None ); result.Add(move, new KyokumenWrapper(Util_Sasu.Sasu(src_Sky, key, dstMasu, pside))); } }); return(result); }
/// <summary> /// 次の局面の一覧をもった、入れ物ノードを返します。 /// </summary> /// <param name="kifu"></param> /// <param name="pside_genTeban"></param> /// <returns></returns> public static KifuNode ToNextNodes_AsHubNode( Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMove, Node <ShootingStarlightable, KyokumenWrapper> siteiNode, Playerside pside_genTeban) { KifuNode hubNode = new KifuNodeImpl(null, null, Playerside.Empty);//蝶番 #if DEBUG string dump = komabetuAllMove.Dump(); #endif foreach (KeyValuePair <Finger, List <ShootingStarlightable> > entry1 in komabetuAllMove.Items) { Finger figKoma = entry1.Key;// 駒 // 駒の動ける升全て foreach (ShootingStarlightable move in entry1.Value) { RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); SyElement masu = koma.Masu; SkyConst nextSky = Util_Sasu.Sasu(siteiNode.Value.ToKyokumenConst, figKoma, masu, pside_genTeban); Node <ShootingStarlightable, KyokumenWrapper> nextNode = new KifuNodeImpl(move, new KyokumenWrapper(nextSky), KifuNodeImpl.GetReverseTebanside(pside_genTeban));//次のノード string sfenText = Util_Sky.ToSfenMoveText(move); if (hubNode.ContainsKey_NextNodes(sfenText)) { // 既存の指し手なら無視 System.Console.WriteLine("既存の指し手なので無視します。sfenText=[" + sfenText + "]"); } else { hubNode.Add_NextNode(Util_Sky.ToSfenMoveText(move), nextNode); } } } return(hubNode); }
/// <summary> /// これが通称【水際のいんちきプログラム】なんだぜ☆ /// 必要により、【成り】の指し手を追加します。 /// </summary> public static void AddNariMove( KifuNode node_yomiCur, KifuNode hubNode ) { Dictionary <string, ShootingStarlightable> newMoveList = new Dictionary <string, ShootingStarlightable>(); hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { RO_Star_Koma srcKoma = Util_Koma.AsKoma(nextNode.Key.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(nextNode.Key.Now); bool isPromotionable; if (!Converter04.IsPromotionable(out isPromotionable, srcKoma, dstKoma)) { // エラー goto gt_Next1; } if (isPromotionable) { ShootingStarlightable move = new RO_ShootingStarlight( //figKoma,//駒 srcKoma,// 移動元 new RO_Star_Koma( dstKoma.Pside, dstKoma.Masu, KomaSyurui14Array.ToNariCase(dstKoma.Syurui) //強制的に【成り】に駒の種類を変更 ), // 移動先 PieceType.None //取った駒不明 ); // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。 string moveStr = Util_Sky.ToSfenMoveText(move);//重複防止用のキー if (!newMoveList.ContainsKey(moveStr)) { newMoveList.Add(moveStr, move); } } gt_Next1: ; }); // 新しく作った【成り】の指し手を追加します。 foreach (ShootingStarlightable newMove in newMoveList.Values) { // 指す前の駒 RO_Star_Koma sasumaenoKoma = Util_Koma.AsKoma(newMove.LongTimeAgo); // 指した駒 RO_Star_Koma sasitaKoma = Util_Koma.AsKoma(newMove.Now); // 現局面 SkyConst src_Sky = node_yomiCur.Value.ToKyokumenConst; // 指す前の駒を、盤上のマス目で指定 Finger figSasumaenoKoma = Util_Sky.Fingers_AtMasuNow(src_Sky, sasumaenoKoma.Masu).ToFirst(); // 新たな局面 KyokumenWrapper kyokumenWrapper = new KyokumenWrapper(Util_Sasu.Sasu(src_Sky, figSasumaenoKoma, sasitaKoma.Masu, KifuNodeImpl.GetReverseTebanside(node_yomiCur.Tebanside))); try { string moveStr = Util_Sky.ToSfenMoveText(newMove); if (!hubNode.ContainsKey_NextNodes(moveStr)) { // 指し手が既存でない局面だけを追加します。 hubNode.Add_NextNode( moveStr, new KifuNodeImpl( newMove, kyokumenWrapper,//node_yomiCur.Value,//FIXME: 成りの手を指した局面を作りたい。 KifuNodeImpl.GetReverseTebanside(node_yomiCur.Tebanside) ) ); } } catch (Exception ex) { // 既存の指し手 StringBuilder sb = new StringBuilder(); { hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { sb.Append("「"); sb.Append(Util_Sky.ToSfenMoveText(nextNode.Key)); sb.Append("」"); }); } //>>>>> エラーが起こりました。 // どうにもできないので ログだけ取って、上に投げます。 Logger.Error(ex.GetType().Name + " " + ex.Message + ":新しく作った「成りの指し手」を既存ノードに追加していた時です。:追加したい指し手=「" + Util_Sky.ToSfenMoveText(newMove) + "」既存の手=" + sb.ToString()); throw; } } // gt_EndMethod: // ; }