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); }
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="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> private static void AddKomaBETUAllNariMoves( Maps_OneAndMulti <Finger, ShootingStarlightable> komaBETUAllMoves, Finger figKoma, RO_Star_Koma srcKoma, RO_Star_Koma dstKoma ) { bool isPromotionable; if (!Converter04.IsPromotionable(out isPromotionable, srcKoma, dstKoma)) { goto gt_EndMethod; } // 成りの資格があれば、成りの指し手を作ります。 if (isPromotionable) { //MessageBox.Show("成りの資格がある駒がありました。 src=["+srcKoma.Masu.Word+"]["+srcKoma.Syurui+"]"); ShootingStarlightable move = new RO_ShootingStarlight( //figKoma,//駒 srcKoma,// 移動元 new RO_Star_Koma( dstKoma.Pside, dstKoma.Masu, KomaSyurui14Array.ToNariCase(dstKoma.Syurui) //強制的に【成り】に駒の種類を変更 ), // 移動先 PieceType.None //取った駒不明 ); // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。 komaBETUAllMoves.AddNotOverwrite(figKoma, move); } gt_EndMethod: ; }
/// <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 void AddNariMove( KifuNode node_yomiCur, KifuNode hubNode ) { Dictionary <string, ShootingStarlightable> newMoveList = new Dictionary <string, ShootingStarlightable>(); 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); bool isPromotionable; if (!Converter04.IsPromotionable(out isPromotionable, srcKoma, dstKoma)) { // エラー goto gt_Next1; } if (isPromotionable) { ShootingStarlightable move = new RO_ShootingStarlight( //figKoma,//駒 srcKoma,// 移動元 new RO_Star_Koma( dstKoma.Pside, dstKoma.Masu, KomaSyurui14Array.ToNariCase(dstKoma.Syurui) //強制的に【成り】に駒の種類を変更 ), // 移動先 PieceType.None //取った駒不明 ); // TODO: 一段目の香車のように、既に駒は成っている場合があります。無い指し手だけ追加するようにします。 string moveStr = Util_Sky.ToSfenMoveText(move);//重複防止用のキー if (!newMoveList.ContainsKey(moveStr)) { newMoveList.Add(moveStr, move); } } gt_Next1: ; }); // 新しく作った【成り】の指し手を追加します。 foreach (ShootingStarlightable newMove in newMoveList.Values) { // 指す前の駒 RO_Star_Koma sasumaenoKoma = Util_Koma.AsKoma(newMove.LongTimeAgo); // 指した駒 RO_Star_Koma sasitaKoma = Util_Koma.AsKoma(newMove.Now); // 現局面 SkyConst src_Sky = node_yomiCur.Value.ToKyokumenConst; // 指す前の駒を、盤上のマス目で指定 Finger figSasumaenoKoma = Util_Sky.Fingers_AtMasuNow(src_Sky, sasumaenoKoma.Masu).ToFirst(); // 新たな局面 KyokumenWrapper kyokumenWrapper = new KyokumenWrapper(Util_Sasu.Sasu(src_Sky, figSasumaenoKoma, sasitaKoma.Masu, KifuNodeImpl.GetReverseTebanside(node_yomiCur.Tebanside))); try { string moveStr = Util_Sky.ToSfenMoveText(newMove); if (!hubNode.ContainsKey_NextNodes(moveStr)) { // 指し手が既存でない局面だけを追加します。 hubNode.Add_NextNode( moveStr, new KifuNodeImpl( newMove, kyokumenWrapper,//node_yomiCur.Value,//FIXME: 成りの手を指した局面を作りたい。 KifuNodeImpl.GetReverseTebanside(node_yomiCur.Tebanside) ) ); } } catch (Exception ex) { // 既存の指し手 StringBuilder sb = new StringBuilder(); { hubNode.Foreach_NextNodes((string key, Node <ShootingStarlightable, KyokumenWrapper> nextNode, ref bool toBreak) => { sb.Append("「"); sb.Append(Util_Sky.ToSfenMoveText(nextNode.Key)); sb.Append("」"); }); } //>>>>> エラーが起こりました。 // どうにもできないので ログだけ取って、上に投げます。 Logger.Error(ex.GetType().Name + " " + ex.Message + ":新しく作った「成りの指し手」を既存ノードに追加していた時です。:追加したい指し手=「" + Util_Sky.ToSfenMoveText(newMove) + "」既存の手=" + sb.ToString()); throw; } } // gt_EndMethod: // ; }
/// <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); }
private void GetMoti( SkyConst src_Sky, out int mK, out int mR, out int mB, out int mG, out int mS, out int mN, out int mL, out int mP, out int mk, out int mr, out int mb, out int mg, out int ms, out int mn, out int ml, out int mp ) { mK = 0; mR = 0; mB = 0; mG = 0; mS = 0; mN = 0; mL = 0; mP = 0; mk = 0; mr = 0; mb = 0; mg = 0; ms = 0; mn = 0; ml = 0; mp = 0; // 先手 Fingers komasS = Util_Sky.Fingers_ByOkibaNow(src_Sky, Okiba.Sente_Komadai); foreach (Finger figKoma in komasS.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(figKoma).Now); PieceType syurui = KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku)); if (PieceType.K == syurui) { mK++; } else if (PieceType.R == syurui) { mR++; } else if (PieceType.B == syurui) { mB++; } else if (PieceType.G == syurui) { mG++; } else if (PieceType.S == syurui) { mS++; } else if (PieceType.N == syurui) { mN++; } else if (PieceType.L == syurui) { mL++; } else if (PieceType.P == syurui) { mP++; } else { } } // 後手 Fingers komasG = Util_Sky.Fingers_ByOkibaNow(src_Sky, Okiba.Gote_Komadai); foreach (Finger figKoma in komasG.Items) { RO_Star_Koma koma = Util_Koma.AsKoma(src_Sky.StarlightIndexOf((int)figKoma).Now); PieceType syurui = KomaSyurui14Array.NarazuCaseHandle(Haiyaku184Array.Syurui(koma.Haiyaku)); if (PieceType.K == syurui) { mk++; } else if (PieceType.R == syurui) { mr++; } else if (PieceType.B == syurui) { mb++; } else if (PieceType.G == syurui) { mg++; } else if (PieceType.S == syurui) { ms++; } else if (PieceType.N == syurui) { mn++; } else if (PieceType.L == syurui) { ml++; } else if (PieceType.P == syurui) { mp++; } else { } } }
public string ToSfenstring(Playerside pside) { SkyConst src_Sky = this.Value.ToKyokumenConst; StringBuilder sb = new StringBuilder(); sb.Append("sfen "); for (int dan = 1; dan <= 9; dan++) { int spaceCount = 0; for (int suji = 9; suji >= 1; suji--) { // 将棋盤上のどこかにある駒? Finger koma0 = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan) ).ToFirst(); if (Fingers.Error_1 != koma0) { if (0 < spaceCount) { sb.Append(spaceCount); spaceCount = 0; } RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma0).Now); sb.Append(KomaSyurui14Array.SfenText( Haiyaku184Array.Syurui(koma1.Haiyaku), koma1.Pside )); } else { spaceCount++; } } if (0 < spaceCount) { sb.Append(spaceCount); spaceCount = 0; } if (dan != 9) { sb.Append("/"); } } sb.Append(" "); //------------------------------------------------------------ // 先後 //------------------------------------------------------------ switch (pside) { case Playerside.P2: sb.Append("w"); break; default: sb.Append("b"); break; } sb.Append(" "); //------------------------------------------------------------ // 持ち駒 //------------------------------------------------------------ { int mK = 0; int mR = 0; int mB = 0; int mG = 0; int mS = 0; int mN = 0; int mL = 0; int mP = 0; int mk = 0; int mr = 0; int mb = 0; int mg = 0; int ms = 0; int mn = 0; int ml = 0; int mp = 0; this.GetMoti( src_Sky, out mK, out mR, out mB, out mG, out mS, out mN, out mL, out mP, out mk, out mr, out mb, out mg, out ms, out mn, out ml, out mp ); if (0 == mK + mR + mB + mG + mS + mN + mL + mP + mk + mr + mb + mg + ms + mn + ml + mp) { sb.Append("-"); } else { if (0 < mK) { if (1 < mK) { sb.Append(mK); } sb.Append("K"); } if (0 < mR) { if (1 < mR) { sb.Append(mR); } sb.Append("R"); } if (0 < mB) { if (1 < mB) { sb.Append(mB); } sb.Append("B"); } if (0 < mG) { if (1 < mG) { sb.Append(mG); } sb.Append("G"); } if (0 < mS) { if (1 < mS) { sb.Append(mS); } sb.Append("S"); } if (0 < mN) { if (1 < mN) { sb.Append(mN); } sb.Append("N"); } if (0 < mL) { if (1 < mL) { sb.Append(mL); } sb.Append("L"); } if (0 < mP) { if (1 < mP) { sb.Append(mP); } sb.Append("P"); } if (0 < mk) { if (1 < mk) { sb.Append(mk); } sb.Append("k"); } if (0 < mr) { if (1 < mr) { sb.Append(mr); } sb.Append("r"); } if (0 < mb) { if (1 < mb) { sb.Append(mb); } sb.Append("b"); } if (0 < mg) { if (1 < mg) { sb.Append(mg); } sb.Append("g"); } if (0 < ms) { if (1 < ms) { sb.Append(ms); } sb.Append("s"); } if (0 < mn) { if (1 < mn) { sb.Append(mn); } sb.Append("n"); } if (0 < ml) { if (1 < ml) { sb.Append(ml); } sb.Append("l"); } if (0 < mp) { if (1 < mp) { sb.Append(mp); } sb.Append("p"); } } } // 手目 sb.Append(" 1"); return(sb.ToString()); }
public ISfenPosition1 ToRO_Kyokumen1() { ISfenPosition1 ro_Kyokumen1 = new SfenPosition1Impl(); SkyConst src_Sky = this.Value.ToKyokumenConst; for (int suji = 1; suji < 10; suji++) { for (int dan = 1; dan < 10; dan++) { Finger koma0 = Util_Sky.Fingers_AtMasuNow( src_Sky, Util_Masu.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan) ).ToFirst(); if (Fingers.Error_1 != koma0) { RO_Star_Koma koma1 = Util_Koma.AsKoma(src_Sky.StarlightIndexOf(koma0).Now); ro_Kyokumen1.Ban[suji][dan] = KomaSyurui14Array.SfenText( Haiyaku184Array.Syurui(koma1.Haiyaku), koma1.Pside ); } } } int mK = 0; int mR = 0; int mB = 0; int mG = 0; int mS = 0; int mN = 0; int mL = 0; int mP = 0; int mk = 0; int mr = 0; int mb = 0; int mg = 0; int ms = 0; int mn = 0; int ml = 0; int mp = 0; this.GetMoti( src_Sky, out mK, out mR, out mB, out mG, out mS, out mN, out mL, out mP, out mk, out mr, out mb, out mg, out ms, out mn, out ml, out mp ); ro_Kyokumen1.MotiP1[0] = mR; ro_Kyokumen1.MotiP1[1] = mB; ro_Kyokumen1.MotiP1[2] = mG; ro_Kyokumen1.MotiP1[3] = mS; ro_Kyokumen1.MotiP1[4] = mN; ro_Kyokumen1.MotiP1[5] = mL; ro_Kyokumen1.MotiP1[6] = mP; ro_Kyokumen1.MotiP2[0] = mr; ro_Kyokumen1.MotiP2[1] = mb; ro_Kyokumen1.MotiP2[2] = mg; ro_Kyokumen1.MotiP2[3] = ms; ro_Kyokumen1.MotiP2[4] = mn; ro_Kyokumen1.MotiP2[5] = ml; ro_Kyokumen1.MotiP2[6] = mp; return(ro_Kyokumen1); }