/// <summary> /// 距離の近さ /// </summary> /// <returns></returns> public static int GetKyori(SyElement mokuhyo, SyElement genzai) { // // とりあえず おおざっぱに計算します。 // int mokuhyoDan; Util_MasuNum.MasuToDan(mokuhyo, out mokuhyoDan); int mokuhyoSuji; Util_MasuNum.MasuToSuji(mokuhyo, out mokuhyoSuji); int genzaiDan; Util_MasuNum.MasuToDan(genzai, out genzaiDan); int genzaiSuji; Util_MasuNum.MasuToSuji(genzai, out genzaiSuji); int kyori = Math.Abs(mokuhyoDan - genzaiDan) + Math.Abs(mokuhyoSuji - genzaiSuji); return(kyori); }
/// <summary> /// ************************************************************************************************************************ /// 相手陣に入っていれば真。 /// ************************************************************************************************************************ /// /// 後手は 7,8,9 段。 /// 先手は 1,2,3 段。 /// </summary> /// <returns></returns> public static bool InAitejin(SyElement masu, Playerside pside) { int dan; Util_MasuNum.MasuToDan(masu, out dan); return((Playerside.P2 == pside && 7 <= dan) || (Playerside.P1 == pside && dan <= 3)); }
/// <summary> /// ************************************************************************************************************************ /// 1マス上、のように指定して、マスを取得します。 /// ************************************************************************************************************************ /// </summary> /// <param name="offsetSuji"></param> /// <param name="offsetDan"></param> /// <returns></returns> public static SyElement Offset(Okiba okiba, SyElement masu, int offsetSuji, int offsetDan) { int suji; int dan; Util_MasuNum.MasuToSuji(masu, out suji); Util_MasuNum.MasuToDan(masu, out dan); return(Util_Masu.OkibaSujiDanToMasu( okiba, suji + offsetSuji, dan + offsetDan )); }
/// <summary> /// ************************************************************************************************************************ /// 棋譜用の符号テキスト(*1)を作ります。 /// ************************************************************************************************************************ /// /// *1…「▲5五銀上」など。 /// /// “同”表記に「置き換えない」バージョンです。 /// /// </summary> /// <param name="move"></param> /// <param name="previousKomaP"></param> /// <returns></returns> public string ToText_NoUseDou( RO_ShootingStarlight move ) { StringBuilder sb = new StringBuilder(); RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); sb.Append(Converter04.Pside_ToStr(koma.Pside)); //------------------------------ // “同”に変換せず、“筋・段”をそのまま出します。 //------------------------------ int suji; int dan; Util_MasuNum.MasuToSuji(koma.Masu, out suji); Util_MasuNum.MasuToDan(koma.Masu, out dan); sb.Append(ConverterKnSh.Int_ToArabiaSuji(suji)); sb.Append(ConverterKnSh.Int_ToKanSuji(dan)); //------------------------------ // “歩”とか。“全”ではなく“成銀” <符号用> //------------------------------ sb.Append(KomaSyurui14Array.Fugo[(int)this.Syurui]); //------------------------------ // “右”とか //------------------------------ sb.Append(Converter04.MigiHidari_ToStr(this.MigiHidari)); //------------------------------ // “寄”とか //------------------------------ sb.Append(Converter04.AgaruHiku_ToStr(this.AgaruHiku)); //------------------------------ // “成”とか //------------------------------ sb.Append(Converter04.Nari_ToStr(this.Nari)); //------------------------------ // “打”とか //------------------------------ sb.Append(Converter04.Bool_ToDa(this.DaHyoji)); return(sb.ToString()); }
/// <summary> /// 「2八」といった表記にして返します。 /// </summary> /// <param name="masu"></param> /// <returns></returns> public static string Masu_ToKanji(SyElement masu) { StringBuilder sb = new StringBuilder(); int suji; int dan; Util_MasuNum.MasuToSuji(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masu)], out suji); Util_MasuNum.MasuToDan(Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masu)], out dan); sb.Append(ConverterKnSh.Int_ToArabiaSuji(suji)); sb.Append(ConverterKnSh.Int_ToKanSuji(dan)); return(sb.ToString()); }
/// <summary> /// ************************************************************************************************************************ /// 1マス上、のように指定して、マスを取得します。 /// ************************************************************************************************************************ /// </summary> /// <param name="offsetSuji"></param> /// <param name="offsetDan"></param> /// <returns></returns> public static SyElement Offset(Okiba okiba, SyElement masu, Playerside pside, Hogaku muki) { int offsetSuji; int offsetDan; Util_Muki.MukiToOffsetSujiDan(muki, pside, out offsetSuji, out offsetDan); int suji; int dan; Util_MasuNum.MasuToSuji(masu, out suji); Util_MasuNum.MasuToDan(masu, out dan); return(Util_Masu.OkibaSujiDanToMasu( okiba, suji + offsetSuji, dan + offsetDan)); }
/// <summary> /// ************************************************************************************************************************ /// 棋譜用の符号テキスト(*1)を作ります。 /// ************************************************************************************************************************ /// /// *1…「▲5五銀上」など。 /// /// </summary> /// <param name="douExpr">“同”表記に置き換えるなら真。</param> /// <param name="previousKomaP"></param> /// <returns></returns> public string ToText_UseDou( Node <ShootingStarlightable, KyokumenWrapper> siteiNode ) { StringBuilder sb = new StringBuilder(); ShootingStarlightable curMove = siteiNode.Key; ShootingStarlightable preMove = siteiNode.PreviousNode.Key; RO_Star_Koma curSrcKoma = Util_Koma.AsKoma(curMove.LongTimeAgo); RO_Star_Koma curDstKoma = Util_Koma.AsKoma(curMove.Now); RO_Star_Koma preSrcKoma = Util_Koma.AsKoma(preMove.LongTimeAgo); RO_Star_Koma preDstKoma = Util_Koma.AsKoma(preMove.Now); sb.Append(Converter04.Pside_ToStr(curDstKoma.Pside)); //------------------------------ // “同”で表記できるところは、“同”で表記します。それ以外は“筋・段”で表記します。 //------------------------------ if ( null != preMove && Util_Masu.MatchSujiDan(Util_Masu.AsMasuNumber(preDstKoma.Masu), Util_Masu.AsMasuNumber(curDstKoma.Masu)) ) { // “同” sb.Append("同"); } else { // “筋・段” int suji; int dan; Util_MasuNum.MasuToSuji(curDstKoma.Masu, out suji); Util_MasuNum.MasuToDan(curDstKoma.Masu, out dan); sb.Append(ConverterKnSh.Int_ToArabiaSuji(suji)); sb.Append(ConverterKnSh.Int_ToKanSuji(dan)); } //------------------------------ // “歩”とか。“全”ではなく“成銀” <符号用> //------------------------------ sb.Append(KomaSyurui14Array.Fugo[(int)this.Syurui]); //------------------------------ // “右”とか //------------------------------ sb.Append(Converter04.MigiHidari_ToStr(this.MigiHidari)); //------------------------------ // “寄”とか //------------------------------ sb.Append(Converter04.AgaruHiku_ToStr(this.AgaruHiku)); //------------------------------ // “成”とか //------------------------------ sb.Append(Converter04.Nari_ToStr(this.Nari)); //------------------------------ // “打”とか //------------------------------ sb.Append(Converter04.Bool_ToDa(this.DaHyoji)); return(sb.ToString()); }
/// <summary> /// 「成り」ができるなら真。 /// </summary> /// <returns></returns> private static bool IsPromotionable( out bool isPromotionable, RO_Star_Koma srcKoma, RO_Star_Koma dstKoma ) { bool successful = true; isPromotionable = false; if (Okiba.ShogiBan != Util_Masu.Masu_ToOkiba(srcKoma.Masu)) { successful = false; goto gt_EndMethod; } if (KomaSyurui14Array.IsNari(srcKoma.Syurui)) { // 既に成っている駒は、「成り」の指し手を追加すると重複エラーになります。 // 成りになれない、で正常終了します。 goto gt_EndMethod; } int srcDan; if (!Util_MasuNum.MasuToDan(srcKoma.Masu, out srcDan)) { throw new Exception("段に変換失敗"); } int dstDan; if (!Util_MasuNum.MasuToDan(dstKoma.Masu, out dstDan)) { throw new Exception("段に変換失敗"); } // 先手か、後手かで大きく処理を分けます。 switch (dstKoma.Pside) { case Playerside.P1: { if (srcDan <= 3) { // 3段目から上にあった駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } if (dstDan <= 3) { // 3段目から上に駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } } break; case Playerside.P2: { if (7 <= srcDan) { // 7段目から下にあった駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } if (7 <= dstDan) { // 7段目から下に駒が移動したのなら、成りの資格ありです。 isPromotionable = true; goto gt_EndMethod; } } break; default: throw new Exception("未定義のプレイヤーサイドです。"); } gt_EndMethod: ; return(successful); }
/// <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 = 0.0d; SkyConst src_Sky = args.Node.Value.ToKyokumenConst; // // 自玉 // RO_Star_Koma jiGyoku = null; foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒 { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (koma.Pside == args.PlayerInfo.Playerside && koma.Syurui == PieceType.K) { jiGyoku = koma; break; } } if (null == jiGyoku) { goto gt_EndMethod; } int jiGyoku_Suji; Util_MasuNum.MasuToSuji(jiGyoku.Masu, out jiGyoku_Suji); int jiGyoku_Dan; Util_MasuNum.MasuToDan(jiGyoku.Masu, out jiGyoku_Dan); int[] sujis = new int[25]; int[] dans = new int[25]; { // // 25近傍。12の位置に、視点の中心となる駒があるとします。 // // -2 -1 0 +1 +2 // ┌─┬─┬─┬─┬─┐ //-2│ 0│ 1│ 2│ 3│ 4│ // ├─┼─┼─┼─┼─┤ //-1│ 5│ 6│ 7│ 8│ 9│ // ├─┼─┼─┼─┼─┤ // 0│10│11│12│13│14│ // ├─┼─┼─┼─┼─┤ //+1│15│16│17│18│19│ // ├─┼─┼─┼─┼─┤ //+2│20│21│22│23│24│ // └─┴─┴─┴─┴─┘ // int index = 0; for (int dDan = -2; dDan < 3; dDan++) { for (int dSuji = -2; dSuji < 3; dSuji++) { sujis[index] = jiGyoku_Suji + dSuji; dans[index] = jiGyoku_Dan + dDan; index++; } } } // 25近傍に、得点の重みを付けます。 double aa = 0.0d; double bb = 100.0d; double cc = 100.0d / 3.0d; double dd = 100.0d / 3.0d / 3.0d; double ee = 100.0d / 3.0d / 3.0d / 3.0d; double ff = 100.0d / 3.0d / 3.0d / 3.0d / 3.0d; double[] omomi = new double[] { ff, ee, dd, ee, ff, ee, cc, bb, cc, ee, dd, bb, aa, bb, dd, ee, cc, bb, cc, ee, ff, ee, dd, ee, ff, }; // 25近傍のマス番号を取得しておきます。該当がなければ Masu_Honshogi.Error。 Dictionary <SyElement, double> masuOmomi = new Dictionary <SyElement, double>(); { for (int index = 0; index < 25; index++) { SyElement masu = Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, sujis[index], dans[index]); if (masu != Masu_Honshogi.Error) { masuOmomi.Add(masu, omomi[index]); } } } // // 味方の金、銀について。 // int countKanagoma = 0; // カナゴマ foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly) // 全駒 { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (koma.Pside == args.PlayerInfo.Playerside && koma.Syurui == PieceType.S && koma.Syurui == PieceType.G ) { if (masuOmomi.ContainsKey(koma.Masu)) { score += masuOmomi[koma.Masu]; countKanagoma++; if (3 <= countKanagoma) { break; } } } } gt_EndMethod: string meisai = ""; #if DEBUG // 明細の作成 { StringBuilder sb = new StringBuilder(); sb.Append("略"); meisai = sb.ToString(); } #endif kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai); }
/// <summary> /// 筋も残し、全件網羅 /// </summary> /// <returns></returns> public static string LogString_Concrete( SySet <SyElement> masus ) { StringBuilder sb = new StringBuilder(); if (masus is SySet_Default <SyElement> ) { // まず自分の要素 foreach (SyElement hMasu1 in ((SySet_Default <SyElement>)masus).Elements_) { int suji; int dan; Util_MasuNum.MasuToSuji(hMasu1, out suji); Util_MasuNum.MasuToDan(hMasu1, out dan); sb.Append("[" + suji.ToString() + dan.ToString() + "]"); } // 次に親集合 foreach (SySet <SyElement> superset in ((SySet_Default <SyElement>)masus).Supersets) { sb.Append(Util_Masus <SyElement> .LogString_Concrete(superset)); } } else if (masus is SySet_Ordered <SyElement> ) { // まず自分の要素 foreach (SyElement hMasu1 in ((SySet_Ordered <SyElement>)masus).Elements_) { int suji; int dan; Util_MasuNum.MasuToSuji(hMasu1, out suji); Util_MasuNum.MasuToDan(hMasu1, out dan); sb.Append("[" + suji.ToString() + dan.ToString() + "]"); } // 次に親集合 foreach (SySet <SyElement> superset in ((SySet_Ordered <SyElement>)masus).Supersets) { sb.Append(Util_Masus <SyElement> .LogString_Concrete(superset)); } } else if (masus is SySet_DirectedSegment <SyElement> ) { sb.Append("["); foreach (T1 hMasu1 in ((SySet_DirectedSegment <SyElement>)masus).Elements) { int suji; int dan; Util_MasuNum.MasuToSuji(hMasu1, out suji); Util_MasuNum.MasuToDan(hMasu1, out dan); sb.Append( suji.ToString() + dan.ToString() + "→"); } // 最後の矢印は削除します。 if ("[".Length < sb.Length) { sb.Remove(sb.Length - 1, 1); } sb.Append("]"); } else { } return(sb.ToString()); }
/// <summary> /// 重複をなくした表現 /// </summary> /// <returns></returns> public static string LogString_Set( SySet <SyElement> masus ) { StringBuilder sb = new StringBuilder(); if (masus is SySet_Default <SyElement> ) { HashSet <T1> set = new HashSet <T1>(); // まず自分の要素 foreach (T1 hMasu1 in ((SySet_Default <SyElement>)masus).Elements_) { set.Add(hMasu1); } // 次に親集合 foreach (SySet <T1> superset in ((SySet_Default <SyElement>)masus).Supersets) { foreach (T1 hMasu2 in superset.Elements) { set.Add(hMasu2); } } T1[] array = set.ToArray(); Array.Sort(array); int fieldCount = 0; foreach (T1 masuHandle in array) { sb.Append("["); sb.Append(masuHandle); sb.Append("]"); fieldCount++; if (fieldCount % 20 == 19) { sb.AppendLine(); } } } else if (masus is SySet_Ordered <SyElement> ) { // まず自分の要素 foreach (T1 hMasu1 in ((SySet_Ordered <SyElement>)masus).Elements_) { int suji; int dan; Util_MasuNum.MasuToSuji(hMasu1, out suji); Util_MasuNum.MasuToDan(hMasu1, out dan); sb.Append("[" + suji.ToString() + dan.ToString() + "]"); } // 次に親集合 foreach (SySet <SyElement> superset in ((SySet_Ordered <SyElement>)masus).Supersets) { sb.Append(Util_Masus <Basho> .LogString_Concrete(superset)); } } else if (masus is SySet_DirectedSegment <SyElement> ) { sb.Append("["); foreach (T1 hMasu1 in ((SySet_DirectedSegment <SyElement>)masus).Elements) { int suji; int dan; Util_MasuNum.MasuToSuji(hMasu1, out suji); Util_MasuNum.MasuToDan(hMasu1, out dan); sb.Append( suji.ToString() + dan.ToString() + "→"); } // 最後の矢印は削除します。 if ("[".Length < sb.Length) { sb.Remove(sb.Length - 1, 1); } sb.Append("]"); } else { } return(sb.ToString()); }