public static void AAABAAAA_SplitGroup( out Fingers fingers_seme_IKUSA, //戦駒(利きを調べる側) out Fingers fingers_kurau_IKUSA, //戦駒(喰らう側) out Fingers fingers_seme_MOTI, // 持駒(利きを調べる側) out Fingers fingers_kurau_MOTI, // 持駒(喰らう側) SkyConst src_Sky, Playerside tebanSeme, Playerside tebanKurau ) { // 戦駒 fingers_seme_IKUSA = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.ShogiBan, tebanSeme); fingers_kurau_IKUSA = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.ShogiBan, tebanKurau); // 攻手の持駒 if (tebanSeme == Playerside.P1) { // 攻手が先手番のとき。 fingers_seme_MOTI = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Sente_Komadai, tebanSeme); fingers_kurau_MOTI = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Gote_Komadai, tebanKurau); } else if (tebanSeme == Playerside.P2) { // 攻手が後手番のとき。 fingers_seme_MOTI = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Gote_Komadai, tebanSeme); fingers_kurau_MOTI = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.Sente_Komadai, tebanKurau); } else { throw new Exception("駒台の持ち駒を調べようとしましたが、先手でも、後手でもない指定でした。"); } //#if DEBUG // MessageBox.Show("fingers_seme_MOTI数=[" + fingers_seme_MOTI.Count.ToString() + "]", "デバッグ SplitGroup"); //#endif }
/// <summary> /// 入力欄のテキストを取得します。 /// </summary> /// <returns></returns> public string ReadLine2() { int lastTesumi = Util_InServer.CountCurTesumi2(this.ShogiGui); SkyConst src_Sky = this.ShogiGui.GameViewModel.GuiSkyConst; //------------------------------------------------------------ // 表について //------------------------------------------------------------ // // 配列の添え字は次の通り。 // // 9 8 7 6 5 4 3 2 1 // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│一 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ 9│10│11│12│13│14│15│16│17│二 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │18│19│20│21│22│23│24│25│26│三 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │27│28│29│30│31│32│33│34│35│四 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │36│37│38│39│40│41│42│43│44│五 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │45│46│47│48│49│50│51│52│53│六 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │54│55│56│57│58│59│60│61│62│七 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │63│64│65│66│67│68│69│70│71│八 // ├─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │72│73│74│75│76│77│78│79│80│九 // └─┴─┴─┴─┴─┴─┴─┴─┴─┘ //------------------------------------------------------------ // 先手駒について //------------------------------------------------------------ // 先手駒の位置を表にします。 bool[] wallSTable = new bool[Ui_PnlMain.NSQUARE]; // 先手駒の利きを表にします。 bool[] kikiSTable = new bool[Ui_PnlMain.NSQUARE]; Node <ShootingStarlightable, KyokumenWrapper> siteiNode = this.ShogiGui.GameViewModel.Kifu.NodeAt( this.ShogiGui.GameViewModel.Kifu.CountTesumi(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui)) ); foreach (Finger figKoma in Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, Playerside.P1).Items) { Starlightable light = src_Sky.StarlightIndexOf(figKoma).Now; RO_Star_Koma koma = Util_Koma.AsKoma(light); int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 壁 wallSTable[(dan - 1) * 9 + (9 - suji)] = true; // 利き kikiSTable[(dan - 1) * 9 + (9 - suji)] = true;//FIXME:嘘 } //------------------------------------------------------------ // 後手駒について //------------------------------------------------------------ // 先手駒の位置を表にします。 bool[] wallGTable = new bool[Ui_PnlMain.NSQUARE]; // 先手駒の利きを表にします。 bool[] kikiGTable = new bool[Ui_PnlMain.NSQUARE]; foreach (Finger figKoma in Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, Playerside.P2).Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 壁 wallGTable[(dan - 1) * 9 + (9 - suji)] = true; // 利き kikiGTable[(dan - 1) * 9 + (9 - suji)] = true;//FIXME:嘘 } string tuginoItte = "▲9九王嘘"; Fingers fingers = Util_Sky.Fingers_ByOkibaPsideNow(this.ShogiGui.GameViewModel.GuiSkyConst, Okiba.ShogiBan, this.ShogiGui.GameViewModel.Kifu.CountPside(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui))); if (0 < fingers.Count) { ShootingStarlightable tuginoMoveData; Finger finger = fingers[LarabeRandom.Random.Next(fingers.Count)];//ランダムに1つ。 Starlight sl = src_Sky.StarlightIndexOf(finger); RO_Star_Koma koma = Util_Koma.AsKoma(sl.Now); Playerside pside_getTeban = this.ShogiGui.GameViewModel.Kifu.CountPside(lastTesumi); switch (pside_getTeban) { case Playerside.P2: { // 後手番です。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 前に1つ突き出させます。 tuginoMoveData = new RO_ShootingStarlight( //sl.Finger, new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Util_Masu.GetOkiba(koma.Masu), suji, dan ), koma.Haiyaku ), new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Okiba.ShogiBan, suji, dan + 1 ), koma.Haiyaku ), PieceType.None ); break; } default: { // 先手番です。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); int dan; Util_MasuNum.MasuToDan(koma.Masu, out dan); // 前に1つ突き出させます。 tuginoMoveData = new RO_ShootingStarlight( //sl.Finger, new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Util_Masu.GetOkiba(koma.Masu), suji, dan ), koma.Haiyaku ), new RO_Star_Koma( pside_getTeban, Util_Masu.OkibaSujiDanToMasu( Okiba.ShogiBan, suji, dan - 1 ), koma.Haiyaku ), PieceType.None ); break; } } RO_Star_Koma koma2 = Util_Koma.AsKoma(tuginoMoveData.LongTimeAgo); FugoJ fugoJ = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma2.Haiyaku)](tuginoMoveData, new KyokumenWrapper(src_Sky));//「▲2二角成」なら、馬(dst)ではなくて角(src)。 tuginoItte = fugoJ.ToText_UseDou(KifuNarabe_KifuWrapper.CurNode(this.ShogiGui)); } return(tuginoItte); }
/// <summary> /// 0.0d ~100.0d の範囲で、評価値を返します。数字が大きい方がグッドです。 /// </summary> /// <param name="input_node"></param> /// <param name="playerInfo"></param> /// <returns></returns> public override void Keisan(out KyHyokaItem kyokumenScore, KyHandanArgs args) { double score = 100.0d; StringBuilder sbMeisai = new StringBuilder(); SkyConst src_Sky = args.Node.Value.ToKyokumenConst; // // 各、味方の駒 // Fingers jiFigs = Util_Sky.Fingers_ByOkibaPsideNow(src_Sky, Okiba.ShogiBan, args.PlayerInfo.Playerside); foreach (Finger figKoma in jiFigs.Items) { // 自駒 RO_Star_Koma jiKoma = Util_Koma.FromFinger(src_Sky, figKoma); SyElement aiteMasu; if (args.PlayerInfo.Playerside == Playerside.P1) { aiteMasu = Util_Masu.Offset(Okiba.ShogiBan, jiKoma.Masu, 0, -1); } else { aiteMasu = Util_Masu.Offset(Okiba.ShogiBan, jiKoma.Masu, 0, +1); } Finger aiteKomaFig = Util_Sky.Fingers_AtMasuNow(src_Sky, aiteMasu).ToFirst(); if (Fingers.Error_1 == aiteKomaFig) { goto gt_Next1; } // 相手駒 RO_Star_Koma aiteKoma = Util_Koma.FromFinger(src_Sky, aiteKomaFig); if (aiteKoma.Syurui != PieceType.P) { // 歩じゃなければ無視。「と金」も無視。 goto gt_Next1; } score -= 20.0d; #if DEBUG // 明細 { sbMeisai.Append("-(20.0d)"); } #endif if (score <= 0.0d) { break; } gt_Next1: ; } kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, sbMeisai.ToString()); }