/// <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); }
public void AddKoma(Basho masu, RO_Star_Koma koma)// Ks14 komaSyurui { if (Util_MasuNum.OnShogiban((int)masu.MasuNumber)) { this.ban81.Add(masu, koma); } else if (Util_MasuNum.OnSenteKomadai((int)masu.MasuNumber)) { if (this.motiBlack.ContainsKey(koma.Syurui)) { this.motiBlack[koma.Syurui] = this.motiBlack[koma.Syurui]; } else { this.motiBlack.Add(koma.Syurui, 0); } } else if (Util_MasuNum.OnGoteKomadai((int)masu.MasuNumber)) { if (this.motiWhite.ContainsKey(koma.Syurui)) { this.motiWhite[koma.Syurui] = this.motiWhite[koma.Syurui]; } else { this.motiWhite.Add(koma.Syurui, 0); } } }
/// <summary> /// 指定した持ち駒全てについて、基本的な駒の動きを返します。(金は「前、ななめ前、横、下に進める」のような) /// /// TODO: 打ち歩詰めチェック /// /// </summary> /// <param name="src_Sky"></param> /// <param name="fingers"></param> /// <returns></returns> public static List_OneAndMulti <Finger, SySet <SyElement> > Get_PotentialMove_Motikoma( SkyConst src_Sky, Fingers fingers, SySet <SyElement> okenaiMasus ) { // 「どの持ち駒を」「どこに置いたとき」「どこに利きがある」のコレクション。 List_OneAndMulti <Finger, SySet <SyElement> > resultOmm = new List_OneAndMulti <Finger, SySet <SyElement> >(); foreach (Finger donoKoma in fingers.Items) { // ポテンシャル・ムーブを調べます。 RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(donoKoma).Now); PieceType syurui = Haiyaku184Array.Syurui(koma.Haiyaku); // 置ける升 SySet <SyElement> okeruMasus = Util_Sky.KomaKidou_Potential(donoKoma, src_Sky); // 置けない升を引きます。 okeruMasus = okeruMasus.Minus_Closed(okenaiMasus); if (syurui == PieceType.P) { // 二歩チェック int suji; Util_MasuNum.MasuToSuji(koma.Masu, out suji); Fingers sujiKomas = Util_Sky.Fingers_InSuji(src_Sky, suji); Starlight fu = src_Sky.StarlightIndexOf(donoKoma); Fingers existFu = Util_Sky.Matches(fu, src_Sky, sujiKomas); if (0 < existFu.Count) { // 二歩だ☆! goto gt_Next; } // TODO:打ち歩詰めチェック } if (!okeruMasus.IsEmptySet()) { // 空でないなら resultOmm.AddNew(donoKoma, okeruMasus); } gt_Next: ; } return(resultOmm); }
/// <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)); }
private void ToBanObject201(SkyConst src_Sky) { this.psideIsBlack = src_Sky.PsideIsBlack;// TODO: //Util_Sky.Assert_Honshogi(src_Sky); // 将棋の駒40個の場所を確認します。 foreach (Finger finger in src_Sky.Fingers_All().Items) { Starlightable light = src_Sky.StarlightIndexOf(finger).Now; RO_Star_Koma komaKs = Util_Koma.AsKoma(light); Debug.Assert(Util_MasuNum.OnAll(Util_Masu.AsMasuNumber(komaKs.Masu)), "(int)koma.Masu=[" + Util_Masu.AsMasuNumber(komaKs.Masu) + "]");//升番号 this.AddKoma(komaKs.Masu, new RO_Star_Koma(komaKs) ); } }
/// <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> 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> /// <param name="syurui"></param> /// <param name="masu_shogiban">0~80</param> /// <returns></returns> public static Kh185 ToHaiyaku(PieceType syurui, SyElement masu_shogiban, Playerside pside) { Kh185 result; int masuHandle = Util_Masu.AsMasuNumber(Util_Masu.BothSenteView(masu_shogiban, pside)); if (Util_MasuNum.OnShogiban(masuHandle)) { result = Data_HaiyakuTransition.Map[syurui][(int)masuHandle]; } else if (Util_MasuNum.OnKomadai(masuHandle)) { switch (syurui) { case PieceType.P: result = Kh185.n164_歩打; break; case PieceType.L: result = Kh185.n165_香打; break; case PieceType.N: result = Kh185.n166_桂打; break; case PieceType.S: result = Kh185.n167_銀打; break; case PieceType.G: result = Kh185.n168_金打; break; case PieceType.K: result = Kh185.n169_王打; break; case PieceType.R: result = Kh185.n170_飛打; break; case PieceType.B: result = Kh185.n171_角打; break; case PieceType.PR: result = Kh185.n170_飛打; break; case PieceType.PB: result = Kh185.n171_角打; break; case PieceType.PP: result = Kh185.n164_歩打; break; case PieceType.PL: result = Kh185.n165_香打; break; case PieceType.PN: result = Kh185.n166_桂打; break; case PieceType.PS: result = Kh185.n167_銀打; break; default: result = Kh185.n000_未設定; break; } } else if (Util_MasuNum.OnKomabukuro(masuHandle)) { switch (syurui) { case PieceType.P: result = Kh185.n172_駒袋歩; break; case PieceType.L: result = Kh185.n173_駒袋香; break; case PieceType.N: result = Kh185.n174_駒袋桂; break; case PieceType.S: result = Kh185.n175_駒袋銀; break; case PieceType.G: result = Kh185.n176_駒袋金; break; case PieceType.K: result = Kh185.n177_駒袋王; break; case PieceType.R: result = Kh185.n178_駒袋飛; break; case PieceType.B: result = Kh185.n179_駒袋角; break; case PieceType.PR: result = Kh185.n180_駒袋竜; break; case PieceType.PB: result = Kh185.n181_駒袋馬; break; case PieceType.PP: result = Kh185.n182_駒袋と金; break; case PieceType.PL: result = Kh185.n183_駒袋杏; break; case PieceType.PN: result = Kh185.n184_駒袋圭; break; case PieceType.PS: result = Kh185.n185_駒袋全; break; default: result = Kh185.n000_未設定; break; } } else { result = Kh185.n000_未設定; } return(result); }
private void AddKoma(SyElement masu, RO_Star_Koma koma)// Ks14 komaSyurui { Debug.Assert(!this.BanObject201.ContainsKey(Util_Masu.AsMasuNumber(masu)), "既に駒がある枡に、駒を置こうとしています。[" + Util_Masu.AsMasuNumber(masu) + "]"); this.BanObject201.Add(Util_Masu.AsMasuNumber(masu), koma); if (Util_MasuNum.OnShogiban(Util_Masu.AsMasuNumber(masu))) { // 盤上 // 特にカウントはなし } else if (Util_MasuNum.OnSenteKomadai(Util_Masu.AsMasuNumber(masu))) { // 先手駒台 switch (koma.Syurui) { case PieceType.P: this.moti1P++; break; case PieceType.L: this.moti1L++; break; case PieceType.N: this.moti1N++; break; case PieceType.S: this.moti1S++; break; case PieceType.G: this.moti1G++; break; case PieceType.K: this.moti1K++; break; case PieceType.R: this.moti1R++; break; case PieceType.B: this.moti1B++; break; } } else if (Util_MasuNum.OnGoteKomadai(Util_Masu.AsMasuNumber(masu))) { // 後手駒台 switch (koma.Syurui) { case PieceType.P: this.moti2p++; break; case PieceType.L: this.moti2l++; break; case PieceType.N: this.moti2n++; break; case PieceType.S: this.moti2s++; break; case PieceType.G: this.moti2g++; break; case PieceType.K: this.moti2k++; break; case PieceType.R: this.moti2r++; break; case PieceType.B: this.moti2b++; break; } } else { // 駒袋 switch (koma.Syurui) { case PieceType.P: this.fukuroP++; break; case PieceType.L: this.fukuroL++; break; case PieceType.N: this.fukuroN++; break; case PieceType.S: this.fukuroS++; break; case PieceType.G: this.fukuroG++; break; case PieceType.K: this.fukuroK++; break; case PieceType.R: this.fukuroR++; break; case PieceType.B: this.fukuroB++; break; } } }
/// <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> 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> /// 符号1「7g7f」を元に、move を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ExecuteSfenMoves_FromTextSub( bool isHonshogi, string str1, //123456789 か、 PLNSGKRB string str2, //abcdefghi か、 * string str3, //123456789 string str4, //abcdefghi string strNari, //+ out ShootingStarlightable move, KifuTree kifu, string hint, int tesumi_yomiGenTeban//読み進めている現在の手目済 ) { move = Util_Sky.NullObjectMove; SkyConst src_Sky = kifu.NodeAt(tesumi_yomiGenTeban).Value.ToKyokumenConst; Debug.Assert(!Util_MasuNum.OnKomabukuro(Util_Masu.AsMasuNumber(((RO_Star_Koma)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), "[" + tesumi_yomiGenTeban + "]手目、駒が駒袋にあった。"); try { PieceType uttaSyurui; // 打った駒の種類 int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI; int srcDan = Util_Koma.CTRL_NOTHING_PROPERTY_DAN; if ("*" == str2) { //>>>>>>>>>> 「打」でした。 Converter04.SfenUttaSyurui(str1, out uttaSyurui); } else { //>>>>>>>>>> 指しました。 uttaSyurui = PieceType.None;//打った駒はない☆ //------------------------------ // 1 //------------------------------ if (!int.TryParse(str1, out srcSuji)) { } //------------------------------ // 2 //------------------------------ srcDan = Converter04.Alphabet_ToInt(str2); } //------------------------------ // 3 //------------------------------ int suji; if (!int.TryParse(str3, out suji)) { } //------------------------------ // 4 //------------------------------ int dan; dan = Converter04.Alphabet_ToInt(str4); Finger koma; if ("*" == str2) { //>>>>> 「打」でした。 Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.CurNode; // 駒台から、打った種類の駒を取得 koma = Util_Sky.FingerNow_BySyuruiIgnoreCase( siteiNode.Value.ToKyokumenConst, Converter04.Pside_ToKomadai(kifu.CountPside(kifu.CurNode)),//Okiba.Sente_Komadai,//FIXME: uttaSyurui); if (Fingers.Error_1 == koma) { throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。"); } //// FIXME: 打のとき、srcSuji、srcDan が Int.Min } else { //>>>>> 打ではないとき koma = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan) ).ToFirst(); if (Fingers.Error_1 == koma) { // // エラーの理由: // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど // var sky2 = Util_Sky.Json_1Sky(src_Sky, "エラー駒になったとき", $"{hint}_SF解3", tesumi_yomiGenTeban); throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗: 将棋盤から [{srcSuji}]筋、[{srcDan}]段 にある駒を掴もうとしましたが、駒がありませんでした。 isHonshogi=[{isHonshogi}] str1=[{str1}] str2=[{str2}] str3=[{str3}] str4=[{str4}] strNari=[{strNari}] hint=[{hint}] tesumi_yomiGenTeban=[{tesumi_yomiGenTeban}] 局面=sfen {Util_SfenStartposWriter.CreateSfenstring(new StartposExporter(src_Sky), true)} {sky2}"); } } PieceType dstSyurui; PieceType srcSyurui; Okiba srcOkiba; SyElement srcMasu; if ("*" == str2) { //>>>>> 打った駒の場合 dstSyurui = uttaSyurui; srcSyurui = uttaSyurui; switch (kifu.CountPside(kifu.CurNode)) { case Playerside.P2: srcOkiba = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba = Okiba.Sente_Komadai; break; default: srcOkiba = Okiba.Empty; break; } int lastTesumi = kifu.CountTesumi(kifu.CurNode); Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.NodeAt(lastTesumi); Finger srcKoma = Util_Sky.FingerNow_BySyuruiIgnoreCase(siteiNode.Value.ToKyokumenConst, srcOkiba, srcSyurui); RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now); srcMasu = dstKoma.Masu; } else { //>>>>> 盤上の駒を指した場合 RO_Star_Koma dstKoma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma).Now); dstSyurui = Haiyaku184Array.Syurui(dstKoma.Haiyaku); srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。 srcOkiba = Okiba.ShogiBan; srcMasu = Util_Masu.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan); } //------------------------------ // 5 //------------------------------ if ("+" == strNari) { // 成りました dstSyurui = KomaSyurui14Array.NariCaseHandle[(int)dstSyurui]; } //------------------------------ // 結果 //------------------------------ // 棋譜 move = new RO_ShootingStarlight( //koma,//TODO: new RO_Star_Koma( kifu.CountPside(kifu.CurNode), srcMasu,//FIXME:升ハンドルにしたい srcSyurui ), new RO_Star_Koma( kifu.CountPside(kifu.CurNode), Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい dstSyurui ), PieceType.None//符号からは、取った駒は分からない ); } catch (Exception ex) { //>>>>> エラーが起こりました。 // どうにもできないので 経路と情報を付け足して 更に外側に投げます。 throw new Exception($"{ex.GetType().Name}:{ex.Message} in TuginoItte_Sfen.GetData_FromTextSub(A) str1=「{str1}」 str2=「{str2}」 str3=「{str3}」 str4=「{str4}」 strNari=「{strNari}」 "); } }
/// <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()); }