/// <summary> /// この左上 /// </summary> /// <param name="ms"></param> /// <param name="tb"></param> /// <returns></returns> static void TasuKonoHidariue(Piece km, Masu ms) { switch (Med_Koma.KomaToTaikyokusya(km)) { case Taikyokusya.T1: if (!BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_UeHajiDan(ms) && !BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_HidariHajiSuji(ms)) { Masu ms_tmp = ms - PureSettei.banYokoHaba - 1; if (Conv_Masu.IsBanjo(ms_tmp)) { BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp); } } break; case Taikyokusya.T2: if (!BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_SitaHajiDan(ms) && !BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_MigiHajiSuji(ms)) { Masu ms_tmp = ms + PureSettei.banYokoHaba + 1; if (Conv_Masu.IsBanjo(ms_tmp)) { BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp); } } break; default: break; } }
/// <summary> /// 駒を打った指し手☆(^▽^) /// 空き升に打ち込む前提だぜ☆(^~^)! /// </summary> /// <param name="ms_dst"></param> /// <param name="mkUtta"></param> /// <param name="natta"></param> /// <returns></returns> public static Move ToMove01cUtta(Masu ms_dst, MotigomaSyurui mkUtta) { Debug.Assert(MotigomaSyurui.Yososu != mkUtta, ""); // バリュー int v = 0; // 元筋と元段☆(^▽^)「打」のときは何もしないぜ☆(^▽^) // 先筋と先段☆(^▽^) AbstractConvMove.SetDstMasu_WithoutErrorCheck(ref v, ms_dst); //必ず指定されているはず☆ if (MotiKomasyurui.Yososu != mkUtta) { // 変換(列挙型→ビット) // ぞう 0 → 1 // きりん 1 → 2 // ひよこ 2 → 3 // ~中略~ // いのしし 6 → 7 // なし 7 → 0 // 1 足して 8 で割った余り☆ v |= (((int)mkUtta + 1) % Conv_MotigomaSyurui.SETS_LENGTH) << (int)MoveShift.UTTA_KOMASYURUI; } // 打ったときは成れないぜ☆(^▽^) return((Move)v); }
/// <summary> /// 桂馬跳び左 /// </summary> /// <param name="ms"></param> /// <param name="tb"></param> /// <returns></returns> static void TasuKeimatobiHidari(Piece km, Masu ms) { Taikyokusya tai = Med_Koma.KomaToTaikyokusya(km); if (!BitboardsOmatome.YomiBitboardsOmatome.IsIntersect_UsagigaHidariniToberu(tai, ms)) { switch (tai) { case Taikyokusya.T1: { Masu ms_tmp = ms - 2 * PureSettei.banYokoHaba - 1; if (Conv_Masu.IsBanjo(ms_tmp)) { BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp); } } break; case Taikyokusya.T2: { Masu ms_tmp = ms + 2 * PureSettei.banYokoHaba + 1; if (Conv_Masu.IsBanjo(ms_tmp)) { BitboardsOmatome.KomanoUgokikataYk00.StandupElement(km, ms, ms_tmp); } } break; default: break; } } }
/// <summary> /// 2017-04-19 作成 /// /// パースに失敗してもエラーではない。 /// </summary> /// <param name="line"></param> /// <param name="caret"></param> /// <param name="out_ms"></param> /// <returns></returns> public static bool MatchMasu (string line, ref int caret, out Masu out_ms #if DEBUG , IDebugMojiretu dbg_reigai #endif ) { Match m = Itiran_FenParser.GetMasuPattern(PureSettei.fenSyurui).Match(line, caret); if (m.Success) { // キャレットを進める Util_String.SkipMatch(line, ref caret, m); int suji = LisInt.FenSuji_Int(PureSettei.fenSyurui, m.Groups[1].Value); int dan = LisInt.FenDan_Int(PureSettei.fenSyurui, m.Groups[2].Value); // 升を返す out_ms = Conv_Masu.ToMasu(suji, dan); return(true); } else { // 該当なし(エラーではない) out_ms = Conv_Masu.masu_error; return(false); } }
public static void Setumei_Discovered(Masu ms_removed, StringBuilder hyoji) { Piece[] kmHairetu_control; PureMemory.gky_ky.yomiKy.TryInControl(ms_removed, out kmHairetu_control); Bitboard bb_relative = new Bitboard();//関連のある飛び利き駒 // 飛び利きを計算し直す foreach (Piece km_var in kmHairetu_control) { if (Piece.Yososu == km_var) { break; } // 駒の居場所 Bitboard bb_ibasho = new Bitboard(); PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.ToSet_Koma(km_var, bb_ibasho); Masu ms_ibasho; while (bb_ibasho.Ref_PopNTZ(out ms_ibasho)) { bb_relative.Standup(ms_ibasho); } } Setumei_Bitboard("関連する飛び利き駒", bb_relative, hyoji); }
public static bool IsLegalMove(Koma km, Masu dstMs, Masu attackerMs, Shogiban shogiban) { // KomanoUgokikata komanoUgokikata return(shogiban.GetKomanoUgokikata(km, attackerMs).IsIntersect( // 相手の利き dstMs // 調べる升 )); }
public static bool MatchSrcMs(string line, ref int caret, out Masu out_ms #if DEBUG , IDebugMojiretu hyoji #endif ) { Match m = GetSrcMsPattern(PureSettei.fenSyurui).Match(line, caret); if (m.Success) { // キャレットを進めます Util_String.SkipMatch(line, ref caret, m); string ms_moji = m.Groups[1].Value; int caret2 = 0; return(LisMasu.MatchMasu(ms_moji, ref caret2, out out_ms #if DEBUG , hyoji #endif )); } else { out_ms = Conv_Masu.masu_error; return(false); } }
public static void Setumei_Discovered(Masu ms_removed, Kyokumen.Sindanyo kys, StringBuilder syuturyoku) { kys.TryInControl(ms_removed, out Koma[] kmHairetu_control); Bitboard bb_relative = new Bitboard();//関連のある飛び利き駒 // 飛び利きを計算し直す foreach (Koma km in kmHairetu_control) { if (Koma.PieceNum == km) { break; } // 駒の居場所 Bitboard bb_ibasho = new Bitboard(); kys.ToSetIbasho(km, bb_ibasho); while (bb_ibasho.Ref_PopNTZ(out Masu ms_ibasho)) { bb_relative.Standup(ms_ibasho); } } Setumei_1Bitboard("関連する飛び利き駒", bb_relative, syuturyoku); }
/// <summary> /// 自殺手チェック☆ /// 相手番の利きに入っていたら真顔で真だぜ☆(^▽^) /// </summary> /// <param name="gky"></param> /// <param name="targetMs"></param> /// <returns></returns> public static bool IsJisatusyu(Masu targetMs) { return(PureMemory.gky_ky.yomiKy.yomiShogiban.yomiKikiBan.IsIntersect_KikiZenbu( PureMemory.kifu_aiteban, // 相手の駒の利き☆ targetMs //調べる升 )); }
/// <summary> /// Number Of Trailing Zeros /// 右から見て最初に立っているビットの桁を返す。そのビットは 0 にするぜ☆ /// /// ビットボードが変更されるという目印に Ref_ と関数名の頭に付けたぜ☆(^~^) /// </summary> /// <param name="x">任意の2進数</param> /// <param name="out_result">右から数えた桁。該当しない場合、NTZ_NOT_FOUND</param> /// <returns></returns> public bool Ref_PopNTZ(out Masu out_result) { if (IsEmpty()) { out_result = NTZ_FOUND_ZERO; return(false); } if (0UL < value063) { //ulong bbRight = (this.Value063 & -this.Value063); ulong bbRight = (value063 & (~value063 + 1)); ulong i = (bbRight * 0x03F566ED27179461UL) >> 58; out_result = (Masu)m_ntzTable_[i]; Sitdown(out_result);//(2017-04-22 Add)立っているビットを降ろすぜ☆ return(true); } { //ulong bbRight = (ulong)(this.Value64127 & -this.Value64127); ulong bbRight = (value64127 & (~value64127 + 1)); ulong i = (bbRight * 0x03F566ED27179461UL) >> 58; //out_result = (Masu)m_ntzTable_[i]; // FIXME: 64 足し忘れてないか? out_result = (Masu)m_ntzTable_[i] + MASU64; // FIXME: 64 足し忘れてないか? Sitdown(out_result + MASU64); return(true); } }
/// <summary> /// ナナメ段を抜き出してビットボードにします。 /// </summary> /// <param name="yomiSg"></param> /// <param name="tai"></param> /// <param name="kikiDir"></param> /// <param name="ms"></param> /// <returns></returns> public static Bitboard GetOjhsh( TobikikiDirection kikiDir, Masu ms ) { bool sakasa_forZHs = Conv_TobikikiDirection.sakasa_forZHs[(int)kikiDir]; OjamaBanSyurui ojamaBanSyurui = Conv_TobikikiDirection.ojamaBanSyuruiItiran[(int)kikiDir]; int[] masuSpans = new int[] { MasSpanKT, MasSpanKY, MasSpanKT, MasSpanZHa, MasSpanZHs, }; int masuSpan = masuSpans[(int)kikiDir]; int nanamedanD; Masu atama_reverseRotateChikanhyo; Masu atama_noRotateMotohyo; Masu siri_noRotateMotohyo; int haba; FromMasu(kikiDir, masuSpan, sakasa_forZHs, ms, out nanamedanD, out atama_reverseRotateChikanhyo, out atama_noRotateMotohyo, out siri_noRotateMotohyo, out haba ); #if DEBUG PureMemory.ssssDbg_sakasa_forZHs = sakasa_forZHs; PureMemory.ssssDbg_ojamaBanSyurui = ojamaBanSyurui; PureMemory.ssssDbg_masuSpan = masuSpan; PureMemory.ssssDbg_nanamedanD = nanamedanD; PureMemory.ssssDbg_atama_reverseRotateChikanhyo = atama_reverseRotateChikanhyo; PureMemory.ssssDbg_atama_noRotateMotohyo = atama_noRotateMotohyo; PureMemory.ssssDbg_siri_noRotateMotohyo = siri_noRotateMotohyo; PureMemory.ssssDbg_haba = haba; #endif if (ojamaBanSyurui == OjamaBanSyurui.None) { // 横型と想定 // 本将棋の場合、9一が再下位ビット // [ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8] // [ 9]... Bitboard bb = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.CloneKomaZenbuBothTai(); #if DEBUG PureMemory.ssssDbg_bb_ojamaTai = bb.Clone(); #endif return(OjamaBan.YomiOjamaBan.Nukidasi_1(atama_reverseRotateChikanhyo, haba, bb)); } else { OjamaBan.YomiOjamaBan yomiOjamaBan = PureMemory.gky_ky.yomiKy.yomiShogiban.GetYomiOjamaBan(ojamaBanSyurui); return(yomiOjamaBan.Nukidasi(atama_reverseRotateChikanhyo, haba)); } }
public static string ToSetumei_New(Masu ms) { StringBuilder tmp = new StringBuilder(); AppendSetumei(ms, tmp); return(tmp.ToString()); }
/// <summary> /// 項目番号 K を返すぜ☆(^~^) /// </summary> /// <returns>該当なければ -1</returns> public static int GetKoumokuBango_Banjo(Kyokumen ky, Koma km_jissai, Masu ms_jissai) { return(-1); //// 盤上の駒1 //int iMs_jissai = (int)ms_jissai; //if (Conv_Koma.IsOk(km_jissai)) //{ // // 盤上のパラメーター // // まず、大きく10区画「RZKHNrzkhn」に分かれているので、 // // komaArea = ( 0 ~ 10 ) に分けるぜ☆ // int komaArea; // switch (km_jissai) // { // case Koma.King1: komaArea = 0; break; // area = 0 の場合、 0 以上 1 未満だぜ☆(^~^) // case Koma.Bishop1: komaArea = 1; break; // case Koma.Rook1: komaArea = 2; break; // case Koma.Pawn1: komaArea = 3; break; // case Koma.ProPawn1: komaArea = 4; break; // case Koma.King2: komaArea = 5; break; // case Koma.Bishop2: komaArea = 6; break; // case Koma.Rook2: komaArea = 7; break; // case Koma.Pawn2: komaArea = 8; break; // case Koma.ProPawn2: komaArea = 9; break; // default: throw new Exception("未定義の駒"); // } // // K2 の方も、 K1 と同じように分かれているぜ☆(^▽^) // return komaArea * KyokumenImpl.MASUS + iMs_jissai; //} //return -1; }
/// <summary> /// 下側に自分の陣地がある視点の段番号だぜ☆(^▽^) /// 例:対局者1でも2でも、トライルールは らいおん が1段目に入ったときだぜ☆(^▽^) /// </summary> /// <param name="ms"></param> /// <returns></returns> public static int ToDanO1_JibunSiten(Taikyokusya tb, Masu ms) { if (tb == Taikyokusya.T1) { return(ToDanO1_WithoutErrorCheck((int)ms)); } return(ToDanO1_WithoutErrorCheck(PureSettei.banHeimen - 1 - (int)ms)); }
void OkuKoma(Masu ms, Piece km) { ibashoBan_yk00.N240_OkuKoma(km, ms); ojamaBan_ha45.N240_OkuKoma(RotateChikanhyo.chikanHyo_ha45[(int)ms]); ojamaBan_hs45.N240_OkuKoma(RotateChikanhyo.chikanHyo_hs45[(int)ms]); ojamaBan_ht90.N240_OkuKoma(RotateChikanhyo.chikanHyo_ht90[(int)ms]); }
/// <summary> /// 対人表示用☆(^~^) /// </summary> /// <param name="ms"></param> /// <returns></returns> public static int ToSuji_WithError(Masu ms) { if (Conv_Masu.IsBanjo(ms)) { return(((int)ms) % PureSettei.banYokoHaba + 1); } return(Conv_Masu.ERROR_SUJI); }
/// <summary> /// 対人表示用☆(^~^) /// </summary> /// <param name="ms"></param> /// <returns></returns> public static int ToDan_WithError(Masu ms) { if (Conv_Masu.IsBanjo(ms)) { return(((int)ms) / PureSettei.banYokoHaba + 1); } return(Conv_Masu.ERROR_DAN); }
public Bitboard Nukidasi(Masu atama, int haba) { Bitboard bb = CloneBB(); #if DEBUG PureMemory.ssssDbg_bb_ojamaTai = bb.Clone(); #endif return(Nukidasi_1(atama, haba, bb)); }
private void Update() { if (m_iMovableCount <= 0) { return; } if (true == m_playerPosition?.IsMoving) { return; } Masu.DIR dir = GetMoveDir(); GameObject target_masu_object = m_masuCurrent.GetConnectedMasuObject(dir); if (target_masu_object != null) { Masu temp = target_masu_object.GetComponent <Masu>(); int target_masu_id = temp.masu_id; if (0 < m_iMoveCount) { // 戻る if (target_masu_id == m_iMoveHistory[m_iMoveCount - 1]) { m_iMoveHistory[m_iMoveCount] = 0; m_iMoveCount -= 1; m_iMovableCount += 1; } else { m_iMoveCount += 1; m_iMovableCount -= 1; m_iMoveHistory[m_iMoveCount] = target_masu_id; } } else { m_iMoveCount += 1; m_iMovableCount -= 1; m_iMoveHistory[m_iMoveCount] = target_masu_id; } m_playerData.masu_id = target_masu_id; m_masuCurrent = MasuManager.Instance.GetMasu(m_playerData.masu_id); m_evMovableCount.Invoke(m_iMovableCount); if (m_iMovableCount <= 0) { m_evMovableCount.Invoke(-1); OnMoveEnd.Invoke(); OnMoveEnd = null; } } }
/// <summary> /// 移動元の盤の升から、自分の駒を取るぜ☆(^▽^) /// </summary> /// <returns></returns> public static bool TryFail_SrcOff( Move ss, Masu ms_t0, Piece km_t0, Motigoma mk_t0, Masu ms_t1 // 移動先升 #if DEBUG , FenSyurui f , IDebugMojiretu dbg_reigai #endif ) { //──────────────────────────────────────── // T1 [1] 移動元に 手番の駒 が在る //──────────────────────────────────────── //──────────────────────────────────────── // T1 [遷移] 移動元の 手番の駒 を除外する //──────────────────────────────────────── { // TODO: 駒割りを評価値減らすならここだぜ☆(^~^) // FIXME: ここに問題のコードがあった★★★★★★★★★★★★★★★★★★★ } //DoMove1( isSfen, ss, ssType, ref konoTeme, syuturyoku, out gt_EndMethod); // ローカル変数はグローバル変数に移動した。 { // この下の HerasuBanjoKoma で指し手件数が動くようだ。 // 盤上はこのステップが多い Debug.Assert(Conv_Koma.IsOk(km_t0), "km_t0 can not remove"); if (PureMemory.gky_ky.shogiban.TryFail_TorinozokuKoma( ms_t0, km_t0, ms_t1, // (2017-05-02 22:19 Add)移動先の升(将来駒を置く升)を指定しておくぜ☆(^~^) true #if DEBUG , dbg_reigai #endif )) { return(Pure.FailTrue("TryFail_Torinozoku(2)")); } // 駒が無かった、というキャッシュは取らないぜ☆(^▽^) // この上の HerasuBanjoKoma で指し手件数が動くようだ。 } //──────────────────────────────────────── // T1 [2] 移動元に 手番の駒 が無い //──────────────────────────────────────── return(Pure.SUCCESSFUL_FALSE); }
/// <summary> /// 下側に自分の陣地がある視点の段番号だぜ☆(^▽^) /// 例:対局者1でも2でも、トライルールは らいおん が1段目に入ったときだぜ☆(^▽^) /// </summary> /// <param name="ms"></param> /// <returns></returns> public static int ToDan_JibunSiten(Option <Phase> optionalPhase, Masu ms, Kyokumen.Sindanyo kys) { var phase = optionalPhase.Unwrap(); if (phase == Phase.Black) { return(Conv_Masu.ToDan_WithoutErrorCheck((int)ms)); } return(Conv_Masu.ToDan_WithoutErrorCheck(kys.MASU_YOSOSU - 1 - (int)ms)); }
public Piece GetBanjoKoma(Taikyokusya tai, Masu ms) { Komasyurui ks; if (ExistsKoma(tai, ms, out ks)) { return(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, tai)); } return(Piece.Kuhaku); }
public bool Exists(Taikyokusya tai, Masu ms) { for (int iKm = 0; iKm < Conv_Koma.itiranTai[(int)tai].Length; iKm++) { if (valueKm[(int)Conv_Koma.itiranTai[(int)tai][iKm]].IsOn(ms)) { return(true); } } return(false); }
public void Standup(Masu masu) { if ((int)masu < MASU64) { m_value063_ |= 1UL << (int)masu; } else { m_value64127_ |= 1UL << ((int)masu - MASU64); } }
public void Sitdown(Masu ms)// 立っているビットを降ろすぜ☆ { if ((int)ms < MASU64) { m_value063_ &= ~0UL ^ (1UL << (int)ms); // 全ビット立ってるのが ~0UL } else { m_value64127_ &= ~0UL ^ (1UL << ((int)ms - MASU64));// 全ビット立ってるのが ~0UL } }
public bool IsOff(Masu ms) { if ((int)ms < MASU64) { return(0UL == (value063 & (1UL << (int)ms))); } else { return(0UL == (value64127 & (1UL << ((int)ms - MASU64)))); } }
public bool IsIntersect(Masu ms) { if ((int)ms < MASU64) { return(0UL != (value063 & (1UL << (int)ms))); } else { return(0UL != (value64127 & (1UL << ((int)ms - MASU64)))); } }
public bool Exists(Masu ms) { for (int iTai = 0; iTai < Conv_Taikyokusya.itiran.Length; iTai++) { if (valueTai[iTai].IsOn(ms)) { return(true); } } return(false); }
public static void Setumei_Kiki(Kyokumen ky, Masu attackerMs, StringBuilder syuturyoku) { var(exists, optionalPhase) = ky.Shogiban.ExistsBBKomaZenbu(attackerMs); if (exists) { ky.Shogiban.ExistsBBKoma(optionalPhase, attackerMs, out Komasyurui ks); Util_Information.Setumei_1Bitboard("利き", Util_Application.Kiki_BB(Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase), attackerMs, ky.Shogiban)//利き , syuturyoku); } }
public static void AppendLine_Data_Kyokumen(Kyokumen ky, int dan, StringBuilder syuturyoku) { syuturyoku.Append("│"); for (int iMs_offset = 0; iMs_offset < Option_Application.Optionlist.BanYokoHaba; iMs_offset++) { Masu ms = (Masu)(dan * Option_Application.Optionlist.BanYokoHaba + iMs_offset); Koma km = ky.GetBanjoKoma(ms); Conv_Koma.Setumei(km, syuturyoku); syuturyoku.Append("│"); } syuturyoku.AppendLine(); }
// マスをセットする。 public void set_masu(int number, Masu masu) { dict_number_kara_masu[number] = masu; }