public static string Dump_Elements(SySet <SyElement> sySet) { StringBuilder sb = new StringBuilder(); foreach (SyElement syElement in sySet.Elements) { sb.Append(Conv_Sy.Query_Word(syElement.Bitfield)); sb.Append(","); } return(sb.ToString()); }
public static New_Basho Query_Basho(ulong bitfield) { New_Basho basho; if (Masu_Honshogi.bitfieldBashoDictionary.ContainsKey(bitfield)) { basho = Masu_Honshogi.bitfieldBashoDictionary[bitfield]; } else { string word = $"升{BashoImpl.ToMasuNumber(bitfield)}"; basho = new BashoImpl(bitfield);//TODO:唯一の新規生成にしたい。 Masu_Honshogi.bitfieldBashoDictionary.Add(bitfield, basho); Conv_Sy.Put_BitfieldWord(bitfield, word); } return(basho); }
/// <summary> /// 汎用。 /// </summary> /// <param name="collection"></param> /// <returns></returns> public static string Dump(List_OneAndMulti <T1, T2> collection) { int count = 0; StringBuilder sb = new StringBuilder(); { foreach (Couple <T1, T2> item in collection.Items) { if (item.B is SySet <SyElement> ) { foreach (SyElement syElement in ((SySet <SyElement>)item.B).Elements) { sb.AppendLine($"({ count }) a=[{ item.A.ToString() }] b=[{ Conv_Sy.Query_Word(syElement.Bitfield) }]"); count++; } } else { sb.AppendLine($"({ count }) a=[{ item.A.ToString() }] b=[{ item.B.ToString() }]"); count++; } } } return(sb.ToString()); }
static Michi187Array() { //---------- // 筋187 //---------- Michi187Array.items = new List <SySet <SyElement> >(); //---------------------------------------- // kanjiToEnum //---------------------------------------- // ファイルでの指定→ビットフィールド 変換用 // // 将棋盤の81マスの符号だぜ☆ 0~80の、81個の連番を振っているぜ☆ // // 再利用に利用。 Conv_Sy.Put_WordBitfield("1一", Masu_Honshogi.nban11_1一 + 0);//1一 Conv_Sy.Put_WordBitfield("1二", Masu_Honshogi.nban11_1一 + 1); Conv_Sy.Put_WordBitfield("1三", Masu_Honshogi.nban11_1一 + 2); Conv_Sy.Put_WordBitfield("1四", Masu_Honshogi.nban11_1一 + 3); Conv_Sy.Put_WordBitfield("1五", Masu_Honshogi.nban11_1一 + 4); Conv_Sy.Put_WordBitfield("1六", Masu_Honshogi.nban11_1一 + 5); Conv_Sy.Put_WordBitfield("1七", Masu_Honshogi.nban11_1一 + 6); Conv_Sy.Put_WordBitfield("1八", Masu_Honshogi.nban11_1一 + 7); Conv_Sy.Put_WordBitfield("1九", Masu_Honshogi.nban11_1一 + 8); Conv_Sy.Put_WordBitfield("2一", Masu_Honshogi.nban11_1一 + 9); Conv_Sy.Put_WordBitfield("2二", Masu_Honshogi.nban11_1一 + 10); Conv_Sy.Put_WordBitfield("2三", Masu_Honshogi.nban11_1一 + 11); Conv_Sy.Put_WordBitfield("2四", Masu_Honshogi.nban11_1一 + 12); Conv_Sy.Put_WordBitfield("2五", Masu_Honshogi.nban11_1一 + 13); Conv_Sy.Put_WordBitfield("2六", Masu_Honshogi.nban11_1一 + 14); Conv_Sy.Put_WordBitfield("2七", Masu_Honshogi.nban11_1一 + 15); Conv_Sy.Put_WordBitfield("2八", Masu_Honshogi.nban11_1一 + 16); Conv_Sy.Put_WordBitfield("2九", Masu_Honshogi.nban11_1一 + 17); Conv_Sy.Put_WordBitfield("3一", Masu_Honshogi.nban11_1一 + 18); Conv_Sy.Put_WordBitfield("3二", Masu_Honshogi.nban11_1一 + 19); Conv_Sy.Put_WordBitfield("3三", Masu_Honshogi.nban11_1一 + 20); Conv_Sy.Put_WordBitfield("3四", Masu_Honshogi.nban11_1一 + 21); Conv_Sy.Put_WordBitfield("3五", Masu_Honshogi.nban11_1一 + 22); Conv_Sy.Put_WordBitfield("3六", Masu_Honshogi.nban11_1一 + 23); Conv_Sy.Put_WordBitfield("3七", Masu_Honshogi.nban11_1一 + 24); Conv_Sy.Put_WordBitfield("3八", Masu_Honshogi.nban11_1一 + 25); Conv_Sy.Put_WordBitfield("3九", Masu_Honshogi.nban11_1一 + 26); Conv_Sy.Put_WordBitfield("4一", Masu_Honshogi.nban11_1一 + 27); Conv_Sy.Put_WordBitfield("4二", Masu_Honshogi.nban11_1一 + 28); Conv_Sy.Put_WordBitfield("4三", Masu_Honshogi.nban11_1一 + 29); Conv_Sy.Put_WordBitfield("4四", Masu_Honshogi.nban11_1一 + 30); Conv_Sy.Put_WordBitfield("4五", Masu_Honshogi.nban11_1一 + 31); Conv_Sy.Put_WordBitfield("4六", Masu_Honshogi.nban11_1一 + 32); Conv_Sy.Put_WordBitfield("4七", Masu_Honshogi.nban11_1一 + 33); Conv_Sy.Put_WordBitfield("4八", Masu_Honshogi.nban11_1一 + 34); Conv_Sy.Put_WordBitfield("4九", Masu_Honshogi.nban11_1一 + 35); Conv_Sy.Put_WordBitfield("5一", Masu_Honshogi.nban11_1一 + 36); Conv_Sy.Put_WordBitfield("5二", Masu_Honshogi.nban11_1一 + 37); Conv_Sy.Put_WordBitfield("5三", Masu_Honshogi.nban11_1一 + 38); Conv_Sy.Put_WordBitfield("5四", Masu_Honshogi.nban11_1一 + 39); Conv_Sy.Put_WordBitfield("5五", Masu_Honshogi.nban11_1一 + 40); Conv_Sy.Put_WordBitfield("5六", Masu_Honshogi.nban11_1一 + 41); Conv_Sy.Put_WordBitfield("5七", Masu_Honshogi.nban11_1一 + 42); Conv_Sy.Put_WordBitfield("5八", Masu_Honshogi.nban11_1一 + 43); Conv_Sy.Put_WordBitfield("5九", Masu_Honshogi.nban11_1一 + 44); Conv_Sy.Put_WordBitfield("6一", Masu_Honshogi.nban11_1一 + 45); Conv_Sy.Put_WordBitfield("6二", Masu_Honshogi.nban11_1一 + 46); Conv_Sy.Put_WordBitfield("6三", Masu_Honshogi.nban11_1一 + 47); Conv_Sy.Put_WordBitfield("6四", Masu_Honshogi.nban11_1一 + 48); Conv_Sy.Put_WordBitfield("6五", Masu_Honshogi.nban11_1一 + 49); Conv_Sy.Put_WordBitfield("6六", Masu_Honshogi.nban11_1一 + 50); Conv_Sy.Put_WordBitfield("6七", Masu_Honshogi.nban11_1一 + 51); Conv_Sy.Put_WordBitfield("6八", Masu_Honshogi.nban11_1一 + 52); Conv_Sy.Put_WordBitfield("6九", Masu_Honshogi.nban11_1一 + 53); Conv_Sy.Put_WordBitfield("7一", Masu_Honshogi.nban11_1一 + 54); Conv_Sy.Put_WordBitfield("7二", Masu_Honshogi.nban11_1一 + 55); Conv_Sy.Put_WordBitfield("7三", Masu_Honshogi.nban11_1一 + 56); Conv_Sy.Put_WordBitfield("7四", Masu_Honshogi.nban11_1一 + 57); Conv_Sy.Put_WordBitfield("7五", Masu_Honshogi.nban11_1一 + 58); Conv_Sy.Put_WordBitfield("7六", Masu_Honshogi.nban11_1一 + 59); Conv_Sy.Put_WordBitfield("7七", Masu_Honshogi.nban11_1一 + 60); Conv_Sy.Put_WordBitfield("7八", Masu_Honshogi.nban11_1一 + 61); Conv_Sy.Put_WordBitfield("7九", Masu_Honshogi.nban11_1一 + 62); Conv_Sy.Put_WordBitfield("8一", Masu_Honshogi.nban11_1一 + 63); Conv_Sy.Put_WordBitfield("8二", Masu_Honshogi.nban11_1一 + 64); Conv_Sy.Put_WordBitfield("8三", Masu_Honshogi.nban11_1一 + 65); Conv_Sy.Put_WordBitfield("8四", Masu_Honshogi.nban11_1一 + 66); Conv_Sy.Put_WordBitfield("8五", Masu_Honshogi.nban11_1一 + 67); Conv_Sy.Put_WordBitfield("8六", Masu_Honshogi.nban11_1一 + 68); Conv_Sy.Put_WordBitfield("8七", Masu_Honshogi.nban11_1一 + 69); Conv_Sy.Put_WordBitfield("8八", Masu_Honshogi.nban11_1一 + 70); Conv_Sy.Put_WordBitfield("8九", Masu_Honshogi.nban11_1一 + 71); Conv_Sy.Put_WordBitfield("9一", Masu_Honshogi.nban11_1一 + 72); Conv_Sy.Put_WordBitfield("9二", Masu_Honshogi.nban11_1一 + 73); Conv_Sy.Put_WordBitfield("9三", Masu_Honshogi.nban11_1一 + 74); Conv_Sy.Put_WordBitfield("9四", Masu_Honshogi.nban11_1一 + 75); Conv_Sy.Put_WordBitfield("9五", Masu_Honshogi.nban11_1一 + 76); Conv_Sy.Put_WordBitfield("9六", Masu_Honshogi.nban11_1一 + 77); Conv_Sy.Put_WordBitfield("9七", Masu_Honshogi.nban11_1一 + 78); Conv_Sy.Put_WordBitfield("9八", Masu_Honshogi.nban11_1一 + 79); Conv_Sy.Put_WordBitfield("9九", Masu_Honshogi.nban11_1一 + 80); }
/// <summary> /// /// </summary> /// <param name="filepath1"></param> /// <returns></returns> public static bool Load(string filepath1) { bool successful = false; string filepath2 = Path.Combine(Application.StartupPath, filepath1); List <List <string> > rows = null; if (!File.Exists(filepath2)) { MessageBox.Show($"ファイルがありません。\nfilepath2=[{filepath2}]", "情報"); rows = null; goto gt_EndMethod; } rows = Util_Csv.ReadCsv(filepath2); // 最初の1行は削除。 rows.RemoveRange(0, 1); Michi187Array.Items.Clear(); // 構文解析は大雑把です。 // (1)空セルは無視します。 // (2)「@DEFINE」セルが処理開始の合図です。 // (3)次のセルには集合の名前です。「味方陣」「平野部」「敵陣」のいずれかです。 // (4)次のセルは「=」です。 // (5)次のセルは「{」です。 // (6)次に「}」セルが出てくるまで、符号のセルが連続します。「1九」「1八」など。 // (7)「}」セルで、@DEFINEの処理は終了です。 foreach (List <string> row in rows) { // 2列目は、道名。 SySet <SyElement> michi187 = new SySet_Ordered <SyElement>(row[1].Trim()); SySet <SyElement> michiPart = null; // 各行の先頭1列目(連番)と2列目(道名)は削除。 row.RemoveRange(0, 2); bool isPart_Define = false; //@DEFINEパート bool isPart_Define_Member = false; //符号パート foreach (string cell1 in row) { string cell = cell1.Trim(); if (cell == "") { goto gt_Next1; } if (isPart_Define) { if (cell == "=") { goto gt_Next1; } if (cell == "{") { isPart_Define_Member = true; goto gt_Next1; } if (cell == "}") { isPart_Define_Member = false; isPart_Define = false; goto gt_Next1; } if (isPart_Define_Member) { // 「1一」を「1」に変換します。 SyElement masu81 = Masu_Honshogi.Query_Basho(Conv_Sy.Query_Bitfield(cell)); michiPart.AddElement(masu81); } else { switch (cell) { case "味方陣": michiPart = new SySet_Ordered <SyElement>("味方陣"); michi187.AddSupersets(michiPart); goto gt_Next1; case "平野部": michiPart = new SySet_Ordered <SyElement>("平野部"); michi187.AddSupersets(michiPart); goto gt_Next1; case "敵陣": michiPart = new SySet_Ordered <SyElement>("敵陣"); michi187.AddSupersets(michiPart); goto gt_Next1; default: throw new Exception($"未定義のキーワードです。[{cell}]"); } } } else { if (cell == "@DEFINE") { isPart_Define = true; goto gt_Next1; } } gt_Next1: ; } Michi187Array.Items.Add(michi187); } successful = true; gt_EndMethod: return(successful); }
/// <summary> /// 符号1「7g7f」を元に、move を作ります。 /// /// <[再生]、[コマ送り]で呼び出されます> /// </summary> /// <returns></returns> public static void ToMove( bool isHonshogi, string str1, //123456789 か、 PLNSGKRB string str2, //abcdefghi か、 * string str3, //123456789 string str4, //abcdefghi string strNari, //+ out IMove move, KifuTree kifu, string hint ) { move = Util_Sky258A.NullObjectMove; Node <IMove, KyokumenWrapper> siteiNode = kifu.CurNode; SkyConst src_Sky = siteiNode.Value.KyokumenConst; //kifu.AssertPside(kifu.CurNode, $"str1={str1}"); Playerside pside1 = src_Sky.KaisiPside; #if DEBUG Debug.Assert(!Conv_MasuHandle.OnKomabukuro(Conv_SyElement.ToMasuNumber(((RO_Star)src_Sky.StarlightIndexOf((Finger)0).Now).Masu)), $"[{src_Sky.Temezumi}]手目、駒が駒袋にあった。"); #endif PieceType uttaSyurui; // 打った駒の種類 int srcSuji = Util_Koma.CTRL_NOTHING_PROPERTY_SUJI; int srcDan = Util_Koma.CTRL_NOTHING_PROPERTY_DAN; if ("*" == str2) { //>>>>>>>>>> 「打」でした。 Conv_String268.SfenUttaSyurui(str1, out uttaSyurui); } else { //>>>>>>>>>> 指しました。 uttaSyurui = PieceType.None;//打った駒はない☆ //------------------------------ // 1 //------------------------------ if (!int.TryParse(str1, out srcSuji)) { } //------------------------------ // 2 //------------------------------ srcDan = Conv_Alphabet.ToInt(str2); } //------------------------------ // 3 //------------------------------ int suji; if (!int.TryParse(str3, out suji)) { } //------------------------------ // 4 //------------------------------ int dan; dan = Conv_Alphabet.ToInt(str4); Finger koma; if ("*" == str2) { //>>>>> 「打」でした。 // 駒台から、打った種類の駒を取得 koma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase( siteiNode.Value.KyokumenConst, Conv_Playerside.ToKomadai(pside1),//FIXME: uttaSyurui); if (Fingers.Error_1 == koma) { throw new Exception($"TuginoItte_Sfen#GetData_FromTextSub:駒台から種類[{uttaSyurui}]の駒を掴もうとしましたが、エラーでした。"); } //// FIXME: 打のとき、srcSuji、srcDan が Int.Min } else { //>>>>> 打ではないとき SyElement masu1 = Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, srcSuji, srcDan); Fingers komas1 = Util_Sky_FingersQuery.InMasuNow(//これが空っぽになるときがある。 src_Sky, masu1 ); koma = komas1.ToFirst(); if (Fingers.Error_1 == koma) { // // エラーの理由: // 0手目、平手局面を想定していたが、駒がすべて駒袋に入っているときなど // var sky2 = Util_Sky307.Json_1Sky(src_Sky, "エラー駒になったとき", $"{hint}_SF解3", src_Sky.Temezumi); string text2; if (masu1 is New_Basho) { text2 = $@"masu1.masuNumber=[{((New_Basho)masu1).MasuNumber}] komas1.Count=[{komas1.Count}]"; } else { text2 = "masu1.masuNumber=New_Basho型じゃない。"; } StringBuilder sb = new StringBuilder(); throw new Exception($@"TuginoItte_Sfen#GetData_FromTextSub:SFEN解析中の失敗:SFENでは [{srcSuji}]筋、[{srcDan}]段 にある駒を掴めと指示がありましたが、 将棋盤データの[{Conv_Sy.Query_Word(masu1.Bitfield)}]マスには、(駒が全て駒袋に入っているのか)駒がありませんでした。 hint=[{hint}] {text2} isHonshogi=[{isHonshogi}] str1=[{str1}] str2=[{str2}] str3=[{str3}] str4=[{str4}] strNari=[{strNari}] src_Sky.Temezumi=[{src_Sky.Temezumi}] 局面 = sfen {Util_StartposExporter.ToSfenstring(new StartposExporterImpl(src_Sky), true)} {sky2} "); } } PieceType dstSyurui; PieceType srcSyurui; Okiba srcOkiba; SyElement srcMasu; if ("*" == str2) { //>>>>> 打った駒の場合 dstSyurui = uttaSyurui; srcSyurui = uttaSyurui; switch (pside1) { case Playerside.P2: srcOkiba = Okiba.Gote_Komadai; break; case Playerside.P1: srcOkiba = Okiba.Sente_Komadai; break; default: srcOkiba = Okiba.Empty; break; } Finger srcKoma = Util_Sky_FingerQuery.InOkibaSyuruiNowIgnoreCase(siteiNode.Value.KyokumenConst, srcOkiba, srcSyurui); RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(srcKoma).Now); srcMasu = dstKoma.Masu; } else { //>>>>> 盤上の駒を指した場合 RO_Star dstKoma = Util_Starlightable.AsKoma(src_Sky.StarlightIndexOf(koma).Now); dstSyurui = Util_Komahaiyaku184.Syurui(dstKoma.Haiyaku); srcSyurui = dstSyurui; //駒は「元・種類」を記憶していませんので、「現・種類」を指定します。 srcOkiba = Okiba.ShogiBan; srcMasu = Util_Masu10.OkibaSujiDanToMasu(srcOkiba, srcSuji, srcDan); } //------------------------------ // 5 //------------------------------ if ("+" == strNari) { // 成りました dstSyurui = Util_Komasyurui14.NariCaseHandle[(int)dstSyurui]; } //------------------------------ // 結果 //------------------------------ // 棋譜 move = new RO_Starbeam( //koma,//TODO: new RO_Star( pside1, srcMasu,//FIXME:升ハンドルにしたい srcSyurui ), new RO_Star( pside1, Util_Masu10.OkibaSujiDanToMasu(Okiba.ShogiBan, suji, dan),//符号は将棋盤の升目です。 FIXME:升ハンドルにしたい dstSyurui ), PieceType.None//符号からは、取った駒は分からない ); }
/// <summary> /// 作りかけ。 /// </summary> /// <param name="filepath"></param> /// <param name="tedokuHistory"></param> public static void WriteLog(string filepath, TedokuHistory tedokuHistory) { StringBuilder sb = new StringBuilder(); int i; // // 歩 // i = 0; foreach (List <SyElement> list in tedokuHistory.Fu___) { sb.Append("Fu___["); sb.Append(string.Format("{0,2:0}", i)); sb.Append("] "); foreach (SyElement masu in list) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); i++; } // // 香 // i = 0; foreach (List <SyElement> list in tedokuHistory.Kyo__) { sb.Append("Kyo__["); sb.Append(string.Format("{0,2:0}", i)); sb.Append("] "); foreach (SyElement masu in list) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); i++; } // // 桂 // i = 0; foreach (List <SyElement> list in tedokuHistory.Kei__) { sb.Append("Kei__["); sb.Append(string.Format("{0,2:0}", i)); sb.Append("] "); foreach (SyElement masu in list) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); i++; } // // 銀 // i = 0; foreach (List <SyElement> list in tedokuHistory.Gin__) { sb.Append("Gin__["); sb.Append(string.Format("{0,2:0}", i)); sb.Append("] "); foreach (SyElement masu in list) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); i++; } // // 金 // i = 0; foreach (List <SyElement> list in tedokuHistory.Kin__) { sb.Append("Kin__["); sb.Append(string.Format("{0,2:0}", i)); sb.Append("] "); foreach (SyElement masu in list) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); i++; } // // 玉 // { sb.Append("Gyoku[--] "); foreach (SyElement masu in tedokuHistory.Gyoku) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); } // // 飛 // i = 0; foreach (List <SyElement> list in tedokuHistory.Hisya) { sb.Append("Hisya["); sb.Append(string.Format("{0,2:0}", i)); sb.Append("] "); foreach (SyElement masu in list) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); i++; } // // 角 // i = 0; foreach (List <SyElement> list in tedokuHistory.Kaku_) { sb.Append("Kaku_["); sb.Append(string.Format("{0,2:0}", i)); sb.Append("] "); foreach (SyElement masu in list) { sb.Append(Conv_Sy.Query_Word(masu.Bitfield)); sb.Append(","); } sb.AppendLine(); i++; } #if DEBUG File.WriteAllText(filepath, sb.ToString()); #endif }