/// <summary> /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような) /// /// TODO: 打ち歩詰めチェック /// /// </summary> /// <param name="src_Sky"></param> /// <param name="fingers"></param> /// <returns></returns> public static List_OneAndMulti <Finger, SySet <SyElement> > Get_PotentialMove_Motikoma( SkyConst src_Sky, Fingers fingers, SySet <SyElement> okenaiMasus ) { // 「どの持ち駒を」「どこに置いたとき」「どこに利きがある」のコレクション。 List_OneAndMulti <Finger, SySet <SyElement> > resultOmm = new List_OneAndMulti <Finger, SySet <SyElement> >(); foreach (Finger donoKoma in fingers.Items) { // ポテンシャル・ムーブを調べます。 RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(donoKoma).Now); PieceType syurui = Haiyaku184Array.Syurui(koma.Haiyaku); // 置ける升 SySet <SyElement> okeruMasus = Util_Sky.KomaKidou_Potential(donoKoma, src_Sky); // 置けない升を引きます。 okeruMasus = okeruMasus.Minus_Closed(okenaiMasus); if (syurui == PieceType.P) { // 二歩チェック int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); Fingers sujiKomas = Util_Sky.Fingers_InSuji(src_Sky, suji); Starlight fu = src_Sky.StarlightIndexOf(donoKoma); Fingers existFu = Util_Sky.Matches(fu, src_Sky, sujiKomas); if (0 < existFu.Count) { // 二歩だ☆! goto gt_Next; } // TODO:打ち歩詰めチェック } if (!okeruMasus.IsEmptySet()) { // 空でないなら resultOmm.AddNew(donoKoma, okeruMasus); } gt_Next: ; } return(resultOmm); }
/// <summary> /// v(^▽^)v超能力『メナス』だぜ☆ 未来の脅威を予測し、可視化するぜ☆www /// </summary> public static void Menace(NarabeRoomViewModel shogiGui) { if (0 < shogiGui.GameViewModel.GuiTesumi) { // 処理の順序が悪く、初回はうまく判定できない。 SkyConst src_Sky = shogiGui.GameViewModel.GuiSkyConst; //---------- // 将棋盤上の駒 //---------- shogiGui.ResponseData.ToRedraw(); // [クリアー] shogiGui.Shape_PnlTaikyoku.Shogiban.ClearHMasu_KikiKomaList(); // 全駒 foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if ( Okiba.ShogiBan == Util_Masu.Masu_ToOkiba(koma.Masu) && shogiGui.GameViewModel.GuiPside != koma.Pside ) { // 駒の利き SySet <SyElement> kikiZukei = Util_Sky.KomaKidou_Potential(figKoma, src_Sky); IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements; foreach (SyElement masu in kikiMasuList) { // その枡に利いている駒のハンドルを追加 if (Masu_Honshogi.Error != masu) { shogiGui.Shape_PnlTaikyoku.Shogiban.HMasu_KikiKomaList[Util_Masu.AsMasuNumber(masu)].Add((int)figKoma); } } } } } }
/// <summary> /// 指定した駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような) /// </summary> /// <param name="src_Sky"></param> /// <param name="fingers"></param> /// <returns></returns> public static Maps_OneAndOne <Finger, SySet <SyElement> > Get_PotentialMoves_Ikusa( SkyConst src_Sky, Fingers fingers ) { Maps_OneAndOne <Finger, SySet <SyElement> > kiki_fMs = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧 foreach (Finger finger in fingers.Items) { // ポテンシャル・ムーブを調べます。 SySet <SyElement> move = Util_Sky.KomaKidou_Potential(finger, src_Sky);//←ポテンシャル・ムーブ取得関数を選択。歩とか。 if (!move.IsEmptySet()) { // 移動可能升があるなら Util_KomabetuMasus.AddOverwrite(kiki_fMs, finger, move); } } return(kiki_fMs); }
public static void Check_MouseoverKomaKiki(object obj_shogiGui, Finger finger) { NarabeRoomViewModel shogiGui = (NarabeRoomViewModel)obj_shogiGui; Starlight light = shogiGui.GameViewModel.GuiSkyConst.StarlightIndexOf(finger); shogiGui.Shape_PnlTaikyoku.Shogiban.KikiBan = new SySet_Default <SyElement>("利き盤");// .Clear(); // 駒の利き SySet <SyElement> kikiZukei = Util_Sky.KomaKidou_Potential(finger, shogiGui.GameViewModel.GuiSkyConst); //kikiZukei.DebugWrite("駒の利きLv1"); // 味方の駒 Node <ShootingStarlightable, KyokumenWrapper> siteiNode = KifuNarabe_KifuWrapper.CurNode(shogiGui.GameViewModel.Kifu); SySet <SyElement> mikataZukei = Util_Sky.Masus_Now(siteiNode.Value.ToKyokumenConst, Util_InServer.CurPside(shogiGui)); //mikataZukei.DebugWrite("味方の駒"); // 駒の利き上に駒がないか。 SySet <SyElement> ban2 = kikiZukei.Minus_Closed(mikataZukei); //kikiZukei.DebugWrite("駒の利きLv2"); shogiGui.Shape_PnlTaikyoku.Shogiban.KikiBan = ban2; }
/// <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 = 50.0d; SkyConst src_Sky = args.Node.Value.ToKyokumenConst; // // 「紐が付いていない駒の少なさ」による加点。 // // 自分の駒について、味方の駒の利きが被っていれば+1(貫通) // 敵の駒の利きが被っていれば-1(貫通) // // 敵の駒について、味方の駒の利きが被っていれば+1(貫通) // 敵の駒の利きが被っていれば-1(貫通) // // // 駒のない升は無視し、 // 駒のあるマスに、その駒の味方のコマが効いていれば +1 // 駒のあるマスに、その駒の相手のコマが効いていれば -1 // foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒 { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (Okiba.ShogiBan != Util_Masu.Masu_ToOkiba(koma.Masu)) { goto gt_Next1; } // 将棋盤上のみ。 // 駒の利き SySet <SyElement> kikiZukei = Util_Sky.KomaKidou_Potential(figKoma, src_Sky); IEnumerable <SyElement> kikiMasuList = kikiZukei.Elements; // 通し double toosi = kikiMasuList.Count(); // 係数 switch (koma.Syurui) { case PieceType.P: toosi *= this.Keisu_Fu; break; case PieceType.L: toosi *= this.Keisu_Kyo; break; case PieceType.N: toosi *= this.Keisu_Kei; break; case PieceType.S: toosi *= this.Keisu_Gin; break; case PieceType.G: toosi *= this.Keisu_Kin; break; case PieceType.K: toosi *= this.Keisu_Oh; break; case PieceType.R: toosi *= this.Keisu_Hisya; break; case PieceType.B: toosi *= this.Keisu_Kaku; break; case PieceType.PR: toosi *= this.Keisu_Ryu; break; case PieceType.PB: toosi *= this.Keisu_Uma; break; case PieceType.PP: toosi *= this.Keisu_Tokin; break; case PieceType.PL: toosi *= this.Keisu_NariKyo; break; case PieceType.PN: toosi *= this.Keisu_NariKei; break; case PieceType.PS: toosi *= this.Keisu_NariGin; break; default: break; } if (args.PlayerInfo.Playerside == koma.Pside) { // 味方の駒 score += toosi; } else { // 敵の駒 score -= toosi; } gt_Next1: ; } string meisai = ""; #if DEBUG // 明細 { StringBuilder sb = new StringBuilder(); sb.Append("略"); meisai = sb.ToString(); } #endif kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai); }