/// <summary> /// 動かす駒を移動先へ。 /// </summary> /// <param name="figMovedKoma"></param> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="obsoluted_kifu_mutable"></param> /// <param name="isMakimodosi"></param> private static void Do24_UgokasuKoma_IdoSakiHe( out Finger figMovedKoma, IMove move, Playerside kaisi_tebanside, SkyConst kaisi_Sky, string hint , [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { figMovedKoma = Fingers.Error_1; //------------------------------------------------------------ // 選択 : 動かす駒 //------------------------------------------------------------ // 進むとき //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //Debug.Assert(null != move, "Sasu24_UgokasuKoma_IdoSakiHe: 指し手がヌルでした。"); if (Util_Sky_BoolQuery.IsDaAction(move))// 多分、ここで move がヌルになるエラーがある☆ { //---------- // 駒台から “打” //---------- RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); // FIXME: 駒台の、どの駒を拾うか? figMovedKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase( kaisi_Sky, Conv_SyElement.ToOkiba(srcKoma.Masu), Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku) ); Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?14"); } else { //---------- // 将棋盤から //---------- RO_Star srcKoma = Util_Starlightable.AsKoma(move.LongTimeAgo); Debug.Assert(!Masu_Honshogi.IsErrorBasho(srcKoma.Masu), "srcKoma.Masuエラー。15"); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); figMovedKoma = Util_Sky_FingerQuery.InShogibanMasuNow( kaisi_Sky, dstKoma.Pside, Util_Masu10.OkibaSujiDanToMasu( Conv_SyElement.ToOkiba(Masu_Honshogi.Masus_All[Conv_SyElement.ToMasuNumber(dstKoma.Masu)]), Conv_SyElement.ToMasuNumber(srcKoma.Masu) ) ); Debug.Assert(figMovedKoma != Fingers.Error_1, "駒を動かせなかった?13"); } }
/// <summary> /// 指したあとの、次の局面を作るだけ☆ /// </summary> /// <param name="src_Sky"></param> /// <param name="finger"></param> /// <param name="masu"></param> /// <param name="pside_genTeban"></param> /// <param name="logTag"></param> /// <returns></returns> public static SkyConst Sasu( SkyConst src_Sky, //指定局面 Finger finger, //動かす駒 SyElement masu, //移動先マス bool toNaru //成るなら真 ) { SkyBuffer sky_buf = new SkyBuffer(src_Sky); // 現局面を元に、新規局面を書き換えます。 sky_buf.SetKaisiPside(Conv_Playerside.Reverse(src_Sky.KaisiPside)); // 開始先後を逆転させます。 sky_buf.SetTemezumi(sky_buf.Temezumi + 1); // 1手進めます。 SkyConst src_Sky2 = SkyConst.NewInstance(sky_buf, -1 //sky_bufでもう変えてあるので、そのまま。 ); // 移動先に相手の駒がないか、確認します。 Finger tottaKoma = Util_Sky_FingersQuery.InMasuNow(src_Sky2, masu).ToFirst(); if (tottaKoma != Fingers.Error_1) { // なにか駒を取ったら SyElement akiMasu; if (src_Sky.KaisiPside == Playerside.P1) { akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, src_Sky2); } else { akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, src_Sky2); } RO_Star koma = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(tottaKoma).Now); // FIXME:配役あってるか? sky_buf.PutOverwriteOrAdd_Starlight(tottaKoma, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, akiMasu, koma.Komasyurui)));//tottaKoma, } // 駒を1個動かします。 // FIXME: 取った駒はどうなっている? { RO_Star koma = Util_Starlightable.AsKoma(sky_buf.StarlightIndexOf(finger).Now); PieceType komaSyurui = koma.Komasyurui; if (toNaru) { komaSyurui = Util_Komasyurui14.ToNariCase(komaSyurui); } sky_buf.PutOverwriteOrAdd_Starlight(finger, new RO_Starlight(new RO_Star(src_Sky.KaisiPside, masu, komaSyurui))); } return(SkyConst.NewInstance(sky_buf, -1//sky_bufでもう進めてあるので、そのまま。 )); }
/// <summary> /// 局面に合わせて、駒ボタンのx,y位置を変更します /// </summary> /// <param name="btnKoma">駒</param> public static void Redraw_KomaLocation( Finger figKoma, NarabeRoomViewModel shogiGui ) { RO_Star_Koma koma = Util_Koma.AsKoma(shogiGui.GameViewModel.GuiSkyConst.StarlightIndexOf(figKoma).Now); Shape_BtnKoma btnKoma = Util_InGui.FingerToKomaBtn(figKoma, shogiGui); int suji; int dan; Util_MasuNum.MasuToSuji(koma.Masu, out suji); Util_MasuNum.MasuToDan(koma.Masu, out dan); switch (Util_Masu.GetOkiba(koma.Masu)) { case Okiba.ShogiBan: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.Shogiban.SujiToX(suji), shogiGui.Shape_PnlTaikyoku.Shogiban.DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.Sente_Komadai: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.KomadaiArr[0].SujiToX(suji), shogiGui.Shape_PnlTaikyoku.KomadaiArr[0].DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.Gote_Komadai: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.KomadaiArr[1].SujiToX(suji), shogiGui.Shape_PnlTaikyoku.KomadaiArr[1].DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.KomaBukuro: btnKoma.SetBounds(new Rectangle( shogiGui.Shape_PnlTaikyoku.KomadaiArr[2].SujiToX(suji), shogiGui.Shape_PnlTaikyoku.KomadaiArr[2].DanToY(dan), btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; } }
public Finger ToFirst() { Finger finger = Fingers.Error_1; if (0 < this.Count) { finger = this[0]; } return(finger); }
/// <summary> /// ************************************************************************************************************************ /// 駒のハンドル(*1)を元に、ボタンを返します。 /// ************************************************************************************************************************ /// /// *1…将棋の駒1つ1つに付けられた番号です。 /// /// </summary> /// <param name="hKoma"></param> /// <param name="shape_PnlTaikyoku"></param> /// <returns>なければヌル</returns> public static Shape_BtnKoma FingerToKomaBtn(Finger koma, MainGui_Csharp shogiGui) { Shape_BtnKoma found = null; int hKoma = (int)koma; if (0 <= hKoma && hKoma < shogiGui.Shape_PnlTaikyoku.Btn40Komas.Length) { found = shogiGui.Shape_PnlTaikyoku.Btn40Komas[hKoma]; } return(found); }
/// <summary> /// 駒のハンドル(*1)を元に、ボタンを返します。 /// /// *1…将棋の駒1つ1つに付けられた番号です。 /// /// </summary> /// <param name="hKoma"></param> /// <param name="shape_PnlTaikyoku"></param> /// <returns>なければヌル</returns> public static Shape_BtnKoma FingerToKomaBtn(Finger koma, NarabeRoomViewModel shogiGui) { Shape_BtnKoma found = null; int hKoma = (int)koma; if (0 <= hKoma && hKoma < shogiGui.Shape_PnlTaikyoku.BtnKomaDoors.Length) { found = shogiGui.Shape_PnlTaikyoku.BtnKomaDoors[hKoma]; } return(found); }
public IttemodosuResultImpl( Finger figMovedKoma, Finger figFoodKoma, Node <IMove, KyokumenWrapper> out_newNode_OrNull, PieceType foodKomaSyurui, SkyConst susunda_Sky_orNull ) { this.FigMovedKoma = figMovedKoma; this.FigFoodKoma = figFoodKoma; this.SyuryoNode_OrNull = out_newNode_OrNull; this.FoodKomaSyurui = foodKomaSyurui; this.Susunda_Sky_orNull = susunda_Sky_orNull; }
public SasuEntry( IMove newMove, //string moveStr, Finger finger, SyElement masu, bool naru ) { this.NewMove = newMove; //this.MoveStr = moveStr; this.Finger = finger; this.Masu = masu; this.Naru = naru; }
/// <summary> /// 無ければ追加、あれば上書き。 /// </summary> /// <param name="hKoma"></param> /// <param name="masus"></param> public static void AddOverwrite( Maps_OneAndOne <Finger, SySet <SyElement> > komabetuMasus, Finger finger, SySet <SyElement> masus) { if (komabetuMasus.Items.ContainsKey(finger)) { komabetuMasus.Items[finger].AddSupersets(masus);//追加します。 } else { // 無かったので、新しく追加します。 komabetuMasus.Items.Add(finger, masus); } }
/// <summary> /// ************************************************************************************************************************ /// 駒の移動可能升 /// ************************************************************************************************************************ /// /// ポテンシャルなので、貫通している。 /// /// </summary> /// <param name="light"></param> /// <returns></returns> public static SySet <SyElement> KomaKidou_Potential(Finger finger, SkyConst src_Sky) { SySet <SyElement> result; RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); // // ポテンシャルなので、貫通しているのは仕様通り。 // // FIXME: 成香が横に進めることが分かっているか? // result = Array_Rule01_PotentialMove15.ItemMethods[(int)koma.Komasyurui](koma.Pside, koma.Masu); return(result); }
/// <summary> /// ************************************************************************************************************************ /// 軌道上の駒たち /// ************************************************************************************************************************ /// </summary> /// <param name="km"></param> /// <returns></returns> public static void Fingers_EachSrcNow(out Fingers out_fingers, SySet <SyElement> srcList, SkyConst src_Sky, Playerside pside, IMoveHalf itaru) { out_fingers = new Fingers(); foreach (SyElement masu in srcList.Elements) { Finger finger = Util_Sky_FingerQuery.InShogibanMasuNow(src_Sky, pside, masu); if (Util_Finger.ForHonshogi(finger)) { // 指定の升に駒がありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> out_fingers.Add(finger); } } }
/// <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); } }
public void Foreach_Starlights(DELEGATE_Sky_Foreach delegate_Sky_Foreach) { bool toBreak = false; Finger finger = 0; foreach (Starlight light in this.Starlights) { delegate_Sky_Foreach(finger, light, ref toBreak); finger = (int)finger + 1; if (toBreak) { break; } } }
/// <summary> /// 駒台に戻すとき /// </summary> /// <param name="kifu"></param> /// <param name="finger"></param> /// <param name="light"></param> public void PutOverwriteOrAdd_Starlight(Finger finger, IMoveHalf light) { if (this.starlights.Count == (int)finger) { // オブジェクトを追加します。 this.Starlights.Add(light); } else if (this.starlights.Count + 1 <= (int)finger) { // エラー throw new Exception($"{this.GetType().Name}#SetStarPos: リストの要素より2多いインデックスを指定されましたので、追加しません。starIndex=[{finger}] / this.stars.Count=[{this.starlights.Count}]"); } else { this.Starlights[(int)finger] = light; } }
/// <summary> /// ************************************************************************************************************************ /// 指定のマスにある駒を返します。(本将棋用) /// ************************************************************************************************************************ /// </summary> /// <param name="masu">マス番号</param> /// <returns>スプライト番号。なければエラー番号。</returns> public static RO_Star InMasuNow(SkyConst src_Sky, SyElement masu) { RO_Star koma = null; Finger fig = Util_Sky_FingersQuery.InMasuNow(src_Sky, masu).ToFirst(); if (Fingers.Error_1 == fig) { // 指定の升には駒がない。 goto gt_EndMethod; } koma = Util_Koma.FromFinger(src_Sky, fig); gt_EndMethod: return(koma); }
public static RO_Star FromFinger(SkyConst src_Sky, Finger finger) { RO_Star koma; IMoveSource lightable = src_Sky.StarlightIndexOf(finger).Now; if (lightable is RO_Star) { koma = (RO_Star)lightable; } else { throw new Exception("未対応の星の光クラス"); } return(koma); }
/// <summary> /// 駒台に戻すとき /// </summary> /// <param name="kifu"></param> /// <param name="finger"></param> /// <param name="light"></param> public void AddOverwriteStarlight(Finger finger, Starlight light) { if (this.starlights.Count == (int)finger) { this.Starlights.Add(light); } else if (this.starlights.Count + 1 <= (int)finger) { Debug.Assert((int)finger < this.Starlights.Count, "要素の個数より2大きいインデックスを指定しました。 インデックス[" + (int)finger + "] 要素の個数[" + this.Starlights.Count + "]"); throw new Exception($"{this.GetType().Name}#SetStarPos: リストの要素より2多いインデックスを指定されましたので、追加しません。starIndex=[{finger}] / this.stars.Count=[{this.starlights.Count}]"); } else { this.Starlights[(int)finger] = light; } }
/// <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="hubNode">指し手一覧</param> /// <param name="logTag"></param> /// <returns>駒毎の、全指し手</returns> public Maps_OneAndMulti <Finger, ShootingStarlightable> SplitMoveByKoma(Node <ShootingStarlightable, KyokumenWrapper> hubNode) { SkyConst src_Sky = this.Value.ToKyokumenConst; Maps_OneAndMulti <Finger, ShootingStarlightable> enable_teMap = new Maps_OneAndMulti <Finger, ShootingStarlightable>(); hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { ShootingStarlightable nextMove = nextNode.Key; Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky, Util_Koma.AsKoma(nextMove.LongTimeAgo).Masu).ToFirst(); enable_teMap.AddOverwrite(figKoma, nextMove); }); return(enable_teMap); }
/// <summary> /// ハブ・ノードの次ノード・リストをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="hubNode"></param> /// <param name="comment"></param> /// <param name="logTag"></param> /// <returns></returns> public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <ShootingStarlightable, KyokumenWrapper> hubNode, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> node, ref bool toBreak) => { ShootingStarlightable move = node.Key; RO_Star_Koma srcKoma1 = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); Finger srcKoma2 = Util_Sky.Fingers_AtMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst(); // 駒1つ PieceType ks14 = Haiyaku184Array.Syurui(dstKoma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // マス sb.AppendLine(" { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },"); string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, srcKoma2, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");//FIXME:おかしい? // コメント sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
/// <summary> /// ハブ・ノードの次ノード・リストをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="hubNode"></param> /// <param name="comment"></param> /// <param name="logTag"></param> /// <returns></returns> public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <IMove, KyokumenWrapper> hubNode, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } hubNode.Foreach_ChildNodes((string key, Node <IMove, KyokumenWrapper> node, ref bool toBreak) => { IMove move = node.Key; RO_Star srcKoma1 = Util_Starlightable.AsKoma(move.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(move.Now); Finger srcKoma2 = Util_Sky_FingersQuery.InMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst(); // 駒1つ PieceType ks14 = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // マス sb.AppendLine($" {{ act:\"drawMasu\" , masu:{Conv_SyElement.ToMasuNumber(dstKoma.Masu)} }},"); string komaImg = Util_Converter_LogGraphicEx.Finger_ToString(src_Sky_base, srcKoma2, ""); sb.AppendLine($" {{ act:\"drawImg\", img:\"{komaImg}\", masu: {Conv_SyElement.ToMasuNumber(dstKoma.Masu)} }},");//FIXME:おかしい? // コメント sb.AppendLine($" {{ act:\"drawText\", text:\"{comment}\" , x:0, y:20 }},"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
public static SkyConst Sasu( SkyConst src_Sky, //現局面 Finger finger, //動かす駒 SyElement masu, //移動先マス Playerside pside_genTeban //動かす駒がどちらのプレイヤーのものか ) { SkyBuffer dst_Sky = new SkyBuffer(src_Sky.Clone()); // 現局面をコピーします。 // 移動先に相手の駒がないか、確認します。 Finger tottaKoma = Util_Sky.Fingers_AtMasuNow(new SkyConst(dst_Sky), masu).ToFirst(); if (tottaKoma != Fingers.Error_1) { // なにか駒を取ったら SyElement akiMasu; if (pside_genTeban == Playerside.P1) { akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, new SkyConst(dst_Sky)); } else { akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, new SkyConst(dst_Sky)); } RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(tottaKoma).Now); // FIXME:配役あってるか? dst_Sky.AddOverwriteStarlight(tottaKoma, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, akiMasu, koma.Syurui)));//tottaKoma, } // 駒を1個動かします。 // FIXME: 取った駒はどうなっている? { RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(finger).Now); dst_Sky.AddOverwriteStarlight(finger, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, masu, koma.Syurui)));//finger, } return(new SkyConst(dst_Sky)); }
/// <summary> /// ************************************************************************************************************************ /// [巻戻し]ボタン /// ************************************************************************************************************************ /// </summary> public static bool Makimodosi_Gui( NarabeRoomViewModel shogiGui, Finger movedKoma, Finger foodKoma, string fugoJStr, string backedInputText) { //------------------------------ // チェンジターン //------------------------------ shogiGui.ChangeTurn();//[巻戻し]ボタンを押したあと //------------------------------ // 符号表示 //------------------------------ shogiGui.Shape_PnlTaikyoku.SetFugo(fugoJStr); Shape_BtnKoma btn_movedKoma = Util_InGui.FingerToKomaBtn(movedKoma, shogiGui); Shape_BtnKoma btn_foodKoma = Util_InGui.FingerToKomaBtn(foodKoma, shogiGui);//取られた駒 //------------------------------------------------------------ // 駒・再描画 //------------------------------------------------------------ if ( null != btn_movedKoma //動かした駒 || null != btn_foodKoma //取ったときに下にあった駒(巻戻しのときは、これは無し) ) { shogiGui.ResponseData.RedrawStarlights();// 駒の再描画要求 } // 巻き戻したので、符号が入ります。 { shogiGui.ResponseData.InputTextString = fugoJStr + " " + backedInputText;// 入力欄 shogiGui.ResponseData.OutputTxt = ResponseGedanTxt.Kifu; } shogiGui.ResponseData.ToRedraw(); return(true); }
/// <summary> /// 駒画像のファイル名。 /// </summary> /// <param name="src_Sky"></param> /// <param name="finger"></param> /// <param name="extentionWithDot"></param> /// <returns></returns> public static string Finger_ToString(SkyConst src_Sky, Finger finger, string extentionWithDot) { string komaImg = ""; if ((int)finger < Finger_Honshogi.Items_KomaOnly.Length) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Playerside pside = koma.Pside; PieceType ks14 = Util_Komahaiyaku184.Syurui(koma.Haiyaku); komaImg = Util_Converter_LogGraphicEx.PsideKs14_ToString(pside, ks14, extentionWithDot); } else { komaImg = Util_Converter_LogGraphicEx.PsideKs14_ToString(Playerside.Empty, PieceType.None, extentionWithDot); } return(komaImg); }
/// <summary> /// 駒の種類(不成として扱います)を指定して、駒を検索します。 /// </summary> /// <param name="okiba"></param> /// <param name="komasyurui"></param> /// <param name="uc_Main"></param> /// <returns>無ければ -1</returns> public static Finger InOkibaSyuruiNowIgnoreCase(SkyConst srcSky, Okiba okiba, PieceType komasyurui) { Finger found = Fingers.Error_1; PieceType syuruiNarazuCase = Util_Komasyurui14.NarazuCaseHandle(komasyurui); foreach (Finger finger in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(srcSky.StarlightIndexOf(finger).Now); if (Conv_SyElement.ToOkiba(koma.Masu) == okiba && Util_Komasyurui14.Matches(koma.ToNarazuCase(), syuruiNarazuCase)) { found = finger; break; } } return(found); }
/// <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> /// 2駒関係[KK]用。 /// フィーチャーベクターの調査項目インデックス。該当なければ-1。 /// </summary> /// <param name="pside">プレイヤーサイド</param> /// <param name="komasyurui">盤上の種類</param> /// <param name="masu">盤上の駒の升</param> /// <returns></returns> public static int ToKIndex_From_PsideBanjoKomasyuruiMasu(SkyConst src_Sky, Playerside pside) { // 調査項目番号(K1、K2等) int result; SyElement masu; { Finger figK1 = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(src_Sky, Okiba.ShogiBan, pside, PieceType.K).ToFirst(); RO_Star komaK1 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figK1).Now); masu = komaK1.Masu; } if (Okiba.ShogiBan != Conv_SyElement.ToOkiba(masu)) { // 盤上でなければ。 result = -1; goto gt_EndMethod; } int kSuji; Util_MasuNum.TryMasuToSuji(masu, out kSuji); int kDan; Util_MasuNum.TryMasuToDan(masu, out kDan); int p1; Conv_FvKoumoku522.Converter_K1_to_P(Playerside.P1, kDan, kSuji, out p1); result = p1; gt_EndMethod: ; return(result); }
/// <summary> /// 将棋盤上での検索 /// </summary> /// <param name="srcAll">候補マス</param> /// <param name="komas"></param> /// <returns></returns> public static bool Query_Koma( Playerside pside, PieceType syurui, SySet <SyElement> srcAll, SkyConst src_Sky,//KifuTree kifu, out Finger foundKoma ) { //SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst; bool hit = false; foundKoma = Fingers.Error_1; foreach (New_Basho masu1 in srcAll.Elements)//筋・段。(先後、種類は入っていません) { foreach (Finger koma1 in Finger_Honshogi.Items_KomaOnly) { RO_Star koma2 = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma1).Now); if (pside == koma2.Pside && Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma2.Masu) && Util_Komasyurui14.Matches(syurui, Util_Komahaiyaku184.Syurui(koma2.Haiyaku)) && masu1 == koma2.Masu ) { // 候補マスにいた //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hit = true; foundKoma = koma1; break; } } } return(hit); }
/// <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); }
/// <summary> /// ************************************************************************************************************************ /// 指定のマスにある駒を返します。(本将棋用) /// ************************************************************************************************************************ /// </summary> /// <param name="masu">マス番号</param> /// <returns>スプライト番号。なければエラー番号。</returns> public static RO_Star InMasuPsideKomasyuruiNow(SkyConst src_Sky, SyElement masu, Playerside pside, PieceType syurui) { RO_Star koma = null; Finger fig = Util_Sky_FingersQuery.InMasuNow(src_Sky, masu).ToFirst(); if (Fingers.Error_1 == fig) { // 指定の升には駒がない。 goto gt_EndMethod; } koma = Util_Koma.FromFinger(src_Sky, fig); if (koma.Pside != pside || koma.Komasyurui != syurui) { // サイド または駒の種類が異なる koma = null; goto gt_EndMethod; } gt_EndMethod: return(koma); }