/// <summary> /// 駒を打った指し手☆(^▽^) /// 空き升に打ち込む前提だぜ☆(^~^)! /// </summary> /// <param name="ms_dst"></param> /// <param name="mkUtta"></param> /// <param name="natta"></param> /// <returns></returns> public static Move ToMove01cUtta(Masu ms_dst, MotiKomasyurui mkUtta) { Debug.Assert(MotiKomasyurui.Yososu != mkUtta, ""); // バリュー int v = 0; // 元筋と元段☆(^▽^)「打」のときは何もしないぜ☆(^▽^) // 先筋と先段☆(^▽^) ConvMove.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_MotiKomasyurui.SETS_LENGTH) << (int)MoveShift.UttaKomasyurui; } // 打ったときは成れないぜ☆(^▽^) return((Move)v); }
/// <summary> /// 改造Fen用の文字列を返すぜ☆(^▽^) /// </summary> /// <param name="ks"></param> /// <returns></returns> public static void AppendFenTo(bool isSfen, MotiKomasyurui mks, StringBuilder syuturyoku) { if (isSfen) { syuturyoku.Append(Conv_MotiKomasyurui.m_sfen_[(int)mks]); } else { syuturyoku.Append(Conv_MotiKomasyurui.m_dfen_[(int)mks]); } }
/// <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; }
/// <summary> /// 現局面の盤上、駒台に置いてある駒を 駒の種類別に数え、 /// 片方の対局者の駒台に全部乗れるよう、拡張する。 /// </summary> public static void Tukurinaosi(Kyokumen.Sindanyo kys) { // 盤上 m_banjoKeys_ = new ulong[kys.MASU_YOSOSU, Conv_Koma.Itiran.Length]; for (int iMs = 0; iMs < kys.MASU_YOSOSU; iMs++) { foreach (Komasyurui ks in Conv_Komasyurui.Itiran) { // 対局者1 m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.Black)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); // 対局者2 m_banjoKeys_[iMs, (int)Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, OptionalPhase.White)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); } } // 持ち駒 { m_motiKeys_ = new ulong[Conv_MotiKoma.Itiran.Length][]; int[] counts = kys.CountMotikomaHashSize(); foreach (MotiKoma mk in Conv_MotiKoma.Itiran) { MotiKomasyurui mks = Med_Koma.MotiKomaToMotiKomasyrui(mk); m_motiKeys_[(int)mk] = new ulong[counts[(int)mks]]; for (int iCount = 0; iCount < counts[(int)mks]; iCount++) { m_motiKeys_[(int)mk][iCount] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); } } } // 手番 m_tbTaikyokusya_ = new ulong[Conv_Taikyokusya.AllOptionalPhaseList.Length]; foreach (var optionalPhase78 in Conv_Taikyokusya.AllOptionalPhaseList) { m_tbTaikyokusya_[OptionalPhase.IndexOf(optionalPhase78)] = (ulong)(Option_Application.Random.NextDouble() * ulong.MaxValue); } Dirty = false; }
public static bool IsOk(MotiKomasyurui mks) { return(MotiKomasyurui.Z <= mks && mks < MotiKomasyurui.Yososu); }
public static string GetHyojiName(MotiKomasyurui mks) { return(m_hyojiName_[(int)mks]); }
public static Koma MotiKomasyuruiAndPhaseToKoma(MotiKomasyurui mks, Option <Phase> optionalPhase) { return(Med_Koma.m_MotiKomasyuruiAndPhaseToKoma_[(int)mks, OptionalPhase.IndexOf(optionalPhase)]); }
public static MotiKoma MotiKomasyuruiAndPhaseToMotiKoma(MotiKomasyurui mks, Option <Phase> phase) { return(m_MotiKomasyuruiAndPhaseToMotiKoma_[(int)mks, OptionalPhase.IndexOf(phase)]); }
public static Komasyurui MotiKomasyuruiToKomasyrui(MotiKomasyurui mks) { return(Med_Koma.m_MotiKomasyuruiToKomasyurui_[(int)mks]); }
/// <summary> /// 改造FEN符号表記 /// </summary> /// <returns></returns> public static void AppendFenTo(bool isSfen, Move ss, StringBuilder syuturyoku) { if (Move.Toryo == ss) { syuturyoku.Append(Itiran_FenParser.GetToryo(isSfen)); return; } int v = (int)ss;//バリュー(ビットフィールド) // 打った駒の種類(取り出すのは難しいので関数を使う☆) MotiKomasyurui mksUtta = GetUttaKomasyurui(ss); if (MotiKomasyurui.Yososu != mksUtta)//指定があれば { // 打でした。 // (自)筋・(自)段は書かずに、「P*」といった表記で埋めます。 Conv_MotiKomasyurui.AppendFenTo(isSfen, mksUtta, syuturyoku); syuturyoku.Append("*"); } else { //------------------------------------------------------------ // (自)筋 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetSrcSuji_WithoutErrorCheck(v)); } else { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetSrcSuji_WithoutErrorCheck(v))); } //------------------------------------------------------------ // (自)段 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetSrcDan_WithoutErrorCheck(v))); } else { syuturyoku.Append(GetSrcDan_WithoutErrorCheck(v).ToString()); } } //------------------------------------------------------------ // (至)筋 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Option_Application.Optionlist.BanYokoHaba + 1 - GetDstSuji_WithoutErrorCheck(v)); } else { syuturyoku.Append(Conv_Kihon.ToAlphabetLarge(GetDstSuji_WithoutErrorCheck(v))); } //------------------------------------------------------------ // (至)段 //------------------------------------------------------------ if (Option_Application.Optionlist.USI) { syuturyoku.Append(Conv_Kihon.ToAlphabetSmall(GetDstDan_WithoutErrorCheck(v))); } else { syuturyoku.Append(GetDstDan_WithoutErrorCheck(v).ToString()); } //------------------------------------------------------------ // 成 //------------------------------------------------------------ int natta; { // (v & m) >> s + 1。 v:バリュー、m:マスク、s:シフト natta = (v & (int)MoveMask.Natta) >> (int)MoveShift.Natta; } if (1 == natta) { syuturyoku.Append("+"); } }