/// <summary> /// 用途例:持ち駒を確認するために使います。 /// </summary> /// <param name="hkomas_gen_MOTI"></param> /// <returns></returns> public static string JsonElements_KomaHandles(bool enableLog, SkyConst src_Sky, List <int> hKomas, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } //sb.AppendLine(" ["); sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); foreach (int hKoma in hKomas) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(hKoma).Now); string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky, hKoma, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(koma.Masu) + " },");//FIXME:おかしい? } sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); //sb.AppendLine(" ],"); gt_EndMethod: return(sb.ToString()); }
public static Dictionary <ShootingStarlightable, KyokumenWrapper> KomabetuMasusToMovebetuSky( List_OneAndMulti <Finger, SySet <SyElement> > sMs, SkyConst src_Sky, Playerside pside) { Dictionary <ShootingStarlightable, KyokumenWrapper> result = new Dictionary <ShootingStarlightable, KyokumenWrapper>(); sMs.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); foreach (SyElement dstMasu in value.Elements) { ShootingStarlightable move = Util_Sky.New( //key, new RO_Star_Koma(pside, koma.Masu, koma.Haiyaku), new RO_Star_Koma(pside, dstMasu, koma.Haiyaku),//FIXME:配役は適当。 PieceType.None ); result.Add(move, new KyokumenWrapper(Util_Sasu.Sasu(src_Sky, key, dstMasu, pside))); } }); return(result); }
/// <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); }
public void Log3( SkyConst src_Sky, Playerside tebanKurau, //手番(喰らう側) Playerside tebanSeme, //手番(利きを調べる側) Fingers fingers_kurau_IKUSA, //戦駒(喰らう側) Fingers fingers_kurau_MOTI, // 持駒(喰らう側) Fingers fingers_seme_IKUSA, //戦駒(利きを調べる側) Fingers fingers_seme_MOTI // 持駒(利きを調べる側) ) { // 攻め手の駒の位置 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove); foreach (Finger finger in fingers_seme_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu2.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } foreach (Finger finger in fingers_seme_MOTI.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); this.BrdMove.KomaMasu3.Add(km); } foreach (Finger finger in fingers_kurau_MOTI.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); this.BrdMove.KomaMasu4.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } this.BrdMove = boardLog_clone; }
public static string MoveToStringForLog(ShootingStarlightable move) { string moveInfo; RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); moveInfo = KomaSyurui14Array.ToIchimoji(Haiyaku184Array.Syurui(koma.Haiyaku)); return(moveInfo); }
/// <summary> /// スプライト→駒 /// </summary> /// <param name="fingers"></param> /// <param name="src_Sky"></param> /// <returns></returns> public static SySet <SyElement> Fingers_ToMasus(Fingers fingers, SkyConst src_Sky) { SySet <SyElement> masus = new SySet_Default <SyElement>("何かの升"); foreach (Finger finger in fingers.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); masus.AddElement(koma.Masu); } return(masus); }
/// <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()); }
private static void Log1( MoveGenGenjo genjo, Node <ShootingStarlightable, KyokumenWrapper> node_yomiCur, GraphicalLog_Board logBrd_move1 ) { logBrd_move1.moveOrNull = ((KifuNode)node_yomiCur).Key; RO_Star_Koma srcKoma = Util_Koma.AsKoma(logBrd_move1.moveOrNull.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(logBrd_move1.moveOrNull.Now); // ログ試し logBrd_move1.Arrow.Add(new Gkl_Arrow(Util_Masu.AsMasuNumber(srcKoma.Masu), Util_Masu.AsMasuNumber(dstKoma.Masu))); genjo.Args.LogF_moveKiki.boards.Add(logBrd_move1); }
/// <summary> /// 変換「自駒が動ける升」→「自駒が動ける手」 /// </summary> /// <param name="kmDic_Self"></param> /// <returns></returns> public static Maps_OneAndMulti <Finger, ShootingStarlightable> KomabetuMasusToKomabetuMove( Maps_OneAndOne <Finger, SySet <SyElement> > kmDic_Self, Node <ShootingStarlightable, KyokumenWrapper> siteiNode_genzai ) { Maps_OneAndMulti <Finger, ShootingStarlightable> komaTe = new Maps_OneAndMulti <Finger, ShootingStarlightable>(); // // kmDic_Self.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { foreach (SyElement masuHandle in value.Elements) { RO_Star_Koma koma = Util_Koma.AsKoma(siteiNode_genzai.Value.ToKyokumenConst.StarlightIndexOf(key).Now); ShootingStarlightable move = new RO_ShootingStarlight( //key, // 元 koma, // 先 new RO_Star_Koma( koma.Pside, Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(masuHandle)], koma.Haiyaku //TODO:成るとか考えたい ), PieceType.None //取った駒不明 ); //sbSfen.Append(sbSfen.ToString()); if (komaTe.ContainsKey(key)) { // すでに登録されている駒 komaTe.AddExists(key, move); } else { // まだ登録されていない駒 komaTe.AddNew(key, move); } } }); return(komaTe); }
public static string MoveToStringForLog(ShootingStarlightable move, Playerside pside_genTeban) { string result; if (null == move) { result = "合法手はありません。"; goto gt_EndMethod; } RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); // 指し手を「△歩」といった形で。 result = KomaSyurui14Array.ToNimoji(Haiyaku184Array.Syurui(koma.Haiyaku), pside_genTeban); gt_EndMethod: return(result); }
/// <summary> /// 変換「各(自駒が動ける升)」→「各(自駒が動ける手)」 /// </summary> /// <param name="komaBETUSusumeruMasus"></param> /// <returns></returns> public static Maps_OneAndMulti <Finger, ShootingStarlightable> KomaBETUSusumeruMasusToKomaBETUAllMoves( List_OneAndMulti <Finger, SySet <SyElement> > komaBETUSusumeruMasus, Node <ShootingStarlightable, KyokumenWrapper> siteiNode_genzai ) { Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMove = new Maps_OneAndMulti <Finger, ShootingStarlightable>(); komaBETUSusumeruMasus.Foreach_Entry((Finger figKoma, SySet <SyElement> susumuMasuSet, ref bool toBreak) => { RO_Star_Koma srcKoma = Util_Koma.AsKoma(siteiNode_genzai.Value.ToKyokumenConst.StarlightIndexOf(figKoma).Now); foreach (SyElement susumuMasu in susumuMasuSet.Elements) { // 移動先の駒 RO_Star_Koma dstKoma = new RO_Star_Koma( srcKoma.Pside, Masu_Honshogi.Items_All[Util_Masu.AsMasuNumber(susumuMasu)], srcKoma.Haiyaku//TODO:ここで、駒の種類が「成り」に上書きされているバージョンも考えたい ); ShootingStarlightable move = new RO_ShootingStarlight( //figKoma,//駒 srcKoma, // 移動元 dstKoma, // 移動先 PieceType.None //取った駒不明 ); komabetuAllMove.AddOverwrite(figKoma, move); // これが通称【水際のいんちきプログラム】なんだぜ☆ // 必要により、【成り】の指し手を追加します。 Converter04.AddKomaBETUAllNariMoves( komabetuAllMove, figKoma, srcKoma, dstKoma ); } }); //Converter04.AssertNariMove(komabetuAllMove, "#KomabetuMasus_ToKomabetuAllMove");//ここはOK return(komabetuAllMove); }
/// <summary> /// 指し手一覧を、駒毎に分けます。 /// </summary> /// <param name="hubNode">指し手一覧</param> /// <param name="logTag"></param> /// <returns>駒毎の、全指し手</returns> public Maps_OneAndMulti <Finger, ShootingStarlightable> SplitMoveByKoma(Node <ShootingStarlightable, KyokumenWrapper> hubNode) { SkyConst src_Sky = this.Value.ToKyokumenConst; Maps_OneAndMulti <Finger, ShootingStarlightable> enable_teMap = new Maps_OneAndMulti <Finger, ShootingStarlightable>(); hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { ShootingStarlightable nextMove = nextNode.Key; Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky, Util_Koma.AsKoma(nextMove.LongTimeAgo).Masu).ToFirst(); enable_teMap.AddOverwrite(figKoma, nextMove); }); return(enable_teMap); }
/// <summary> /// ハブ・ノードの次ノード・リストをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="hubNode"></param> /// <param name="comment"></param> /// <param name="logTag"></param> /// <returns></returns> public static string JsonKyokumens_NextNodes(bool enableLog, SkyConst src_Sky_base, Node <ShootingStarlightable, KyokumenWrapper> hubNode, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> node, ref bool toBreak) => { ShootingStarlightable move = node.Key; RO_Star_Koma srcKoma1 = Util_Koma.AsKoma(move.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(move.Now); Finger srcKoma2 = Util_Sky.Fingers_AtMasuNow(src_Sky_base, srcKoma1.Masu).ToFirst(); // 駒1つ PieceType ks14 = Haiyaku184Array.Syurui(dstKoma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // マス sb.AppendLine(" { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },"); string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, srcKoma2, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(dstKoma.Masu) + " },");//FIXME:おかしい? // コメント sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
public static SkyConst Sasu( SkyConst src_Sky, //現局面 Finger finger, //動かす駒 SyElement masu, //移動先マス Playerside pside_genTeban //動かす駒がどちらのプレイヤーのものか ) { SkyBuffer dst_Sky = new SkyBuffer(src_Sky.Clone()); // 現局面をコピーします。 // 移動先に相手の駒がないか、確認します。 Finger tottaKoma = Util_Sky.Fingers_AtMasuNow(new SkyConst(dst_Sky), masu).ToFirst(); if (tottaKoma != Fingers.Error_1) { // なにか駒を取ったら SyElement akiMasu; if (pside_genTeban == Playerside.P1) { akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Sente_Komadai, new SkyConst(dst_Sky)); } else { akiMasu = KifuIO.GetKomadaiKomabukuroSpace(Okiba.Gote_Komadai, new SkyConst(dst_Sky)); } RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(tottaKoma).Now); // FIXME:配役あってるか? dst_Sky.AddOverwriteStarlight(tottaKoma, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, akiMasu, koma.Syurui)));//tottaKoma, } // 駒を1個動かします。 // FIXME: 取った駒はどうなっている? { RO_Star_Koma koma = Util_Koma.AsKoma(dst_Sky.StarlightIndexOf(finger).Now); dst_Sky.AddOverwriteStarlight(finger, new RO_MotionlessStarlight(new RO_Star_Koma(pside_genTeban, masu, koma.Syurui)));//finger, } return(new SkyConst(dst_Sky)); }
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> /// 次の局面の一覧をもった、入れ物ノードを返します。 /// </summary> /// <param name="kifu"></param> /// <param name="pside_genTeban"></param> /// <returns></returns> public static KifuNode ToNextNodes_AsHubNode( Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMove, Node <ShootingStarlightable, KyokumenWrapper> siteiNode, Playerside pside_genTeban) { KifuNode hubNode = new KifuNodeImpl(null, null, Playerside.Empty);//蝶番 #if DEBUG string dump = komabetuAllMove.Dump(); #endif foreach (KeyValuePair <Finger, List <ShootingStarlightable> > entry1 in komabetuAllMove.Items) { Finger figKoma = entry1.Key;// 駒 // 駒の動ける升全て foreach (ShootingStarlightable move in entry1.Value) { RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); SyElement masu = koma.Masu; SkyConst nextSky = Util_Sasu.Sasu(siteiNode.Value.ToKyokumenConst, figKoma, masu, pside_genTeban); Node <ShootingStarlightable, KyokumenWrapper> nextNode = new KifuNodeImpl(move, new KyokumenWrapper(nextSky), KifuNodeImpl.GetReverseTebanside(pside_genTeban));//次のノード string sfenText = Util_Sky.ToSfenMoveText(move); if (hubNode.ContainsKey_NextNodes(sfenText)) { // 既存の指し手なら無視 System.Console.WriteLine("既存の指し手なので無視します。sfenText=[" + sfenText + "]"); } else { hubNode.Add_NextNode(Util_Sky.ToSfenMoveText(move), nextNode); } } } return(hubNode); }
/// <summary> /// 駒別マスをJSON化します。 /// </summary> /// <param name="enableLog"></param> /// <param name="src_Sky_base"></param> /// <param name="km_move"></param> /// <param name="comment"></param> /// <returns></returns> public static string JsonKyokumens_MultiKomabetuMasus(bool enableLog, SkyConst src_Sky_base, Maps_OneAndOne <Finger, SySet <SyElement> > km_move, string comment) { StringBuilder sb = new StringBuilder(); if (!enableLog) { goto gt_EndMethod; } km_move.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { // 駒1つ RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky_base.StarlightIndexOf(key).Now); PieceType ks14 = Haiyaku184Array.Syurui(koma.Haiyaku); sb.AppendLine(" ["); // マスの色 sb.AppendLine(" { act:\"colorMasu\", style:\"rgba(100,240,100,0.5)\" },"); // 全マス foreach (Basho masu in value.Elements) { sb.AppendLine(" { act:\"drawMasu\" , masu:" + Util_Masu.AsMasuNumber(masu) + " },"); } string komaImg = Util_GraphicalLog.Finger_ToString(src_Sky_base, key, ""); sb.AppendLine(" { act:\"drawImg\", img:\"" + komaImg + "\", masu: " + Util_Masu.AsMasuNumber(koma.Masu) + " },");//FIXME:おかしい? // コメント sb.AppendLine(" { act:\"drawText\", text:\"" + comment + "\" , x:0, y:20 },"); sb.AppendLine(" ],"); }); gt_EndMethod: return(sb.ToString()); }
public static string Finger_ToString(SkyConst src_Sky, Finger finger, string extentionWithDot) { string komaImg = ""; if ((int)finger < Finger_Honshogi.Items_KomaOnly.Length) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Playerside pside = koma.Pside; PieceType ks14 = Haiyaku184Array.Syurui(koma.Haiyaku); komaImg = Util_GraphicalLog.PsideKs14_ToString(pside, ks14, extentionWithDot); } else { komaImg = Util_GraphicalLog.PsideKs14_ToString(Playerside.Empty, PieceType.None, extentionWithDot); } return(komaImg); }
public void Log4( SkyConst src_Sky, Playerside tebanSeme,//手番(利きを調べる側) Maps_OneAndOne <Finger, SySet <SyElement> > kmMove_seme_IKUSA ) { // 戦駒の移動可能場所 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(this.BrdMove); kmMove_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""); foreach (Basho masu in value.Elements) { boardLog_clone.Masu_theMove.Add((int)masu.MasuNumber); } }); this.BrdMove = boardLog_clone; }
/// <summary> /// /// </summary> /// <param name="move">棋譜に記録するために「指す前/指した後」を含めた手。</param> /// <param name="back"></param> /// <returns></returns> private static PieceType Kifusasi30_Naru( ShootingStarlightable move, bool back) { //------------------------------------------------------------ // 確定 : 移動先升 //------------------------------------------------------------ PieceType syurui2; { //---------- // 成るかどうか //---------- RO_Star_Koma koma = Util_Koma.AsKoma(move.Now); if (Util_Sky.IsNattaMove(move)) { if (back) { // 正順で成ったのなら、巻戻しでは「非成」に戻します。 syurui2 = KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku)); } else { syurui2 = Haiyaku184Array.Syurui(koma.Haiyaku); } } else { syurui2 = Haiyaku184Array.Syurui(koma.Haiyaku); } } return(syurui2); }
/// <summary> /// 駒台の空いている升を返します。 /// </summary> /// <param name="okiba">先手駒台、または後手駒台</param> /// <param name="uc_Main">メインパネル</param> /// <returns>置ける場所。無ければヌル。</returns> public static SyElement GetKomadaiKomabukuroSpace(Okiba okiba, SkyConst src_Sky) { SyElement akiMasu = Masu_Honshogi.Error; // 先手駒台または後手駒台の、各マスの駒がある場所を調べます。 bool[] exists = new bool[Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH];//駒台スペースは40マスです。 src_Sky.Foreach_Starlights((Finger finger, Starlight komaP, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(komaP.Now); if (Util_Masu.GetOkiba(koma.Masu) == okiba) { exists[ Util_Masu.AsMasuNumber(koma.Masu) - Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba)) ] = true; } }); //駒台スペースは40マスです。 for (int i = 0; i < Util_Masu.KOMADAI_KOMABUKURO_SPACE_LENGTH; i++) { if (!exists[i]) { akiMasu = Masu_Honshogi.Items_All[i + Util_Masu.AsMasuNumber(Util_Masu.GetFirstMasuFromOkiba(okiba))]; goto gt_EndMethod; } } gt_EndMethod: //System.C onsole.WriteLine("ゲット駒台駒袋スペース=" + akiMasu); return(akiMasu); }
/// <summary> /// 将棋盤上での検索 /// </summary> /// <param name="srcAll">候補マス</param> /// <param name="komas"></param> /// <returns></returns> public static bool Hit_JfugoParser( Playerside pside, PieceType syurui, SySet <SyElement> srcAll, KifuTree kifu, out Finger foundKoma) { SkyConst src_Sky = kifu.CurNode.Value.ToKyokumenConst; bool hit = false; foundKoma = Fingers.Error_1; foreach (Basho masu1 in srcAll.Elements)//筋・段。(先後、種類は入っていません) { foreach (Finger koma1 in Finger_Honshogi.Items_KomaOnly) { RO_Star_Koma koma2 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma1).Now); if (pside == koma2.Pside && Okiba.ShogiBan == Util_Masu.GetOkiba(koma2.Masu) && KomaSyurui14Array.Matches(syurui, Haiyaku184Array.Syurui(koma2.Haiyaku)) && masu1 == koma2.Masu ) { // 候補マスにいた //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> hit = true; foundKoma = koma1; break; } } } return(hit); }
///// <summary> ///// 変換『「指し手→局面」のコレクション』→『「駒、指し手」のペアのリスト』 ///// </summary> //public static List<Couple<Finger,Masu>> MovebetuSky_ToKamList( // SkyConst src_Sky_genzai, // Dictionary<ShootingStarlightable, SkyBuffer> ss, // LarabeLoggerTag logTag // ) //{ // List<Couple<Finger, Masu>> kmList = new List<Couple<Finger, Masu>>(); // // TODO: // foreach(KeyValuePair<ShootingStarlightable,SkyBuffer> entry in ss) // { // RO_Star_Koma srcKoma = Util_Koma.AsKoma(entry.Key.LongTimeAgo); // RO_Star_Koma dstKoma = Util_Koma.AsKoma(entry.Key.Now); // Masu srcMasu = srcKoma.Masu; // Masu dstMasu = dstKoma.Masu; // Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky_genzai,srcMasu).ToFirst(); // kmList.Add(new Couple<Finger, Masu>(figKoma, dstMasu)); // } // return kmList; //} /// <summary> /// 変換『「指し手→局面」のコレクション』→『「駒、指し手」のペアのリスト』 /// </summary> public static List <Couple <Finger, SyElement> > NextNodes_ToKamList( SkyConst src_Sky_genzai, Node <ShootingStarlightable, KyokumenWrapper> hubNode ) { List <Couple <Finger, SyElement> > kmList = new List <Couple <Finger, SyElement> >(); // TODO: hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { RO_Star_Koma srcKoma = Util_Koma.AsKoma(nextNode.Key.LongTimeAgo); RO_Star_Koma dstKoma = Util_Koma.AsKoma(nextNode.Key.Now); SyElement srcMasu = srcKoma.Masu; SyElement dstMasu = dstKoma.Masu; Finger figKoma = Util_Sky.Fingers_AtMasuNow(src_Sky_genzai, srcMasu).ToFirst(); kmList.Add(new Couple <Finger, SyElement>(figKoma, dstMasu)); }); return(kmList); }
/// <summary> /// 指定された局面で、指定された手番の駒の、利きマスを算出します。 /// 持ち駒は盤上にないので、利きを調べる必要はありません。 /// /// 「手目」は判定できません。 /// /// </summary> /// <param name="kouho"></param> /// <param name="sbGohosyu"></param> /// <param name="logger"></param> public static List_OneAndMulti <Finger, SySet <SyElement> > LAAAA_GetEffect( bool enableLog, bool isHonshogi, SkyConst src_Sky, Playerside pside_genTeban3, bool isAiteban, GraphicalLog_File logF_kiki, string logBrd_caption, int yomuDeep_forLog,//脳内読み手数 int tesumi_yomiCur_forLog, ShootingStarlightable move_forLog ) { GraphicalLog_Board logBrd_kiki = new GraphicalLog_Board(); logBrd_kiki.Caption = logBrd_caption;// "利き_" logBrd_kiki.Tesumi = tesumi_yomiCur_forLog; logBrd_kiki.NounaiYomiDeep = yomuDeep_forLog; //logBrd_kiki.Score = 0.0d; logBrd_kiki.GenTeban = pside_genTeban3;// 現手番 logF_kiki.boards.Add(logBrd_kiki); // 《1》 List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect = new List_OneAndMulti <Finger, SySet <SyElement> >();//盤上の駒の利き { // 《1.1》 Playerside tebanSeme; //手番(利きを調べる側) Playerside tebanKurau; //手番(喰らう側) { if (isAiteban) { tebanSeme = Converter04.AlternatePside(pside_genTeban3); tebanKurau = pside_genTeban3; } else { tebanSeme = pside_genTeban3; tebanKurau = Converter04.AlternatePside(pside_genTeban3); } if (Playerside.P1 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Sente; } else if (Playerside.P2 == tebanSeme) { logBrd_kiki.NounaiSeme = Gkl_NounaiSeme.Gote; } } // 《1.2》 Fingers fingers_seme_IKUSA; //戦駒(利きを調べる側) Fingers fingers_kurau_IKUSA; //戦駒(喰らう側) Fingers dust1; Fingers dust2; Util_Things.AAABAAAA_SplitGroup( out fingers_seme_IKUSA, out fingers_kurau_IKUSA, out dust1, out dust2, src_Sky, tebanSeme, tebanKurau ); // 攻め手の駒の位置 GraphicalLog_Board boardLog_clone = new GraphicalLog_Board(logBrd_kiki); foreach (Finger finger in fingers_seme_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); Gkl_KomaMasu km = new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) ); boardLog_clone.KomaMasu1.Add(km); } foreach (Finger finger in fingers_kurau_IKUSA.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(finger).Now); logBrd_kiki.KomaMasu2.Add(new Gkl_KomaMasu( Util_GraphicalLog.PsideKs14_ToString(tebanKurau, Haiyaku184Array.Syurui(koma.Haiyaku), ""), Util_Masu.AsMasuNumber(koma.Masu) )); } logBrd_kiki = boardLog_clone; // 《1.3》 SySet <SyElement> masus_seme_IKUSA = Converter04.Fingers_ToMasus(fingers_seme_IKUSA, src_Sky); // 盤上のマス(利きを調べる側の駒) SySet <SyElement> masus_kurau_IKUSA = Converter04.Fingers_ToMasus(fingers_kurau_IKUSA, src_Sky); // 盤上のマス(喰らう側の駒) // 駒のマスの位置は、特にログに取らない。 // 《1.4》 Maps_OneAndOne <Finger, SySet <SyElement> > kmEffect_seme_IKUSA = Util_Things.Get_KmEffect_seme_IKUSA( fingers_seme_IKUSA,//この中身がおかしい。 masus_seme_IKUSA, masus_kurau_IKUSA, src_Sky, enableLog, Converter04.MoveToStringForLog(move_forLog, pside_genTeban3) );// 利きを調べる側の利き(戦駒) // 戦駒の利き logBrd_kiki = new GraphicalLog_Board(logBrd_kiki); kmEffect_seme_IKUSA.Foreach_Entry((Finger key, SySet <SyElement> value, ref bool toBreak) => { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(key).Now); string komaImg = Util_GraphicalLog.PsideKs14_ToString(tebanSeme, Haiyaku184Array.Syurui(koma.Haiyaku), ""); foreach (Basho masu in value.Elements) { boardLog_clone.Masu_theEffect.Add((int)masu.MasuNumber); } }); logBrd_kiki = boardLog_clone; // 《1》 = 《1.4》の戦駒+持駒 sMs_effect.AddRange_New(kmEffect_seme_IKUSA); } return(sMs_effect); }
/// <summary> /// 指定された手の中から、王手局面を除外します。 /// /// 王手回避漏れを防ぎたいんだぜ☆ /// </summary> /// <param name="km_available">自軍の各駒の移動できる升セット</param> /// <param name="sbGohosyu"></param> /// <param name="logTag"></param> public static KifuNode LA_RemoveMate( bool isHonshogi, Maps_OneAndMulti <Finger, ShootingStarlightable> genTeban_komabetuAllMove1, // 現手番の、どの駒が、どんな手を指すことができるか int yomuDeep, //脳内読み手数 int tesumi_yomiGenTeban, Playerside pside_yomiGenTeban, KifuNode siteiNode_yomiGenTeban, bool enableLog, GraphicalLog_File logF_kiki, string hint) { Node <ShootingStarlightable, KyokumenWrapper> hubNode = UtilKomabetuMove.ToNextNodes_AsHubNode( genTeban_komabetuAllMove1, siteiNode_yomiGenTeban, pside_yomiGenTeban ); // ハブ・ノード自身はダミーノードなんだが、子ノードに、次のノードが入っている。 Converter04.AssertNariMove(hubNode, "#LA_RemoveMate(1)"); //ここはok Util_LegalMove.Log1(hubNode, enableLog, tesumi_yomiGenTeban, hint); if (isHonshogi) { // 王手が掛かっている局面を除きます。 Util_LegalMove.LAA_RemoveNextNode_IfMate( hubNode, enableLog, yomuDeep, tesumi_yomiGenTeban, pside_yomiGenTeban, logF_kiki); } Converter04.AssertNariMove(hubNode, "#LA_RemoveMate(2)王手局面削除直後");//ここはok // 「指し手一覧」を、「駒別の全指し手」に分けます。 Maps_OneAndMulti <Finger, ShootingStarlightable> komabetuAllMoves2 = siteiNode_yomiGenTeban.SplitMoveByKoma(hubNode); Converter04.AssertNariMove(komabetuAllMoves2, "#LA_RemoveMate(3)更に変換後");//ここはok // // 「駒別の指し手一覧」を、「駒別の進むマス一覧」になるよう、データ構造を変換します。 // Maps_OneAndOne <Finger, SySet <SyElement> > komabetuSusumuMasus = new Maps_OneAndOne <Finger, SySet <SyElement> >();// 「どの駒を、どこに進める」の一覧 foreach (KeyValuePair <Finger, List <ShootingStarlightable> > entry in komabetuAllMoves2.Items) { Finger finger = entry.Key; List <ShootingStarlightable> teList = entry.Value; // ポテンシャル・ムーブを調べます。 SySet <SyElement> masus_PotentialMove = new SySet_Default <SyElement>("ポテンシャルムーブ"); foreach (ShootingStarlightable te in teList) { RO_Star_Koma koma = Util_Koma.AsKoma(te.Now); masus_PotentialMove.AddElement(koma.Masu); } if (!masus_PotentialMove.IsEmptySet()) { // 空でないなら Util_KomabetuMasus.AddOverwrite(komabetuSusumuMasus, finger, masus_PotentialMove); } } // まず、ディクショナリー構造へ変換。 Dictionary <ShootingStarlightable, KyokumenWrapper> movebetuSky = Converter04.KomabetuMasus_ToMovebetuSky( komabetuSusumuMasus, siteiNode_yomiGenTeban.Value.ToKyokumenConst, pside_yomiGenTeban); // 棋譜ノード構造へ変換。 return(Converter04.MovebetuSky_ToHubNode(movebetuSky, KifuNodeImpl.GetReverseTebanside(pside_yomiGenTeban))); }
/// <summary> /// 利きに飛び込んでいないか(王手されていないか)、調べます。 /// /// GetAvailableMove()の中では使わないでください。循環してしまいます。 /// </summary> public static bool LAAA_KingSuicide( bool enableLog, SkyConst src_Sky, //調べたい局面 int yomuDeep, //脳内読み手数 int tesumi_yomiCur_forLog, //読み進めている現在の手目 Playerside pside_genTeban, //現手番側 GraphicalLog_File logF_kiki, ShootingStarlightable move_forLog ) { bool isHonshogi = true; System.Diagnostics.Debug.Assert(src_Sky.Count == Masu_Honshogi.HONSHOGI_KOMAS); // 「相手の駒を動かしたときの利き」リスト // 持ち駒はどう考える?「駒を置けば、思い出王手だってある」 List_OneAndMulti <Finger, SySet <SyElement> > sMs_effect_aiTeban = Util_LegalMove.LAAAA_GetEffect( enableLog, isHonshogi, src_Sky, pside_genTeban, true,// 相手盤の利きを調べます。 logF_kiki, "玉自殺チェック", yomuDeep, tesumi_yomiCur_forLog, move_forLog); // 現手番側が受け手に回ったとします。現手番の、王の座標 SyElement genTeban_kingMasu; if (Playerside.P2 == pside_genTeban) { // 現手番は、後手 RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.GoteOh).Now); genTeban_kingMasu = koma.Masu; } else { // 現手番は、先手 RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(Finger_Honshogi.SenteOh).Now); genTeban_kingMasu = koma.Masu; } // 相手の利きに、自分の王がいるかどうか確認します。 bool mate = false; sMs_effect_aiTeban.Foreach_Entry((Finger koma, SySet <SyElement> kikis, ref bool toBreak) => { foreach (Basho kiki in kikis.Elements) { if (Util_Masu.AsMasuNumber(genTeban_kingMasu) == (int)kiki.MasuNumber) { mate = true; toBreak = true; } } }); return(mate); }
/// <summary> /// 次の1手データを作ります(*1) /// /// *1…符号1「▲68銀上」を元に、「7968」を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ExecuteJfugo_FromTextSub( string strPside, //▲△ string strSuji, //123…9、123…9、一二三…九 string strDan, //123…9、123…9、一二三…九 string strDou, // “同” string strSrcSyurui, //(歩|香|桂|… string strMigiHidari, // 右|左… string strAgaruHiku, // 上|引 string strNariNarazu, //成|不成 string strDaHyoji, //打 out ShootingStarlightable move, KifuTree kifu ) { Node <ShootingStarlightable, KyokumenWrapper> siteiNode = kifu.CurNode; SkyConst src_Sky = siteiNode.Value.ToKyokumenConst; //------------------------------ // 符号確定 //------------------------------ MigiHidari migiHidari = Converter04.Str_ToMigiHidari(strMigiHidari); AgaruHiku agaruHiku = Converter04.Str_ToAgaruHiku(strAgaruHiku); // 上|引 NariNarazu nariNarazu = Converter04.Nari_ToBool(strNariNarazu); //成 DaHyoji daHyoji = Converter04.Str_ToDaHyoji(strDaHyoji); //打 PieceType srcSyurui = Converter04.Str_ToSyurui(strSrcSyurui); //------------------------------ // //------------------------------ Playerside pside = Converter04.Pside_ToEnum(strPside); SyElement dstMasu; if ("同" == strDou) { // 1手前の筋、段を求めるのに使います。 RO_Star_Koma koma = Util_Koma.AsKoma(siteiNode.Key.Now); dstMasu = koma.Masu; } else { dstMasu = Util_Masu.OkibaSujiDanToMasu( Okiba.ShogiBan, ConverterKnSh.Suji_ToInt(strSuji), ConverterKnSh.Suji_ToInt(strDan) ); } // TODO: 駒台にあるかもしれない。 Okiba srcOkiba1 = Okiba.ShogiBan; //Okiba.FUMEI_FUGO_YOMI_CHOKUGO;// Okiba.SHOGIBAN; if (DaHyoji.Visible == daHyoji) { if (Playerside.P2 == pside) { srcOkiba1 = Okiba.Gote_Komadai; } else { srcOkiba1 = Okiba.Sente_Komadai; } } // SyElement dst1 = dstMasu; Finger foundKoma = Fingers.Error_1; //---------- // 駒台の駒を(明示的に)打つなら //---------- bool utsu = false;//駒台の駒を打つなら真 if (DaHyoji.Visible == daHyoji) { utsu = true; goto gt_EndShogiban; } if (PieceType.P == srcSyurui) { //************************************************************ // 歩 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│ │ │ │ //├─┼─┼─┤ //│ │至│ │ //├─┼─┼─┤ //│ │E│ │ //└─┴─┴─┘ bool isE = true; SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } } else if (PieceType.R == srcSyurui) { #region 飛 //************************************************************ // 飛 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │ │ │ │ │ │ │ │ │A7│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A0│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E0│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E7│ │ │ │ │ │ │ │ │ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isA = true; bool isC = true; bool isE = true; bool isG = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isE = false; break; case AgaruHiku.Agaru: isA = false; isC = false; isG = false; break; case AgaruHiku.Hiku: isC = false; isE = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isG = false; break; case MigiHidari.Hidari: isA = false; isC = false; isE = false; break; case MigiHidari.Sugu: isA = false; isC = false; isG = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.B == srcSyurui) { #region 角 //************************************************************ // 角 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │H7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │B7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │H6│ │ │ │ │ │ │ │ │ │ │ │ │ │B6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │H5│ │ │ │ │ │ │ │ │ │ │ │B5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │H4│ │ │ │ │ │ │ │ │ │B4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │H3│ │ │ │ │ │ │ │B3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │H2│ │ │ │ │ │B2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │H1│ │ │ │B1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │H0│ │B0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │至│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │F0│ │D0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │F1│ │ │ │D1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │F2│ │ │ │ │ │D2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │F3│ │ │ │ │ │ │ │D3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │F4│ │ │ │ │ │ │ │ │ │D4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │F5│ │ │ │ │ │ │ │ │ │ │ │D5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │F6│ │ │ │ │ │ │ │ │ │ │ │ │ │D6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │F7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │D7│ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isB = true; bool isD = true; bool isF = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isB = false; isD = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isB = false; isH = false; break; case AgaruHiku.Hiku: isB = false; isH = false; break; } switch (migiHidari) { case MigiHidari.Migi: isF = false; isH = false; break; case MigiHidari.Hidari: isB = false; isD = false; break; case MigiHidari.Sugu: isD = false; isF = false; break; } SySet_Default <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isB) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1)); } //---------- // 候補マスB //---------- if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.L == srcSyurui) { #region 香 //************************************************************ // 香 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┐ // │ │至│ │ // ├─┼─┼─┤ // │ │E0│ │ // ├─┼─┼─┤ // │ │E1│ │ // ├─┼─┼─┤ // │ │E2│ │ // ├─┼─┼─┤ // │ │E3│ │ // ├─┼─┼─┤ // │ │E4│ │ // ├─┼─┼─┤ // │ │E5│ │ // ├─┼─┼─┤ // │ │E6│ │ // ├─┼─┼─┤ // │ │E7│ │ // └─┴─┴─┘ bool isE = true; SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isE) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.N == srcSyurui) { #region 桂 //************************************************************ // 桂 //************************************************************ //---------- // 候補マス //---------- //┌─┐ ┌─┐ //│ │ │ │ //├─┼─┼─┤ //│ │ │ │ //├─┼─┼─┤ //│ │至│ │先手から見た図 //├─┼─┼─┤ //│ │ │ │ //├─┼─┼─┤ //│J│ │I│ //└─┘ └─┘ bool isI = true; bool isJ = true; switch (agaruHiku) { case AgaruHiku.Yoru: isI = false; isJ = false; break; case AgaruHiku.Agaru: break; case AgaruHiku.Hiku: isI = false; isJ = false; break; } switch (migiHidari) { case MigiHidari.Migi: isJ = false; break; case MigiHidari.Hidari: isI = false; break; case MigiHidari.Sugu: isI = false; isJ = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isI) { srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻跳(pside, dst1)); } if (isJ) { srcAll.AddSupersets(KomanoKidou.SrcKeimatobi_戻駆(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.S == srcSyurui) { #region 銀 //************************************************************ // 銀 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│H│ │B│ //├─┼─┼─┤ //│ │至│ │先手から見た図 //├─┼─┼─┤ //│F│E│D│ //└─┴─┴─┘ bool isB = true; bool isD = true; bool isE = true; bool isF = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isB = false; isD = false; isE = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isB = false; isH = false; break; case AgaruHiku.Hiku: isD = false; isE = false; isF = false; break; } switch (migiHidari) { case MigiHidari.Migi: isE = false; isF = false; isH = false; break; case MigiHidari.Hidari: isB = false; isD = false; isE = false; break; case MigiHidari.Sugu: isB = false; isD = false; isF = false; isH = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isB) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if ( PieceType.G == srcSyurui || PieceType.PP == srcSyurui || PieceType.PL == srcSyurui || PieceType.PN == srcSyurui || PieceType.PS == srcSyurui ) { #region △金、△と金、△成香、△成桂、△成銀 //************************************************************ // △金、△と金、△成香、△成桂、△成銀 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│ │A│ │ //├─┼─┼─┤ //│G│至│C│先手から見た図 //├─┼─┼─┤ //│F│E│D│ //└─┴─┴─┘ bool isA = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isD = false; isE = false; isF = false; break; case AgaruHiku.Agaru: isA = false; isC = false; isG = false; break; case AgaruHiku.Hiku: isC = false; isD = false; isE = false; isF = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isF = false; isG = false; break; case MigiHidari.Hidari: isA = false; isC = false; isD = false; isE = false; break; case MigiHidari.Sugu: isA = false; isC = false; isD = false; isF = false; isG = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.K == srcSyurui) { #region 王 //************************************************************ // 王 //************************************************************ //---------- // 候補マス //---------- //┌─┬─┬─┐ //│H│A│B│ //├─┼─┼─┤ //│G│至│C│先手から見た図 //├─┼─┼─┤ //│F│E│D│ //└─┴─┴─┘ bool isA = true; bool isB = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; bool isH = true; SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1)); } if (isB) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1)); } // 王は1つです。 if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.PR == srcSyurui) { #region 竜 //************************************************************ // 竜 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │ │ │ │ │ │ │ │ │A7│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │A1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │H│A0│B│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │G7│G6│G5│G4│G3│G2│G1│G0│至│C0│C1│C2│C3│C4│C5│C6│C7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │F│E0│D│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E1│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E2│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E3│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E4│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E5│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E6│ │ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │ │E7│ │ │ │ │ │ │ │ │ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isA = true; bool isB = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isB = false; isD = false; isE = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isA = false; isB = false; isC = false; isG = false; isH = false; break; case AgaruHiku.Hiku: isC = false; isD = false; isE = false; isF = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isF = false; isG = false; isH = false; break; case MigiHidari.Hidari: isA = false; isB = false; isC = false; isD = false; isE = false; break; case MigiHidari.Sugu: isA = false; isB = false; isC = false; isD = false; isF = false; isG = false; isH = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻上(pside, dst1)); } if (isB) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻昇(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻滑(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻浮(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else if (PieceType.PB == srcSyurui) { #region 馬 //************************************************************ // 馬 //************************************************************ //---------- // 候補マス //---------- // ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ // │H7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │B7│ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │H6│ │ │ │ │ │ │ │ │ │ │ │ │ │B6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │H5│ │ │ │ │ │ │ │ │ │ │ │B5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │H4│ │ │ │ │ │ │ │ │ │B4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │H3│ │ │ │ │ │ │ │B3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │H2│ │ │ │ │ │B2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │H1│ │ │ │B1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │H0│A│B0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │G│至│C│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │ │F0│E│D0│ │ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │ │F1│ │ │ │D1│ │ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │ │F2│ │ │ │ │ │D2│ │ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │ │F3│ │ │ │ │ │ │ │D3│ │ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │ │F4│ │ │ │ │ │ │ │ │ │D4│ │ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │ │F5│ │ │ │ │ │ │ │ │ │ │ │D5│ │ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │ │F6│ │ │ │ │ │ │ │ │ │ │ │ │ │D6│ │ // ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ // │F7│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │D7│ // └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ bool isA = true; bool isB = true; bool isC = true; bool isD = true; bool isE = true; bool isF = true; bool isG = true; bool isH = true; switch (agaruHiku) { case AgaruHiku.Yoru: isA = false; isB = false; isD = false; isE = false; isF = false; isH = false; break; case AgaruHiku.Agaru: isA = false; isB = false; isC = false; isG = false; isH = false; break; case AgaruHiku.Hiku: isC = false; isD = false; isE = false; isF = false; isG = false; break; } switch (migiHidari) { case MigiHidari.Migi: isA = false; isE = false; isF = false; isG = false; isH = false; break; case MigiHidari.Hidari: isA = false; isB = false; isC = false; isD = false; isE = false; break; case MigiHidari.Sugu: isA = false; isB = false; isC = false; isD = false; isF = false; isG = false; isH = false; break; } SySet <SyElement> srcAll = new SySet_Default <SyElement>("J符号"); if (isA) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻上(pside, dst1)); } if (isB) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻昇(pside, dst1)); } if (isC) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻射(pside, dst1)); } if (isD) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻沈(pside, dst1)); } if (isE) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻引(pside, dst1)); } if (isF) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻降(pside, dst1)); } if (isG) { srcAll.AddSupersets(KomanoKidou.SrcIppo_戻滑(pside, dst1)); } if (isH) { srcAll.AddSupersets(KomanoKidou.SrcKantu_戻浮(pside, dst1)); } if (KifuIO_MovesParsers.Hit_JfugoParser(pside, srcSyurui, srcAll, kifu, out foundKoma)) { srcOkiba1 = Okiba.ShogiBan; goto gt_EndSyurui; } #endregion } else { #region エラー //************************************************************ // エラー //************************************************************ #endregion } gt_EndShogiban: if (Fingers.Error_1 == foundKoma && utsu) { // 駒台の駒を(明示的に)打ちます。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fingers komas = Util_Sky.Fingers_ByOkibaPsideSyuruiNow( siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui); if (0 < komas.Count) { switch (pside) { case Playerside.P2: srcOkiba1 = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba1 = Okiba.Sente_Komadai; break; default: srcOkiba1 = Okiba.Empty; break; } foundKoma = komas[0]; goto gt_EndSyurui; } } gt_EndSyurui: int srcMasuHandle1; if (Fingers.Error_1 != foundKoma) { // 将棋盤の上に駒がありました。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(foundKoma).Now); srcMasuHandle1 = Util_Masu.AsMasuNumber(koma.Masu); } else { // (符号に書かれていませんが)「打」のとき。 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> switch (pside) { case Playerside.P2: srcOkiba1 = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba1 = Okiba.Sente_Komadai; break; default: srcOkiba1 = Okiba.Empty; break; } Debug.Assert(0 < siteiNode.Value.ToKyokumenConst.Count, "星の光が 1個未満。"); // 駒台から、該当する駒を探します。 Fingers daiKomaFgs = Util_Sky.Fingers_ByOkibaPsideSyuruiNow( siteiNode.Value.ToKyokumenConst, srcOkiba1, pside, srcSyurui);//(2014-10-04 12:46)変更 Debug.Assert(0 < daiKomaFgs.Count, "フィンガーズが 1個未満。 srcOkiba1=[" + srcOkiba1 + "] pside=[" + pside + "] srcSyurui=[" + srcSyurui + "]"); // 1個はヒットするはず Finger hitKoma = daiKomaFgs[0];//▲![コマ送り]ボタンを連打すると、エラーになります。 RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(hitKoma).Now); srcMasuHandle1 = Util_Masu.AsMasuNumber(koma.Masu); } PieceType dstSyurui; if (NariNarazu.Nari == nariNarazu) { // 成ります dstSyurui = KomaSyurui14Array.NariCaseHandle[(int)srcSyurui]; } else { // そのままです。 dstSyurui = srcSyurui; } // 1手を、データにします。 move = new RO_ShootingStarlight( //foundKoma,//TODO: new RO_Star_Koma( pside, Util_Masu.HandleToMasu(srcMasuHandle1), srcSyurui ), new RO_Star_Koma( pside, dstMasu,//符号は将棋盤の升目です。 dstSyurui ), PieceType.None // 符号からは、取った駒の種類は分からないんだぜ☆ だがバグではない☆ あとで調べる☆ ); }
/// <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> /// 棋譜データを元に、符号リスト1(*1)を出力します。 /// /// *1…「▲2六歩△8四歩▲7六歩」といった書き方。 /// /// </summary> /// <param name="fugoList"></param> public static string ToJapaneseKifuText( KifuTree kifu ) { StringBuilder sb = new StringBuilder(); sb.Append("position "); sb.Append(kifu.GetProperty(KifuTreeImpl.PropName_Startpos)); sb.Append(" moves "); // 採譜用に、新しい対局を用意します。 KifuTree saifuKifu; { saifuKifu = new KifuTreeImpl( new KifuNodeImpl( Util_Sky.NullObjectMove, new KyokumenWrapper(new SkyConst(Util_Sky.New_Hirate())), //日本の符号読取時 Playerside.P2 ) ); saifuKifu.Clear();// 棋譜を空っぽにします。 saifuKifu.SetProperty(KifuTreeImpl.PropName_FirstPside, Playerside.P1); saifuKifu.SetProperty(KifuTreeImpl.PropName_Startpos, "startpos");//平手の初期局面 // FIXME:平手とは限らないのでは? } kifu.ForeachHonpu(kifu.CurNode, (int tesumi, KyokumenWrapper kWrap, Node <ShootingStarlightable, KyokumenWrapper> node6, ref bool toBreak) => { if (0 == tesumi) { goto gt_EndLoop; } FugoJ fugo; //------------------------------ // 符号の追加(記録係) //------------------------------ KyokumenWrapper saifu_kWrap = saifuKifu.CurNode.Value; KifuNode newNode = new KifuNodeImpl( node6.Key, new KyokumenWrapper(saifu_kWrap.ToKyokumenConst), KifuNodeImpl.GetReverseTebanside(((KifuNode)saifuKifu.CurNode).Tebanside) ); // TODO: ↓? ((KifuNode)saifuKifu.CurNode).AppendChildA_New(newNode); saifuKifu.CurNode = newNode; RO_Star_Koma koma = Util_Koma.AsKoma(((ShootingStarlightable)node6.Key).LongTimeAgo); fugo = JFugoCreator15Array.ItemMethods[(int)Haiyaku184Array.Syurui(koma.Haiyaku)](node6.Key, saifu_kWrap);//「▲2二角成」なら、馬(dst)ではなくて角(src)。 sb.Append(fugo.ToText_UseDou(node6)); gt_EndLoop: ; }); return(sb.ToString()); }
/// <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; SkyConst src_Sky = args.Node.Value.ToKyokumenConst; // // 「紐が付いていない駒の少なさ」による加点。 // int mikataHimoduki = 0; // 味方の駒に、味方の駒の利きが1つ被っていれば+1。 int mikataNeraware = 0; // 味方の駒に、相手の駒の利きが1つ被っていれば+1。 int aiteHimoduki = 0; // 相手の駒に、相手の駒の利きが1つ被っていれば+1。 int aiteNeraware = 0; // 相手の駒に、味方の駒の利きが1つ被っていれば+1。 List <string> mikataYaburareMasu = new List <string>(); int aiteWin = 0; // 利きの枚数で相手が勝っていた件数。 List <string> aiteYaburareMasu = new List <string>(); int mikataWin = 0; // 利きの枚数で味方が勝っていた件数。 // // 駒の利きの計算。 // KomanoKiki komanoKiki = KomanoKikiImpl.MasuBETUKikisu(src_Sky, args.Node.Tebanside); // // 味方の駒があるマスの得点は、マイナスなら集計。(減点法) // 敵の駒があるマスの得点は、プラスなら集計。(減点法) // // 駒は40枚あり、貫通して加点するのもある。 // foreach (Finger figKoma in Finger_Honshogi.Items_KomaOnly)// 全駒 { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); if (Okiba.ShogiBan != Util_Masu.Masu_ToOkiba(koma.Masu)) { goto gt_Next2; } if (args.PlayerInfo.Playerside == koma.Pside) { // 味方の駒 // その升に利いている味方の利きの数。 int mikataKiki = komanoKiki.Kikisu_AtMasu_Mikata[Util_Masu.AsMasuNumber(koma.Masu)]; // その升に利いている相手の利きの数。 int aiteKiki = komanoKiki.Kikisu_AtMasu_Teki[Util_Masu.AsMasuNumber(koma.Masu)]; mikataHimoduki += mikataKiki; mikataNeraware += aiteKiki; // 破られる場合 if (mikataKiki < aiteKiki) { aiteWin++; mikataYaburareMasu.Add(Converter04.Masu_ToKanji(koma.Masu)); } } else { // 相手の駒 // その升に利いている相手の利きの数。 int aiteKiki = komanoKiki.Kikisu_AtMasu_Mikata[Util_Masu.AsMasuNumber(koma.Masu)]; // その升に利いている味方の利きの数。 int mikataKiki = komanoKiki.Kikisu_AtMasu_Teki[Util_Masu.AsMasuNumber(koma.Masu)]; aiteHimoduki = aiteKiki; aiteNeraware = mikataKiki; // 破られる場合 if (aiteKiki < mikataKiki) { mikataWin++; aiteYaburareMasu.Add(Converter04.Masu_ToKanji(koma.Masu)); } } gt_Next2: ; } // 集計。 score = (double)(mikataWin - aiteWin) * 1.0 + 50.0d; string meisai = ""; #if DEBUG // 明細 { StringBuilder sb = new StringBuilder(); sb.Append(" " + score); sb.Append("点 "); sb.Append(" 衝突箇所勝ち数=" + (mikataWin - aiteWin)); sb.Append(" 味方が破られる" + aiteWin + "箇所"); foreach (string s in mikataYaburareMasu) { sb.Append("["); sb.Append(s); sb.Append("]"); } sb.Append(" 相手が破られる" + mikataWin + "箇所"); foreach (string s in aiteYaburareMasu) { sb.Append("["); sb.Append(s); sb.Append("]"); } meisai = sb.ToString(); } #endif kyokumenScore = new KyHyoka100limitItemImpl(args.TenonagareGenjo.ScoreKeisu, score, meisai); }