/// <summary> /// 一手詰めの局面かどうか調べるぜ☆(^▽^) /// /// 自分が一手詰めを掛けられるから、この指し手は作らないでおこう、といった使い方がされるぜ☆(^▽^) /// /// FIXME: 持ち駒の打ちにも使えないか☆(^~^)? /// </summary> /// <param name="fukasa"></param> /// <param name="ky"></param> /// <param name="jibun"></param> /// <param name="ms_src">持ち駒の場合、エラー値</param> /// <param name="mks">持ち駒の場合、持駒の種類</param> /// <param name="ms_t1"></param> /// <param name="jibunHioute"></param> /// <returns></returns> public static bool Ittedume_MotiKoma(int fukasa, Kyokumen ky, MotiKoma mk, Masu ms_t1, HiouteJoho jibunHioute, HiouteJoho aiteHioute) { if (!Conv_MotiKoma.IsOk(mk)) { throw new Exception("持ち駒じゃないじゃないか☆(^▽^)www"); } // A B C // ┌──┬──┬──┐ //1│ │▽ら│ │ // ├──┼──┼──┤ //2│▲き│ │▲き│ // ├──┼──┼──┤ //3│ │▲に│▲ら│ // ├──┼──┼──┤ //4│▲ぞ│▲ひ│▲ぞ│ // └──┴──┴──┘ // 盤上の駒を動かすのか、駒台の駒を打つのかによって、利き の形が異なるぜ☆(^~^) Bitboard bb_kiki_t1 = ky.Shogiban.GetKomanoUgokikata(Med_Koma.MotiKomaToKoma(mk), ms_t1); if (!ky.Shogiban.GetBBKoma(aiteHioute.KmRaion).IsIntersect( // 相手らいおんの場所☆ bb_kiki_t1)) // 相手らいおん が、動かした駒の、利きの中に居ないんだったら、一手詰め にはならないぜ☆(^~^) { // FIXME: ステイルメイトは考えてないぜ☆(>_<) return(false); } Koma km_t1 = Med_Koma.MotiKomaToKoma(mk);//t0も同じ // FIXME: ↓駒移動後の、利きを取る必要がある Bitboard bb_jibunKikiNew = new Bitboard(); { // 打による、重ね利きの数を差分更新するぜ☆(^▽^) //, ky.BB_KikiZenbu ky.Shogiban.N100_FuyasuKiki(km_t1, ky.Sindan.CloneKomanoUgoki(km_t1, ms_t1), ky.Sindan);// 移動先の駒の利きを増やすぜ☆(^▽^) // こっちの利きを作り直し bb_jibunKikiNew = ky.Shogiban.ToBitboard_KikisuZenbuPositiveNumber(Med_Koma.MotiKomaToPhase(mk), ky.Sindan); // 打による、重ね利きの数の差分更新を元に戻すぜ☆(^▽^) // , ky.BB_KikiZenbu ky.Shogiban.N100_HerasuKiki(km_t1, ky.Sindan.CloneKomanoUgoki(km_t1, ms_t1), ky.Sindan);// 移動先の駒の利きを減らすぜ☆(^▽^) } // 相手らいおんが逃げようとしていて。 return(aiteHioute.FriendRaion8KinboBB.Clone() // 相手らいおんの8近傍 .Sitdown(ky.Shogiban.GetBBKomaZenbu(aiteHioute.CurrentOptionalPhase)) // 相手の駒がない升 .Sitdown(bb_jibunKikiNew) // こっちの利きがない升 .IsEmpty()); // 相手らいおん が逃げれる升がない場合、詰み☆ }
/// <summary> /// 局面に点数を付けるぜ☆(^▽^) /// /// どちらの対局者でも、自分に有利と思っていれば正の数の方向に点数が付くぜ☆(^▽^) /// </summary> /// <param name="ky_base"></param> /// <returns></returns> public void Tukurinaosi(Kyokumen.Sindanyo kys) { Hyokati[] hyokati = new Hyokati[] { Hyokati.Hyokati_Rei, Hyokati.Hyokati_Rei , Hyokati.Hyokati_Rei // 空白は手番なしで ここに入れるぜ☆(^~^) }; // 盤上 Bitboard komaBB = new Bitboard(); for (int iTai = 0; iTai < Conv_Taikyokusya.AllOptionalPhaseList.Length; iTai++) { var optionalPhase = Conv_Taikyokusya.AllOptionalPhaseList[iTai]; for (int iKs = 0; iKs < Conv_Komasyurui.Itiran.Length; iKs++) { Komasyurui ks = Conv_Komasyurui.Itiran[iKs]; kys.ToSetIbasho(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase), komaBB); while (komaBB.Ref_PopNTZ(out Masu ms_jissai)) { hyokati[iTai] += Conv_Koma.BanjoKomaHyokatiNumber[(int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase)]; } } } // 持ち駒 foreach (MotiKoma mk in Conv_MotiKoma.Itiran) { var optionalPhase = Med_Koma.MotiKomaToPhase(mk); var phaseIndex = OptionalPhase.IndexOf(optionalPhase); MotiKomasyurui mks = Med_Koma.MotiKomaToMotiKomasyrui(mk); Hyokati komaHyokati = Conv_Hyokati.KomaHyokati[(int)Med_Koma.MotiKomasyuruiAndPhaseToKoma(mks, optionalPhase)]; hyokati[phaseIndex] += (int)komaHyokati * kys.CountMotikoma(mk); } // 手番 - 相手番 Hyokati hyokatiP1 = hyokati[(int)Phase.Black]; hyokati[(int)Phase.Black] -= hyokati[(int)Phase.White]; hyokati[(int)Phase.White] -= hyokatiP1; KomawariHyokati_Sabun = hyokati; }