/// <summary> /// 全合法手をダンプ。 /// </summary> /// <returns></returns> public string DumpToAllGohosyu(SkyConst src_Sky) { StringBuilder sb = new StringBuilder(); //sb.AppendLine("--------------------"); //sb.AppendLine("カレントノード内部データ"); //sb.AppendLine("--------------------"); src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { // 番号 sb.Append("Fig."); sb.Append(finger); sb.Append(" "); RO_Star koma = Util_Starlightable.AsKoma(light.Now); // P1,P2 sb.Append(koma.Pside); sb.Append(" "); // 升00 sb.Append(Conv_Sy.Query_Word(koma.Masu.Bitfield)); sb.Append(" "); // 歩、香… sb.Append(Util_Komasyurui14.ToIchimoji(koma.Komasyurui)); sb.AppendLine(); }); return(sb.ToString()); }
/// <summary> /// ************************************************************************************************************************ /// 局面に合わせて、駒ボタンのx,y位置を変更します /// ************************************************************************************************************************ /// </summary> /// <param name="btnKoma">駒</param> public static void Redraw_KomaLocation( Finger figKoma, MainGui_Csharp mainGui ) { RO_Star koma = Util_Starlightable.AsKoma(mainGui.Model_Manual.GuiSkyConst.StarlightIndexOf(figKoma).Now); Shape_BtnKoma btnKoma = Conv_Koma_InGui.FingerToKomaBtn(figKoma, mainGui); // マスと駒の隙間(パディング) int padX = 2; int padY = 2; int suji; int dan; Util_MasuNum.TryMasuToSuji(koma.Masu, out suji); Util_MasuNum.TryMasuToDan(koma.Masu, out dan); switch (Conv_SyElement.ToOkiba(koma.Masu)) { case Okiba.ShogiBan: btnKoma.SetBounds(new Rectangle( mainGui.Shape_PnlTaikyoku.Shogiban.SujiToX(suji) + padX, mainGui.Shape_PnlTaikyoku.Shogiban.DanToY(dan) + padY, btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.Sente_Komadai: btnKoma.SetBounds(new Rectangle( mainGui.Shape_PnlTaikyoku.KomadaiArr[0].SujiToX(suji) + padX, mainGui.Shape_PnlTaikyoku.KomadaiArr[0].DanToY(dan) + padY, btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.Gote_Komadai: btnKoma.SetBounds(new Rectangle( mainGui.Shape_PnlTaikyoku.KomadaiArr[1].SujiToX(suji) + padX, mainGui.Shape_PnlTaikyoku.KomadaiArr[1].DanToY(dan) + padY, btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; case Okiba.KomaBukuro: btnKoma.SetBounds(new Rectangle( mainGui.Shape_PnlTaikyoku.KomadaiArr[2].SujiToX(suji) + padX, mainGui.Shape_PnlTaikyoku.KomadaiArr[2].DanToY(dan) + padY, btnKoma.Bounds.Width, btnKoma.Bounds.Height )); break; } }
/// <summary> /// FIXME:使ってない? /// </summary> /// <param name="move"></param> /// <returns></returns> public static string ChangeMoveTo_KsString_ForLog(IMove move) { string moveInfo; RO_Star koma = Util_Starlightable.AsKoma(move.Now); moveInfo = Util_Komasyurui14.ToIchimoji(Util_Komahaiyaku184.Syurui(koma.Haiyaku)); return(moveInfo); }
/// <summary> /// 「▲7六歩」といった符号にして返します。 /// </summary> /// <param name="node">keyで指し手の指定、かつ、1つ前のノードに移動するのに使います。</param> /// <param name="kyokumenWrapper">現局面です。</param> /// <returns></returns> public static string ToMoveStrJsa( Node <IMove, KyokumenWrapper> node //KyokumenWrapper kyokumenWrapper ) { RO_Star koma = Util_Starlightable.AsKoma(((IMove)node.Key).LongTimeAgo); JsaFugoImpl jsaFugo = Array_JsaFugoCreator15.ItemMethods[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)](node.Key, node.Value // kyokumenWrapper, ); //「▲2二角成」なら、馬(dst)ではなくて角(src)。 return(Util_Translator_JsaFugo.ToString_UseDou(jsaFugo, node)); }
private static void Log2( Tansaku_Genjo genjo, KifuNode node_yomi, KaisetuBoard logBrd_move1 ) { logBrd_move1.moveOrNull = node_yomi.Key; RO_Star srcKoma = Util_Starlightable.AsKoma(logBrd_move1.moveOrNull.LongTimeAgo); RO_Star dstKoma = Util_Starlightable.AsKoma(logBrd_move1.moveOrNull.Now); // ログ試し logBrd_move1.Arrow.Add(new Gkl_Arrow(Conv_SyElement.ToMasuNumber(srcKoma.Masu), Conv_SyElement.ToMasuNumber(dstKoma.Masu))); genjo.Args.LogF_moveKiki.boards.Add(logBrd_move1); }
public static string ChangeMoveTo_KsString_ForLog(IMove move, Playerside pside_genTeban) { string result; if (null == move) { result = "合法手はありません。"; goto gt_EndMethod; } RO_Star koma = Util_Starlightable.AsKoma(move.Now); // 指し手を「△歩」といった形で。 result = Util_Komasyurui14.ToNimoji(Util_Komahaiyaku184.Syurui(koma.Haiyaku), pside_genTeban); gt_EndMethod: return(result); }
/// <summary> /// v(^▽^)v超能力『メナス』だぜ☆ 未来の脅威を予測し、可視化するぜ☆www /// </summary> public static void Menace(MainGui_Csharp mainGui) { if (0 < mainGui.Model_Manual.GuiTemezumi) { // 処理の順序が悪く、初回はうまく判定できない。 SkyConst src_Sky = mainGui.Model_Manual.GuiSkyConst; //---------- // 将棋盤上の駒 //---------- mainGui.RepaintRequest.SetFlag_RefreshRequest(); // [クリアー] mainGui.Shape_PnlTaikyoku.Shogiban.ClearHMasu_KikiKomaList(); // 全駒 foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if ( Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu) && mainGui.Model_Manual.GuiPside != koma.Pside ) { // 駒の利き SySet <SyElement> kikiZukei = Util_Sky_SyugoQuery.KomaKidou_Potential(figKoma, src_Sky); IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements; foreach (SyElement masu in kikiMasuList) { // その枡に利いている駒のハンドルを追加 if (!Masu_Honshogi.IsErrorBasho(masu)) { mainGui.Shape_PnlTaikyoku.Shogiban.HMasu_KikiKomaList[Conv_SyElement.ToMasuNumber(masu)].Add((int)figKoma); } } } } } }
public static Json_Val ToJsonVal(IMoveHalf light) { Json_Obj obj = new Json_Obj(); RO_Star koma = Util_Starlightable.AsKoma(light.Now); // プレイヤーサイド obj.Add(new Json_Prop("pside", Conv_Playerside.ToSankaku(koma.Pside)));// ▲△ // マス obj.Add(new Json_Prop("masu", Conv_SyElement.ToMasuNumber(koma.Masu)));// ▲△ // 駒の種類。歩、香、桂…。 obj.Add(new Json_Prop("syurui", Conv_Komasyurui.ToStr_Ichimoji(Util_Komahaiyaku184.Syurui(koma.Haiyaku))));// ▲△ return(obj); }
public static void Komamove1a_49Gui( out PieceType toSyurui, out IMoveHalf dst, Shape_BtnKoma btnKoma_Selected, Shape_BtnMasu btnMasu, MainGui_Csharp mainGui ) { // 駒の種類 if (mainGui.Naru) { // 成ります toSyurui = Util_Komasyurui14.NariCaseHandle[(int)Util_Komahaiyaku184.Syurui(Util_Starlightable.AsKoma(mainGui.Shape_PnlTaikyoku.MouseStarlightOrNull2.Now).Haiyaku)]; mainGui.SetNaruFlag(false); } else { // そのまま toSyurui = Util_Komahaiyaku184.Syurui(Util_Starlightable.AsKoma(mainGui.Shape_PnlTaikyoku.MouseStarlightOrNull2.Now).Haiyaku); } // 置く駒 { dst = new RO_Starlight( //btnKoma_Selected.Finger, new RO_Star( Util_Starlightable.AsKoma(mainGui.Model_Manual.GuiSkyConst.StarlightIndexOf(btnKoma_Selected.Finger).Now).Pside, btnMasu.Zahyo, toSyurui ) ); } //------------------------------------------------------------ // 「取った駒種類_巻戻し用」をクリアーします。 //------------------------------------------------------------ mainGui.Shape_PnlTaikyoku.MousePos_FoodKoma = null; }
/// <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="mainGui"></param> /// <param name="btnTumandeiruKoma"></param> /// <param name="logTag"></param> private void After_NaruNaranai_ButtonPushed( MainGui_Csharp mainGui , Shape_BtnKoma btnTumandeiruKoma ) { // 駒を動かします。 { // GuiからServerへ渡す情報 PieceType syurui; IMoveHalf dst; Util_Function_Csharp.Komamove1a_49Gui(out syurui, out dst, btnTumandeiruKoma, mainGui.Shape_PnlTaikyoku.NaruBtnMasu, mainGui); // ServerからGuiへ渡す情報 bool torareruKomaAri; RO_Star koma_Food_after; Util_Functions_Server.Komamove1a_50Srv(out torareruKomaAri, out koma_Food_after, dst, btnTumandeiruKoma.Koma, Util_Starlightable.AsKoma(dst.Now), mainGui.Model_Manual); Util_Function_Csharp.Komamove1a_51Gui(torareruKomaAri, koma_Food_after, mainGui); } { //---------- // 移動済表示 //---------- mainGui.Shape_PnlTaikyoku.SetHMovedKoma(btnTumandeiruKoma.Finger); //------------------------------ // 棋譜に符号を追加(マウスボタンが放されたとき)TODO:まだ早い。駒が成るかもしれない。 //------------------------------ // 棋譜 IMove move = new RO_Starbeam( //btnTumandeiruKoma.Finger, mainGui.Shape_PnlTaikyoku.MouseStarlightOrNull2.Now, mainGui.Model_Manual.GuiSkyConst.StarlightIndexOf(btnTumandeiruKoma.Finger).Now, mainGui.Shape_PnlTaikyoku.MousePos_FoodKoma != null ? mainGui.Shape_PnlTaikyoku.MousePos_FoodKoma.Komasyurui : PieceType.None );// 選択している駒の元の場所と、移動先 KifuNode newNode; { // // 成ったので、指し手データ差替え。 // StartposImporter.Assert_HirateHonsyogi(new SkyBuffer(mainGui.Model_Manual.GuiSkyConst), "newNode作成前"); newNode = new KifuNodeImpl( move, new KyokumenWrapper(SkyConst.NewInstance_ReversePside( // 先後を反転させます。 mainGui.Model_Manual.GuiSkyConst, mainGui.Model_Manual.GuiSkyConst.Temezumi + 1 //1手進める )) ); StartposImporter.Assert_HirateHonsyogi(new SkyBuffer(newNode.Value.KyokumenConst), "newNode作成後"); //「成る/成らない」ボタンを押したときです。 { //---------------------------------------- // 次ノード追加 //---------------------------------------- mainGui.Link_Server.Model_Taikyoku.Kifu.GetSennititeCounter().CountUp_New(Conv_Sky.ToKyokumenHash(newNode.Value.KyokumenConst), "After_NaruNaranai"); ((KifuNode)mainGui.Link_Server.Model_Taikyoku.Kifu.CurNode).PutTuginoitte_New(newNode); } // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ここで棋譜の変更をします。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ string jsaFugoStr; Util_Functions_Server.SetCurNode_Srv( mainGui.Link_Server.Model_Taikyoku, mainGui.Model_Manual, newNode, out jsaFugoStr); mainGui.RepaintRequest.SetFlag_RefreshRequest(); //------------------------------ // 符号表示 //------------------------------ // 成る/成らないボタンを押したとき。 mainGui.Shape_PnlTaikyoku.SetFugo(jsaFugoStr); } //------------------------------ // チェンジターン //------------------------------ if (!mainGui.Shape_PnlTaikyoku.Requested_NaruDialogToShow) { //Logger.Trace("マウス左ボタンを押したのでチェンジターンします。"); mainGui.ChangedTurn(); } } mainGui.RepaintRequest.SetFlag_RecalculateRequested();// 駒の再描画要求 //Logger.Trace("つまんでいる駒を放します。(6)"); mainGui.SetFigTumandeiruKoma(-1);//駒を放した扱いです。 mainGui.Shape_PnlTaikyoku.SetNaruMasu(null); mainGui.RepaintRequest.SyuturyokuRequest = RepaintRequestGedanTxt.Kifu; mainGui.RepaintRequest.SetFlag_RefreshRequest(); IMove last; { Node <IMove, KyokumenWrapper> kifuElement = mainGui.Link_Server.Model_Taikyoku.Kifu.CurNode; last = (IMove)kifuElement.Key; } mainGui.ChangedTurn();//マウス左ボタンを押したのでチェンジターンします。 mainGui.Shape_PnlTaikyoku.Request_NaruDialogToShow(false); mainGui.GetWidget("BtnNaru").Visible = false; mainGui.GetWidget("BtnNaranai").Visible = false; mainGui.SetScene(SceneName.SceneB_1TumamitaiKoma); }
/// <summary> /// ************************************************************************************************************************ /// HTML出力。(これは作者のホームページ用に書かれています) /// ************************************************************************************************************************ /// </summary> public static string CreateHtml(MainGui_Csharp mainGui) { StringBuilder sb = new StringBuilder(); sb.AppendLine("<div style=\"position:relative; left:0px; top:0px; border:solid 1px black; width:250px; height:180px;\">"); // 後手の持ち駒 sb.AppendLine(" <div style=\"position:absolute; left:0px; top:2px; width:30px;\">"); sb.AppendLine(" △後手"); sb.AppendLine(" <div style=\"margin-top:10px; width:30px;\">"); sb.Append(" "); SkyConst siteiSky = mainGui.Model_Manual.GuiSkyConst; siteiSky.Foreach_Starlights((Finger finger, IMoveHalf ml, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(ml.Now); if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai) { sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)]); } }); sb.AppendLine(" </div>"); sb.AppendLine(" </div>"); // 将棋盤 sb.AppendLine(" <div style=\"position:absolute; left:30px; top:2px; width:182px;\">"); sb.AppendLine(" <table>"); for (int dan = 1; dan <= 9; dan++) { sb.Append(" <tr>"); for (int suji = 9; 1 <= suji; suji--) { bool isSpace = true; siteiSky.Foreach_Starlights((Finger finger, IMoveHalf ml, ref bool toBreak) => { RO_Star koma2 = Util_Starlightable.AsKoma(ml.Now); int suji2; Util_MasuNum.TryMasuToSuji(koma2.Masu, out suji2); int dan2; Util_MasuNum.TryMasuToDan(koma2.Masu, out dan2); if ( Conv_SyElement.ToOkiba(koma2.Masu) == Okiba.ShogiBan && //盤上 suji2 == suji && dan2 == dan ) { if (Playerside.P2 == koma2.Pside) { sb.Append("<td><span class=\"koma2x\">"); sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma2.Haiyaku)]); sb.Append("</span></td>"); isSpace = false; } else { sb.Append("<td><span class=\"koma1x\">"); sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma2.Haiyaku)]); sb.Append("</span></td>"); isSpace = false; } } }); if (isSpace) { sb.Append("<td> </td>"); } } sb.AppendLine("</tr>"); } sb.AppendLine(" </table>"); sb.AppendLine(" </div>"); // 先手の持ち駒 sb.AppendLine(" <div style=\"position:absolute; left:215px; top:2px; width:30px;\">"); sb.AppendLine(" ▲先手"); sb.AppendLine(" <div style=\"margin-top:10px; width:30px;\">"); sb.Append(" "); siteiSky.Foreach_Starlights((Finger finger, IMoveHalf ml, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(ml.Now); if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai) { sb.Append(Util_Komasyurui14.Fugo[(int)Util_Komahaiyaku184.Syurui(koma.Haiyaku)]); } }); sb.AppendLine(" </div>"); sb.AppendLine(" </div>"); // sb.AppendLine("</div>"); return(sb.ToString()); }
/// <summary> /// 評価値を返します。先手が有利ならプラス、後手が有利ならマイナス、互角は 0.0 です。 /// </summary> /// <param name="input_node"></param> /// <returns></returns> public override void Evaluate( out float out_score, #if DEBUG || LEARN out KyHyokaMeisai_Koumoku out_meisaiKoumoku_orNull, #endif SkyConst src_Sky, FeatureVector fv ) { out_score = 0.0f; // -999~999(*bairitu) が 40×40個ほど足し合わせた数になるはず。 #if DEBUG float[] komabetuMeisai = new float[Finger_Honshogi.Items_KomaOnly.Length]; #endif // // 盤上にある駒だけ、項目番号を調べます。 // //---------------------------------------- // 項目番号リスト //---------------------------------------- // // 40個の駒と、14種類の持ち駒があるだけなので、 // 54個サイズの長さがあれば足りるんだぜ☆ 固定長にしておこう☆ // int nextIndex = 0; int[] komokuArray_unsorted = new int[54]; //昇順でなくても構わないアルゴリズムにすること。 for (int i = 0; i < Finger_Honshogi.Items_KomaOnly.Length; i++) // 全駒 { RO_Star koma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.Items_KomaOnly[i]).Now); if (Okiba.ShogiBan == Conv_SyElement.ToOkiba(koma.Masu)) { // 盤上 komokuArray_unsorted[nextIndex] = Util_FvParamIndex.ParamIndex_Banjo(koma); nextIndex++; } else { // 持ち駒は、ここでは無視します。 } } // 持ち駒:先後×7種類 for (int iPside = 0; iPside < Array_Playerside.Items_PlayerOnly.Length; iPside++) { for (int iKomasyurui = 0; iKomasyurui < Array_Komasyurui.MotiKoma7Syurui.Length; iKomasyurui++) { komokuArray_unsorted[nextIndex] = Util_FvParamIndex.ParamIndex_Moti(src_Sky, Array_Playerside.Items_PlayerOnly[iPside], Array_Komasyurui.MotiKoma7Syurui[iKomasyurui]); nextIndex++; } } //Array.Sort(komokuArray_unsorted); // // // 例えば、[1P1三歩、2P2一桂]という組み合わせと、[2P2一桂、1P1三歩]という組み合わせは、同じだが欄が2つある。 // そこで、表の半分を省きたい。 // しかし、表を三角形にするためには、要素は昇順にソートされている必要がある。 // 合法手1つごとにソートしていては、本末転倒。 // そこで、表は正方形に読み、内容は三角形の部分にだけ入っているということにする。 // // // 例えば、[1P1三歩、1P1三歩]という組み合わせもある。これは、自分自身の絶対位置の評価として試しに、残しておいてみる☆ // // for (int iA = 0; iA < nextIndex; iA++) { int p1 = komokuArray_unsorted[iA]; for (int iB = 0; iB < nextIndex; iB++) { int p2 = komokuArray_unsorted[iB]; if (p1 <= p2) // 「p2 < p1」という組み合わせは同じ意味なので省く。「p1==p2」は省かない。 { //---------------------------------------- // よし、組み合わせだぜ☆! //---------------------------------------- out_score += fv.NikomaKankeiPp_ForMemory[p1, p2]; } else { //---------------------------------------- // 使っていない方の三角形だぜ☆! //---------------------------------------- // スルー。 } } } //---------------------------------------- // 明細項目 //---------------------------------------- #if DEBUG || LEARN string utiwake = ""; // 内訳 { StringBuilder sb = new StringBuilder(); sb.Append(" PP "); sb.Append(out_score); sb.Append("点"); utiwake = sb.ToString(); } out_meisaiKoumoku_orNull = new KyHyokaMeisai_KoumokuImpl(utiwake, out_score); #endif }
/// <summary> /// 54駒のリスト。 /// /// 盤上の40駒リスト。 /// 駒台の14駒リスト。 /// </summary> public static N54List Calc_54List(SkyConst src_Sky) { N54List result_n54List = new N54ListImpl(); //---------------------------------------- // インナー・メソッド用 集計変数 //---------------------------------------- int p54Next = 0; int[] p54List = new int[54]; src_Sky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { RO_Star koma = Util_Starlightable.AsKoma(light.Now); //---------------------------------------- // まず、p を調べます。 //---------------------------------------- if (Conv_SyElement.ToOkiba(koma.Masu) == Okiba.ShogiBan) { int pIndex = FeatureVectorImpl.CHOSA_KOMOKU_ERROR;// 調査項目P1 //---------------------------------------- // 盤上の駒 //---------------------------------------- Conv_FvKoumoku525.ToPIndex_FromBanjo_PsideKomasyuruiMasu(koma.Pside, koma.Komasyurui, koma.Masu, out pIndex); if (FeatureVectorImpl.CHOSA_KOMOKU_ERROR == pIndex) { // p1 がエラーでは、処理は続けられない。 Util_54List.Panic1(koma); goto gt_NextLoop_player1; } //---------------------------------------- // 盤上の駒だぜ☆! //---------------------------------------- p54List[p54Next] = pIndex; p54Next++; } else if ( Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Sente_Komadai || Conv_SyElement.ToOkiba(koma.Masu) == Okiba.Gote_Komadai) { int pIndex = FeatureVectorImpl.CHOSA_KOMOKU_ERROR;// 調査項目P1 //---------------------------------------- // 持ち駒 //---------------------------------------- PieceType motiKomasyurui = koma.ToNarazuCase();//例:駒台に馬はない。角の数を数える。 // 駒の枚数 int maisu = Util_Sky_FingersQuery.InOkibaKomasyuruiNow(src_Sky, Conv_Playerside.ToKomadai(koma.Pside), motiKomasyurui).Items.Count; Conv_FvKoumoku525.ToPIndex_FromMoti_PsideKomasyuruiMaisu(koma.Pside, motiKomasyurui, maisu, out pIndex); if (FeatureVectorImpl.CHOSA_KOMOKU_ERROR == pIndex) { // p1 がエラーでは、処理は続けられない。 Util_54List.Panic1(koma); goto gt_NextLoop_player1; } //---------------------------------------- // 駒台の駒だぜ☆! //---------------------------------------- p54List[p54Next] = pIndex; p54Next++; } gt_NextLoop_player1: ; }); result_n54List.SetP54List_Unsorted(p54List); result_n54List.SetP54Next(p54Next); return(result_n54List); }
/// <summary> /// 駒を動かします(1)。マウスボタンが押下されたとき。 /// /// 成る、成らない関連。 /// /// </summary> public static void Komamove1a_50Srv( out bool torareruKomaAri, out RO_Star koma_Food_after, IMoveHalf dst, Finger fig_btnTumandeiruKoma, RO_Star foodee_koma,//取られる対象の駒 Model_Manual model_Manual ) { Finger btnKoma_Food_Koma; // 取られることになる駒のボタン btnKoma_Food_Koma = Util_Sky_FingersQuery.InMasuNow(model_Manual.GuiSkyConst, foodee_koma.Masu).ToFirst(); if (Fingers.Error_1 == btnKoma_Food_Koma) { koma_Food_after = null; torareruKomaAri = false; btnKoma_Food_Koma = Fingers.Error_1; goto gt_EndBlock1; } else { //>>>>> 取る駒があったとき torareruKomaAri = true; } PieceType koma_Food_pre_Syurui = Util_Starlightable.AsKoma(model_Manual.GuiSkyConst.StarlightIndexOf(btnKoma_Food_Koma).Now).Komasyurui; // その駒は、駒置き場に移動させます。 SyElement akiMasu; switch (foodee_koma.Pside) { case Playerside.P2: akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, model_Manual.GuiSkyConst); if (!Masu_Honshogi.IsErrorBasho(akiMasu)) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P2, akiMasu, //駒台へ Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P2, Util_Masu10.OkibaSujiDanToMasu( Okiba.Gote_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; case Playerside.P1: //thru default: akiMasu = Util_IttesasuRoutine.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, model_Manual.GuiSkyConst); if (!Masu_Honshogi.IsErrorBasho(akiMasu)) { // 駒台に空きスペースがありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P1, akiMasu, //駒台へ Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } else { // エラー: 駒台に空きスペースがありませんでした。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> koma_Food_after = new RO_Star( Playerside.P1, Util_Masu10.OkibaSujiDanToMasu( Okiba.Sente_Komadai, Util_Koma.CTRL_NOTHING_PROPERTY_SUJI, Util_Koma.CTRL_NOTHING_PROPERTY_DAN ), Util_Komasyurui14.NarazuCaseHandle(koma_Food_pre_Syurui) ); } break; } gt_EndBlock1: SkyConst sky2; if (btnKoma_Food_Koma != Fingers.Error_1) { //------------------------------ // 取られる駒があった場合 //------------------------------ sky2 = SkyConst.NewInstance_OverwriteOrAdd_Light( model_Manual.GuiSkyConst, -1, //そのまま // // 指した駒 // fig_btnTumandeiruKoma, dst, // // 取られた駒 // btnKoma_Food_Koma, new RO_Starlight( koma_Food_after ) ); } else { //------------------------------ // 取られる駒がなかった場合 //------------------------------ RO_Star movedKoma = Util_Starlightable.AsKoma(model_Manual.GuiSkyConst.StarlightIndexOf(fig_btnTumandeiruKoma).Now); sky2 = SkyConst.NewInstance_OverwriteOrAdd_Light( model_Manual.GuiSkyConst, -1, //そのまま // // 指した駒 // fig_btnTumandeiruKoma, dst, // // 手得計算 // movedKoma.Komasyurui, 0, movedKoma.Masu ); } model_Manual.SetGuiSky(sky2); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // 棋譜は変更された。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ }
/// <summary> /// 評価値を返します。先手が有利ならプラス、後手が有利ならマイナス、互角は 0.0 です。 /// </summary> /// <param name="args"></param> /// <returns></returns> public override void Evaluate( out float out_score, #if DEBUG || LEARN out KyHyokaMeisai_Koumoku out_meisaiKoumoku_orNull, #endif SkyConst srcSky, FeatureVector fv ) { float score_p1 = 0.0f; float score_p2 = 0.0f;//2Pは、負の数なほどグッドということに注意。 srcSky.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) => { RO_Starlight ms = (RO_Starlight)light; RO_Star koma = Util_Starlightable.AsKoma(ms.Now); // 駒の種類による点数 float komaScore_temp = fv.Komawari[(int)koma.Komasyurui]; // 持ち駒は、価値を高めます。(ボーナス)序盤に駒をぽんぽん打つのを防ぐため。 if ( (Okiba.Sente_Komadai | Okiba.Gote_Komadai).HasFlag(Conv_SyElement.ToOkiba(koma.Masu)) ) { //komaScore_temp *= 1.05f;// 1.05倍だと、相手の桂馬の利きに、桂馬をタダ捨てした。足りてないか。 komaScore_temp *= 1.13f; //komaScore_temp *= 1.25f;// 1.25倍だと、金、金、角を打たずに王手されて終わってしまった。ボーナスを付けすぎたか☆ } if (koma.Pside == Playerside.P1) { score_p1 += komaScore_temp; } else { // 駒割は、他の評価値と違って、 // 1プレイヤーも、2プレイヤーも正の数になっている。 // 2プレイヤーは 符号を反転させること。 score_p2 += -komaScore_temp; } }); // // 2プレイヤーは 負の数になっている(負の数が多いほど有利)ので、 // 足すだけでいい。 // out_score = score_p1 + score_p2; //---------------------------------------- // 明細項目 //---------------------------------------- #if DEBUG || LEARN string utiwake = ""; // 明細 { StringBuilder sb = new StringBuilder(); sb.Append("駒割"); utiwake = sb.ToString(); } // 明細項目 out_meisaiKoumoku_orNull = new KyHyokaMeisai_KoumokuImpl(utiwake, out_score); #endif }
public virtual RO_Star GetKoma(Finger finger) { return(Util_Starlightable.AsKoma(this.Model_Manual.GuiSkyConst.StarlightIndexOf(finger).Now)); }
public void Go(string btime, string wtime, string byoyomi, string binc, string winc) { //------------------------------------------------------------ // あなたの手番です //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:36:19> go btime 599000 wtime 600000 byoyomi 60000 // │ // // もう指していいときに、将棋所から送られてくる文字が go です。 // //------------------------------------------------------------ // 先手 3:00 後手 0:00 記録係「50秒ぉ~」 //------------------------------------------------------------ // // 上図のメッセージのままだと使いにくいので、 // あとで使いやすいように Key と Value の表に分けて持ち直します。 // // 図. // // goDictionary // ┌──────┬──────┐ // │Key │Value │ // ┝━━━━━━┿━━━━━━┥ // │btime │599000 │ // ├──────┼──────┤ // │wtime │600000 │ // ├──────┼──────┤ // │byoyomi │60000 │ // └──────┴──────┘ // 単位はミリ秒ですので、599000 は 59.9秒 です。 // //---------------------------------------- // 棋譜ツリー、局面データは、position コマンドで先に与えられているものとします。 //---------------------------------------- // ┏━━━━プログラム━━━━┓ int latestTemezumi = this.Game.Kifu.CurNode.Value.KyokumenConst.Temezumi; //現・手目済 SkyConst src_Sky = this.Game.Kifu.NodeAt(latestTemezumi).Value.KyokumenConst; //現局面 //Logger.Trace($"将棋サーバー「{latestTemezumi}手目、きふわらべ さんの手番ですよ!」 {line}"); //---------------------------------------- // 王の状態を調べます。 //---------------------------------------- Result_KingState result_kingState; { result_kingState = Result_KingState.Empty; RO_Star king1p = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.SenteOh).Now); RO_Star king2p = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.GoteOh).Now); //Logger.Trace("将棋サーバー「ではここで、王さまがどこにいるか確認してみましょう」"); //Logger.Trace($"▲王の置き場={Conv_SyElement.Masu_ToOkiba(koma1.Masu)}"); //Logger.Trace($"△王の置き場={Conv_SyElement.Masu_ToOkiba(koma2.Masu)}"); if (Conv_SyElement.ToOkiba(king1p.Masu) != Okiba.ShogiBan) { // 先手の王さまが将棋盤上にいないとき☆ result_kingState = Result_KingState.Lost_SenteOh; } else if (Conv_SyElement.ToOkiba(king2p.Masu) != Okiba.ShogiBan) { // または、後手の王さまが将棋盤上にいないとき☆ result_kingState = Result_KingState.Lost_GoteOh; } else { result_kingState = Result_KingState.Empty; } } //------------------------------------------------------------ // わたしの手番のとき、王様が 将棋盤上からいなくなっていれば、投了します。 //------------------------------------------------------------ // // 将棋GUI『きふならべ』用☆ 将棋盤上に王さまがいないときに、本将棋で go コマンドが送られてくることは無いのでは☆? // switch (result_kingState) { case Result_KingState.Lost_SenteOh: // 先手の王さまが将棋盤上にいないとき☆ case Result_KingState.Lost_GoteOh: // または、後手の王さまが将棋盤上にいないとき☆ { //------------------------------------------------------------ // 投了 //------------------------------------------------------------ // // 図. // // log.txt // ┌──────────────────────────────────────── // ~ // │2014/08/02 2:36:21< bestmove resign // │ // // この将棋エンジンは、後手とします。 // 20手目、投了 を決め打ちで返します。 Playing.Send("bestmove resign"); //投了 } break; default: // どちらの王さまも、まだまだ健在だぜ☆! { List <KifuNode> bestKifuNodeList = new List <KifuNode>(); //------------------------------------------------------------ // 指し手のチョイス //------------------------------------------------------------ bool isHonshogi = true; //------------------------------------------------------------ // MultiPV のテスト中☆ //------------------------------------------------------------ // // 指し手を決めます。 // TODO: その指し手の評価値がいくらだったのか調べたい。 // // FIXME: ログがMultiPV別になっていないので、混ざって、同じ手を2度指しているみたいに見えてしまう☆ // int multiPV_Count = 1; // 2; { // 最善手、次善手、三次善手、四次善手、五次善手 for (int iMultiPV = 0; iMultiPV < multiPV_Count; iMultiPV++) { bestKifuNodeList.Add(this.WA_Bestmove( isHonshogi, this.Game.Kifu) ); } #if DEBUG //// 内容をログ出力 //// 最善手、次善手、三次善手、四次善手、五次善手 //StringBuilder sb = new StringBuilder(); //for (int iMultiPV = 0; iMultiPV < 5; iMultiPV++) //{ // string sfenText = Util_Sky.ToSfenMoveText(bestMoveList[iMultiPV]); // sb.AppendLine($"[{iMultiPV}]{sfenText}"); //} //System.Windows.Forms.MessageBox.Show(sb.ToString()); #endif } KifuNode bestKifuNode = null; // 最善手、次善手、三次善手、四次善手、五次善手 float bestScore = float.MinValue; for (int iMultiPV = 0; iMultiPV < bestKifuNodeList.Count; iMultiPV++) { KifuNode node = bestKifuNodeList[iMultiPV]; if (null != node && null != node.KyHyokaSheet_Mutable && bestScore <= node.Score) { bestScore = node.Score; bestKifuNode = node; } } IMove bestMove2; if (null == bestKifuNode) { // 投了 bestMove2 = Util_Sky258A.NullObjectMove; } else { bestMove2 = bestKifuNode.Key; } if (Util_Sky_BoolQuery.isEnableSfen(bestMove2)) { string sfenText = ConvMoveStrSfen.ToMoveStrSfen(bestMove2); // ログが重過ぎる☆! //Logger.Trace($"(Warabe)指し手のチョイス: bestmove=[{sfenText}] 棋譜={KirokuGakari.ToJsaKifuText(this.Kifu)}"); //---------------------------------------- // スコア 試し //---------------------------------------- { //int hyojiScore = (int)(bestScore / 100.0d);//FIXME:適当に調整した。 int hyojiScore = (int)bestScore; if (this.Game.Kifu.CurNode.Value.KyokumenConst.KaisiPside == Playerside.P2) { // 符号を逆転 hyojiScore = -hyojiScore; } Playing.Send($"info time 1 depth 1 nodes 1 score cp {hyojiScore.ToString()} pv "); //FIXME: //+ " pv 3a3b L*4h 4c4d" } //---------------------------------------- // 指し手を送ります。 //---------------------------------------- Playing.Send($"bestmove {sfenText}"); } else // 指し手がないときは、SFENが書けない☆ 投了だぜ☆ { // ログが重過ぎる☆! //Logger.Trace($"(Warabe)指し手のチョイス: 指し手がないときは、SFENが書けない☆ 投了だぜ☆ww(>_<) 棋譜={KirokuGakari.ToJsaKifuText(this.Kifu)}"); //---------------------------------------- // 投了w! //---------------------------------------- Playing.Send("bestmove resign"); } //------------------------------------------------------------ // 以前の手カッター //------------------------------------------------------------ UtilKifuTree282.IzennoHenkaCutter(this.Game.Kifu); } break; } // ┗━━━━プログラム━━━━┛ // Logger.Trace(); //throw new Exception("デバッグだぜ☆! エラーはキャッチできたかな~☆?(^▽^)"); }
/// <summary> /// シングルトン。 /// </summary> /// <returns></returns> public static Event_CsharpImpl GetInstance() { if (null == Event_CsharpImpl.instance) { Event_CsharpImpl ins = new Event_CsharpImpl(); Event_CsharpImpl.instance = ins; // // [成る]ボタンのイベント。 // ins.delegate_BtnNaru = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; shogibanGui2.SetNaruFlag(true); ins.After_NaruNaranai_ButtonPushed( shogibanGui2 , btnKoma_Selected ); }; // // [成らない]ボタンのイベント。 // ins.delegate_BtnNaranai = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; shogibanGui2.SetNaruFlag(false); ins.After_NaruNaranai_ButtonPushed( shogibanGui2 , btnKoma_Selected ); }; // // [クリアー]ボタンのイベント。 // ins.delegate_BtnClear = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; Util_Lua_Csharp.ShogiGui = shogibanGui2; Util_Lua_Csharp.Perform("click_clearButton"); }; // // [再生]ボタンのイベント。 // ins.delegate_BtnPlay = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; Util_Lua_Csharp.ShogiGui = shogibanGui2; Util_Lua_Csharp.Perform("click_playButton"); }; // // [コマ送り]ボタンのイベント。 // ins.delegate_BtnForward = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp mainGui3 = (MainGui_Csharp)obj_shogiGui2; string restText = Util_Function_Csharp.ReadLine_FromTextbox(); Util_Functions_Server.Komaokuri_Srv( ref restText, mainGui3.Link_Server.Model_Taikyoku, mainGui3.Model_Manual); Util_Function_Csharp.Komaokuri_Gui(restText, mainGui3); Util_Menace.Menace(mainGui3);// メナス }; // // [巻き戻し]ボタンのイベント。 // ins.delegate_BtnBackward = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; Finger movedKoma; Finger foodKoma;//取られた駒 string fugoJStr; if (!Util_Functions_Server.Makimodosi_Srv(out movedKoma, out foodKoma, out fugoJStr, shogibanGui2.Link_Server.Model_Taikyoku)) { goto gt_EndBlock; } Util_Function_Csharp.Makimodosi_Gui(shogibanGui2, movedKoma, foodKoma, fugoJStr, Util_Function_Csharp.ReadLine_FromTextbox()); Util_Menace.Menace(shogibanGui2);//メナス gt_EndBlock: ; }; // // [ログ出せ]ボタンのイベント。 // ins.delegate_BtnLogdase = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; shogibanGui2.Logdase(); }; // // [壁置く]ボタンのイベント。 // ins.delegate_BtnKabeOku = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; UserWidget widget = shogibanGui2.GetWidget("BtnKabeOku"); // [壁置く]←→[駒動かす]切替 switch (widget.Text) { case "壁置く": widget.Text = "駒動かす"; break; default: widget.Text = "壁置く"; break; } shogibanGui2.RepaintRequest.SetFlag_RefreshRequest(); }; // // [出力切替]ボタンのイベント。 // ins.delegate_BtnSyuturyokuKirikae = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; switch (shogibanGui2.SyuturyokuKirikae) { case SyuturyokuKirikae.Japanese: shogibanGui2.SetSyuturyokuKirikae(SyuturyokuKirikae.Sfen); break; case SyuturyokuKirikae.Sfen: shogibanGui2.SetSyuturyokuKirikae(SyuturyokuKirikae.Html); break; case SyuturyokuKirikae.Html: shogibanGui2.SetSyuturyokuKirikae(SyuturyokuKirikae.Japanese); break; } shogibanGui2.RepaintRequest.SyuturyokuRequest = RepaintRequestGedanTxt.Kifu; }; // // [各種符号]ボタンのイベント。 // ins.delegate_BtnKakusyuFugo = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; UserWidget userWidget = (UserWidget)userWidget2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; UserWidget widget = shogibanGui2.GetWidget(userWidget.Name); shogibanGui2.RepaintRequest.SetNyuryokuTextTail(widget.Fugo); }; // // [全消]ボタンのイベント。 // ins.delegate_BtnZenkesi = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; shogibanGui2.RepaintRequest.NyuryokuText = ""; }; // // [ここから採譜]ボタンのイベント。 // ins.delegate_BtnKokokaraSaifu = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; UtilKifuTree282.SetStartpos_KokokaraSaifu(shogibanGui2.Link_Server.Model_Taikyoku.Kifu, shogibanGui2.Link_Server.Model_Taikyoku.Kifu.CurNode.Value.KyokumenConst.KaisiPside); shogibanGui2.RepaintRequest.SyuturyokuRequest = RepaintRequestGedanTxt.Kifu; }; // // [初期配置]ボタンのイベント。 // ins.delegate_BtnSyokihaichi = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp shogibanGui2 = (MainGui_Csharp)obj_shogiGui2; Util_Function_Csharp.Perform_SyokiHaichi(shogibanGui2); }; // // [向き]ボタンのイベント。 // ins.delegate_BtnMuki = ( object obj_shogiGui2 , object userWidget2 // UerWidget , object btnKoma_Selected2 ) => { Shape_BtnKoma btnKoma_Selected = (Shape_BtnKoma)btnKoma_Selected2; MainGui_Csharp mainGui3 = (MainGui_Csharp)obj_shogiGui2; Shape_BtnKoma movedKoma = mainGui3.Shape_PnlTaikyoku.Btn_MovedKoma(); RO_Star koma; Finger figKoma = Fingers.Error_1; if (null != movedKoma) { //>>>>> 移動直後の駒があるとき koma = Util_Starlightable.AsKoma(mainGui3.Model_Manual.GuiSkyConst.StarlightIndexOf(movedKoma.Finger).Now); figKoma = movedKoma.Finger; } else if (null != btnKoma_Selected) { //>>>>> 選択されている駒があるとき koma = Util_Starlightable.AsKoma(mainGui3.Model_Manual.GuiSkyConst.StarlightIndexOf(btnKoma_Selected.Koma).Now); figKoma = btnKoma_Selected.Koma; } else { koma = null; } if (null != koma) { KifuNode modifyNode = new KifuNodeImpl( mainGui3.Link_Server.Model_Taikyoku.Kifu.CurNode.Key,//現在の局面を流用 new KyokumenWrapper( SkyConst.NewInstance_OverwriteOrAdd_Light( mainGui3.Model_Manual.GuiSkyConst, -1,//そのまま figKoma, new RO_Starlight( new RO_Star( Conv_Playerside.Reverse(koma.Pside),//向きを逆さにします。 koma.Masu, koma.Komasyurui ) ) ) ) ); // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ここで局面データを変更します。 // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ string jsaFugoStr; Util_Functions_Server.SetCurNode_Srv( mainGui3.Link_Server.Model_Taikyoku, mainGui3.Model_Manual, modifyNode, out jsaFugoStr); mainGui3.RepaintRequest.SetFlag_RefreshRequest(); } }; } return(Event_CsharpImpl.instance); }
/// <summary> /// 指し手一覧を、リストボックスに表示します。 /// </summary> /// <param name="uc_Main"></param> public static void ShowMoveList( LearningData learningData, Uc_Main uc_Main ) { // // まず、リストを空っぽにします。 // uc_Main.LstMove.Items.Clear(); Playerside firstPside = Playerside.P1; KifuTree kifu1 = new KifuTreeImpl( new KifuNodeImpl( Util_Sky258A.RootMove, new KyokumenWrapper(SkyConst.NewInstance( Util_SkyWriter.New_Hirate(firstPside), 0 //初期局面は 0手済み。 )) //日本の符号読取時 ) ); //kifu1.AssertPside(kifu1.CurNode, "ShowMoveList",logTag); List <CsaKifuMove> moveList = learningData.CsaKifu.MoveList; foreach (CsaKifuMove csaMove in moveList) { // 開始局面 SkyConst kaisi_Sky = kifu1.CurNode.Value.KyokumenConst; // // csaMove を データ指し手 に変換するには? // IMove nextMove; { Playerside pside = UtilCsaMove.ToPside(csaMove); // 元位置 SyElement srcMasu = UtilCsaMove.ToSrcMasu(csaMove); Finger figSrcKoma; if (Masu_Honshogi.IsErrorBasho(srcMasu))// 駒台の "00" かも。 { //駒台の駒。 PieceType utuKomasyurui = Util_Komasyurui14.NarazuCaseHandle(UtilCsaMove.ToKomasyurui(csaMove));// 打つ駒の種類。 Okiba komadai; switch (pside) { case Playerside.P1: komadai = Okiba.Sente_Komadai; break; case Playerside.P2: komadai = Okiba.Gote_Komadai; break; default: komadai = Okiba.Empty; break; } figSrcKoma = Util_Sky_FingersQuery.InOkibaPsideKomasyuruiNow(kaisi_Sky, komadai, pside, utuKomasyurui).ToFirst(); } else { // 盤上の駒。 figSrcKoma = Util_Sky_FingerQuery.InMasuNow(kaisi_Sky, pside, srcMasu); } RO_Star srcKoma = Util_Starlightable.AsKoma(kaisi_Sky.StarlightIndexOf(figSrcKoma).Now); // 先位置 SyElement dstMasu = UtilCsaMove.ToDstMasu(csaMove); Finger figFoodKoma = Util_Sky_FingerQuery.InShogibanMasuNow(kaisi_Sky, pside, dstMasu); PieceType foodKomasyurui; if (figFoodKoma == Fingers.Error_1) { // 駒のない枡 foodKomasyurui = PieceType.None;//取った駒無し。 } else { // 駒のある枡 foodKomasyurui = Util_Starlightable.AsKoma(kaisi_Sky.StarlightIndexOf(figFoodKoma).Now).Komasyurui;//取った駒有り。 } IMoveSource dstKoma = new RO_Star( pside, dstMasu, UtilCsaMove.ToKomasyurui(csaMove) ); nextMove = new RO_Starbeam( srcKoma, // 移動元 dstKoma, // 移動先 foodKomasyurui ////取った駒 ); } { //---------------------------------------- // 一手指したい。 //---------------------------------------- // //↓↓一手指し IttesasuResult ittesasuResult; Util_IttesasuRoutine.Before1( new IttesasuArgImpl( kifu1.CurNode.Value, ((KifuNode)kifu1.CurNode).Value.KyokumenConst.KaisiPside, nextMove, kifu1.CurNode.Value.KyokumenConst.Temezumi + 1//1手進める ), out ittesasuResult, //kifu1,//診断用 "Utli_LearningViews#ShowMoveList" ); Debug.Assert(ittesasuResult.Get_SyuryoNode_OrNull != null, "ittesasuResult.Get_SyuryoNode_OrNull がヌル☆?!"); Util_IttesasuRoutine.Before2( ref ittesasuResult ); // //次ノートを追加します。次ノードを、これからのカレントとします。 // //kifu1.AssertChildPside(kifu1.CurNode.Value.ToKyokumenConst.KaisiPside, ittesasuResult.Get_SyuryoNode_OrNull.Value.ToKyokumenConst.KaisiPside); Util_IttesasuRoutine.After3_ChangeCurrent( kifu1, ConvMoveStrSfen.ToMoveStrSfen(ittesasuResult.Get_SyuryoNode_OrNull.Key),// nextMoveStr, ittesasuResult.Get_SyuryoNode_OrNull ); // これで、棋譜ツリーに、構造変更があったはず。 //↑↑一手指し } string sfen; if (kifu1.CurNode.IsRoot()) { sfen = UtilCsaMove.ToSfen(csaMove, null); } else { sfen = UtilCsaMove.ToSfen(csaMove, kifu1.CurNode.GetParentNode().Value.KyokumenConst); } HonpuMoveListItemImpl listItem = new HonpuMoveListItemImpl(csaMove, sfen); uc_Main.LstMove.Items.Add(listItem); } //---------------------------------------- // ソート //---------------------------------------- //List<MoveListItemImpl> list = new List<MoveListItemImpl>(); //list.Sort((MoveListItemImpl a, MoveListItemImpl b) => //{ // return a - b; //}); }
/// <summary> /// ************************************************************************************************************************ /// 駒ボタンの描画はここに書きます。 /// ************************************************************************************************************************ /// </summary> /// <param name="g1"></param> public void Paint(Graphics g1, MainGui_Csharp mainGui) { if (!this.Visible) { goto gt_EndMethod; } //---------- // 背景 //---------- if (mainGui.FigTumandeiruKoma == this.Finger) //>>>>> 駒をつまんでいる時 { g1.FillRectangle(Brushes.Brown, this.Bounds); // 駒の背景は茶色。 } else if (mainGui.Shape_PnlTaikyoku.MovedKoma == this.Finger) //>>>>> 駒を移動した時 { g1.FillRectangle(Brushes.DarkKhaki, this.Bounds); // 駒の背景はカーキ。 } else if (this.Light) //>>>>> マウスカーソルが当たっている時 { } // この駒について。 RO_Star koma = Util_Starlightable.AsKoma(mainGui.Model_Manual.GuiSkyConst.StarlightIndexOf(this.Finger).Now); if (true) { //---------- // 駒画像 //---------- StringBuilder sb = new StringBuilder(); sb.Append(Path.Combine(mainGui.EngineConf.DataDirectory, "img/koma/")); sb.Append(Conv_Komasyurui.ToStr_ImageName(koma.Komasyurui)); sb.Append(".png"); Image img = Image.FromFile(sb.ToString()); if (koma.Pside == Playerside.P2) { // 画像を180度回転させたい☆ img.RotateFlip(RotateFlipType.Rotate180FlipNone); } else { } g1.DrawImage(img, this.Bounds); } else { /* * //---------- * // 配役画像 * //---------- * StringBuilder sb = new StringBuilder(); * sb.Append(Path.Combine(mainGui.EngineConf.DataDirectory, "img/mobility/")); * sb.Append((int)koma.Haiyaku);//配役番号 * sb.Append(".png"); * Image img = Image.FromFile(sb.ToString()); * * if (koma.Pside == Playerside.P2) * { * // 画像を180度回転させたい☆ * img.RotateFlip(RotateFlipType.Rotate180FlipNone); * } * else * { * } * * g1.DrawImage(img, this.Bounds); */ } /* * // 枠線 * if(false) * { * Pen pen; * if (this.Light) * { * pen = Pens.Yellow; * } * else * { * pen = Pens.Black; * } * * g1.DrawRectangle(pen, this.Bounds); * } */ /* * // 文字 * if(false) * { * if (koma.Pside == Playerside.P1) * { * //---------- * // 先手 * //---------- * // * // ただ描画するだけ☆ * // * * this.PaintText(g1, koma, this.Bounds.Location); * } * else * { * //---------- * // 後手 * //---------- * // * // 180度回転させて描画するために、大掛かりになっています。 * // * * //string moji = siteiSk.KomaDoors[this.KomaHandle].Text_Label; * * //---------- * // 使用するフォント * //---------- * //Font fnt = new Font(FontFamily.GenericSerif, 20.0f); * * //---------- * // 文字の大きさにあった白紙(b) * //---------- * Graphics bG; * Bitmap bImg; * { * int w; * int h; * { * //---------- * // 文字の大きさを調べるための白紙(a) * //---------- * Bitmap aImg = new Bitmap(1, 1); * * //imgのGraphicsオブジェクトを取得 * Graphics aG = Graphics.FromImage(aImg); * * //文字列を描画したときの大きさを計算する * w = 48; * h = 48; * //w = (int)aG.MeasureString(moji, fnt).Width; * //h = (int)fnt.GetHeight(aG); * * //if (w == 0 || h == 0) * //{ * // Logger.Trace($"moji=[{moji}]"); * //} * * //if (w < 1) * //{ * // w = 1; * //} * * //if (h < 1) * //{ * // h = 1; * //} * * aG.Dispose(); * aImg.Dispose(); * } * * bImg = new Bitmap(w, h); * } * * // 文字描画 * bG = Graphics.FromImage(bImg); * * this.PaintText(bG, koma, new Point(0, 0)); //bG.DrawString(moji, fnt, Brushes.Black, 0, 0); * * //---------- * // 回転軸座標 * //---------- * float x = (float)this.Bounds.X + (float)this.Bounds.Width / 2; * float y = (float)this.Bounds.Y + (float)this.Bounds.Height / 2; * * //---------- * // 回転 * //---------- * * // 180度で回転するための座標を計算 * //ラジアン単位に変換 * float d = 180.0f / (180.0f / (float)Math.PI); * //新しい座標位置を計算する * float x1 = x + bImg.Width * (float)Math.Cos(d); * float y1 = y + bImg.Width * (float)Math.Sin(d); * float x2 = x - bImg.Height * (float)Math.Sin(d); * float y2 = y + bImg.Height * (float)Math.Cos(d); * //PointF配列を作成 * PointF[] destinationPoints = {new PointF(x + (float)this.Bounds.Width / 2, y + (float)this.Bounds.Height / 2), * new PointF(x1 + (float)this.Bounds.Width / 2, y1 + (float)this.Bounds.Height / 2), * new PointF(x2 + (float)this.Bounds.Width / 2, y2 + (float)this.Bounds.Height / 2)}; * * //画像を描画 * g1.DrawImage(bImg, destinationPoints); * * //リソースを解放する * bImg.Dispose(); * bG.Dispose(); * //fnt.Dispose(); * } * } */ //// フィンガー番号 //if (false) //{ // g1.DrawString(this.Finger.ToString(), new Font(FontFamily.GenericSerif, 10.0f), Brushes.Black, this.Bounds.Location); //} ////---------- //// デバッグ用 ////---------- //if (true) //{ // string moji = siteiSk.KomaDoors[this.Handle].SrcOkiba.ToString(); // g1.DrawString(moji, new Font(FontFamily.GenericSerif, 12.0f), Brushes.Red, this.Bounds.Location); //} gt_EndMethod: ; }