/// <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); }
public static bool SetSsssMotMks_AndHasMotigoma(MotigomaSyurui val) { ssss_mot_mks_ = val; ssss_mot_mg_ = Med_Koma.MotiKomasyuruiAndTaikyokusyaToMotiKoma(val, kifu_teban); if (gky_ky.motigomaItiran.yomiMotigomaItiran.HasMotigoma(ssss_mot_mg_)) { // 持ち駒を持っているときだけセットするぜ☆(^~^) ssss_mot_km_ = Med_Koma.MotiKomasyuruiAndTaikyokusyaToKoma(ssss_mot_mks_, kifu_teban); ssss_mot_ks_ = Med_Koma.MotiKomasyuruiToKomasyrui(ssss_mot_mks_); return(true); } return(false); }
/// <summary> /// 改造Fen用の文字列を返すぜ☆(^▽^) /// </summary> /// <param name="ks"></param> /// <returns></returns> public static void AppendFenTo(FenSyurui f, MotigomaSyurui mks, StringBuilder syuturyoku) { switch (f) { case FenSyurui.sfe_n: syuturyoku.Append(Conv_MotigomaSyurui.m_sfen_[(int)mks]); break; case FenSyurui.dfe_n: syuturyoku.Append(Conv_MotigomaSyurui.m_dfen_[(int)mks]); break; default: throw new Exception(string.Format("未定義 {0}", f)); } }
/// <summary> /// 将棋盤を180度ひっくり返すぜ☆(^▽^) /// 主にテスト用だぜ☆(^▽^) /// /// 参考:「ビットの並びを反転する」http://blog.livedoor.jp/techblog1/archives/5365383.html /// </summary> public static void Hanten() { // 盤上 { // 左右反転して、先後も入替 Bitboard tmp_T1 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBB_KomaZenbu(Taikyokusya.T1); Bitboard tmp_T2 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBB_KomaZenbu(Taikyokusya.T2); tmp_T1.Bitflip128(); tmp_T2.Bitflip128(); PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_KomaZenbu(Taikyokusya.T1, tmp_T1); PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_KomaZenbu(Taikyokusya.T2, tmp_T2); for (int iKs = 0; iKs < Conv_Komasyurui.itiran.Length; iKs++) { Komasyurui ks = Conv_Komasyurui.itiran[iKs]; Piece km1 = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, Taikyokusya.T1); tmp_T1 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBb_Koma(km1); tmp_T1.Bitflip128(); PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_Koma(km1, tmp_T1); Piece km2 = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, Taikyokusya.T2); tmp_T2 = PureMemory.gky_ky.shogiban.ibashoBan_yk00.CloneBb_Koma(km2); tmp_T2.Bitflip128(); PureMemory.gky_ky.shogiban.ibashoBan_yk00.Set_Koma(km2, tmp_T2); } // 盤面反転、駒の先後も反転だぜ☆(^▽^) } // 持ち駒 { MotigomaItiran tmp = new MotigomaItiran(); foreach (Motigoma mk in Conv_Motigoma.itiran) { MotigomaSyurui mks = Med_Koma.MotiKomaToMotiKomasyrui(mk); Taikyokusya tai = Med_Koma.MotiKomaToTaikyokusya(mk); Motigoma hantenMotikoma = Med_Koma.MotiKomasyuruiAndTaikyokusyaToMotiKoma(mks, Conv_Taikyokusya.Hanten(tai)); tmp.Set(mk, PureMemory.gky_ky.motigomaItiran.yomiMotigomaItiran.Count(hantenMotikoma)); } PureMemory.gky_ky.motigomaItiran.Set(tmp); } }
/// <summary> /// 改造FEN符号表記 /// </summary> /// <returns></returns> public static void AppendFenTo(FenSyurui f, Move ss, StringBuilder syuturyoku) { if (Move.Toryo == ss) { syuturyoku.Append(Itiran_FenParser.GetToryo(f)); return; } int v = (int)ss;//バリュー(ビットフィールド) // 打った駒の種類(取り出すのは難しいので関数を使う☆) MotigomaSyurui mksUtta = AbstractConvMove.GetUttaKomasyurui(ss); if (MotigomaSyurui.Yososu != mksUtta)//指定があれば { // 打でした。 // (自)筋・(自)段は書かずに、「P*」といった表記で埋めます。 SpkMotiKomasyurui.AppendFenTo(f, mksUtta, syuturyoku); syuturyoku.Append("*"); } else { //------------------------------------------------------------ // (自)筋 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(PureSettei.banYokoHaba + 1 - AbstractConvMove.GetSrcSuji_WithoutErrorCheck(v)); } break; case FenSyurui.dfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(AbstractConvMove.GetSrcSuji_WithoutErrorCheck(v))); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } //------------------------------------------------------------ // (自)段 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(AbstractConvMove.GetSrcDan_WithoutErrorCheck(v))); } break; case FenSyurui.dfe_n: { syuturyoku.Append(AbstractConvMove.GetSrcDan_WithoutErrorCheck(v).ToString()); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } } //------------------------------------------------------------ // (至)筋 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(PureSettei.banYokoHaba + 1 - AbstractConvMove.GetDstSuji_WithoutErrorCheck(v)); } break; case FenSyurui.dfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(AbstractConvMove.GetDstSuji_WithoutErrorCheck(v))); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } //------------------------------------------------------------ // (至)段 //------------------------------------------------------------ //Option_Application.Optionlist.USI switch (f) { case FenSyurui.sfe_n: { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(AbstractConvMove.GetDstDan_WithoutErrorCheck(v))); } break; case FenSyurui.dfe_n: { syuturyoku.Append(AbstractConvMove.GetDstDan_WithoutErrorCheck(v).ToString()); } break; default: throw new Exception(string.Format("未定義 {0}", f)); } //------------------------------------------------------------ // 成 //------------------------------------------------------------ int natta; { // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト natta = (v & (int)MoveMask.NATTA) >> (int)MoveShift.NATTA; } if (1 == natta) { syuturyoku.Append("+"); } }
public static bool CanDoMove(Move ss, out MoveMatigaiRiyu reason) { if (Move.Toryo == ss) { reason = MoveMatigaiRiyu.Karappo; return(true); } // 投了はOKだぜ☆(^~^) // 打つ駒調べ MotigomaSyurui mksUtta = AbstractConvMove.GetUttaKomasyurui(ss);// 打った駒の種類 bool utta = MotigomaSyurui.Yososu != mksUtta; if (utta) { // 「打」の場合、持ち駒チェック☆ if (!PureMemory.gky_ky.yomiKy.yomiMotigomaItiran.HasMotigoma(Med_Koma.MotiKomasyuruiAndTaikyokusyaToMotiKoma(mksUtta, PureMemory.kifu_teban))) { // 持駒が無いのに打とうとしたぜ☆(>_<) reason = MoveMatigaiRiyu.NaiMotiKomaUti; return(false); } } // 移動先、打つ先 調べ☆ Masu ms_dst = AbstractConvMove.GetDstMasu_WithoutErrorCheck((int)ss); // 移動先升 if (!Conv_Masu.IsBanjo(ms_dst)) { // 盤外に移動しようとしたぜ☆(^~^) reason = MoveMatigaiRiyu.BangaiIdo; return(false); } Piece km_dst = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma(ms_dst); Taikyokusya tai_dstKm = Med_Koma.KomaToTaikyokusya(km_dst); if (km_dst != Piece.Kuhaku && PureMemory.kifu_teban == tai_dstKm) { // 自分の駒を取ろうとするのは、イリーガル・ムーブだぜ☆(^▽^) reason = MoveMatigaiRiyu.TebanKomaNoTokoroheIdo; return(false); } else if (utta && km_dst != Piece.Kuhaku) { // 駒があるところに打ち込んではいけないぜ☆(^▽^) reason = MoveMatigaiRiyu.KomaGaAruTokoroheUti; return(false); } // 移動元調べ☆ Piece km_src; if (utta) { // 「打」のときは ここ。 km_src = Med_Koma.MotiKomasyuruiAndTaikyokusyaToKoma(mksUtta, PureMemory.kifu_teban); } else { Masu ms_src = AbstractConvMove.GetSrcMasu_WithoutErrorCheck((int)ss); // 移動先升 km_src = PureMemory.gky_ky.yomiKy.yomiShogiban.yomiIbashoBan.GetBanjoKoma(ms_src); Taikyokusya tai_srcKm = Med_Koma.KomaToTaikyokusya(km_src); if (km_src == Piece.Kuhaku) { // 空き升に駒があると思って動かそうとするのは、イリーガル・ムーブだぜ☆(^▽^) reason = MoveMatigaiRiyu.KuhakuWoIdo; return(false); } else if (tai_srcKm != PureMemory.kifu_teban) { // 相手の駒を動かそうとするのは、イリーガル・ムーブだぜ☆(^▽^) reason = MoveMatigaiRiyu.AiteNoKomaIdo; return(false); } // 移動方向調べ if (!BitboardsOmatome.KomanoUgokikataYk00.IsIntersect( km_src, ms_src, //この2つのマスが交わっているか ms_dst //この2つのマスが交わっているか )) { // その駒の種類からは、ありえない動きをしたぜ☆(^▽^) //#if DEBUG // throw new Exception($"その駒の種類からは、ありえない動きをしたぜ☆(^▽^) ms1=[{ ms_src }] ms2=[{ ms_dst }]"); //#else reason = MoveMatigaiRiyu.SonoKomasyuruiKarahaArienaiUgoki; return(false); //#endif } } // 成り調べ if (AbstractConvMove.IsNatta(ss))//成りを指示した場合 { switch (PureSettei.gameRule) { case GameRule.DobutuShogi: { if (Med_Koma.KomaToKomasyurui(km_src) != Komasyurui.H) { // ひよこ以外が、にわとりになろうとしました☆ reason = MoveMatigaiRiyu.NarenaiNari; return(false); } } break; case GameRule.HonShogi: { switch (Med_Koma.KomaToKomasyurui(km_src)) { case Komasyurui.H: case Komasyurui.K: case Komasyurui.N: case Komasyurui.S: case Komasyurui.U: case Komasyurui.Z: // セーフ break; case Komasyurui.I: case Komasyurui.PH: case Komasyurui.PK: case Komasyurui.PN: case Komasyurui.PS: case Komasyurui.PU: case Komasyurui.PZ: case Komasyurui.R: case Komasyurui.Yososu: //FIXME: default: { // 成れる駒以外が、成ろうとしました☆ reason = MoveMatigaiRiyu.NarenaiNari; return(false); } } } break; } } reason = MoveMatigaiRiyu.Karappo; return(true); }
public static bool IsOk(MotigomaSyurui mks) { return(MotigomaSyurui.Z <= mks && mks < MotigomaSyurui.Yososu); }
public static string GetHyojiName(MotigomaSyurui mks) { return(m_hyojiName_[(int)mks]); }
public static Piece MotiKomasyuruiAndTaikyokusyaToKoma(MotigomaSyurui mks, Taikyokusya tb) { return(Med_Koma.m_MotiKomasyuruiAndTaikyokusyaToKoma_[(int)mks, (int)tb]); }
public static Motigoma MotiKomasyuruiAndTaikyokusyaToMotiKoma(MotigomaSyurui mks, Taikyokusya tai) { return(m_MotiKomasyuruiAndTaikyokusyaToMotiKoma_[(int)mks, (int)tai]); }
public static Komasyurui MotiKomasyuruiToKomasyrui(MotigomaSyurui mks) { return(Med_Koma.m_MotiKomasyuruiToKomasyurui_[(int)mks]); }