/// <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> /// ************************************************************************************************************************ /// 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> /// 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> /// 評価値を返します。先手が有利ならプラス、後手が有利ならマイナス、互角は 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 }