public ShogisasiImpl(ShogiEngine owner) { this.Owner = owner; this.Kokoro = new KokoroImpl(this.Owner); this.MinimaxEngine = new MinimaxEngineImpl(this.Owner); this.EdagariEngine = new ScoreSiboriEngine(); this.ErabuEngine = new ErabuEngine(); this.Seikaku = new Seikaku(); this.kyHyokaWriter = new KyHyokaWriterImpl(); }
/// <summary> /// 頭の隅(手の流れ)を作成します☆w /// </summary> /// <param name="input_myPside"></param> /// <param name="save_node">狙い作成時の局面を状況として記録するために読取します。</param> /// <param name="input_seikaku"></param> public void Omoituki( Playerside input_myPside, KifuNode save_node, Seikaku input_seikaku ) { SkyConst src_Sky = save_node.Value.ToKyokumenConst; // FIXME: どの狙いか どんぶり勘定になっている☆ { List <Tenonagare> removee = new List <Tenonagare>(); foreach (Tenonagare atamanosumi in this.TenonagareItems) { // 失敗回数が、粘り強さを超えたとき if (input_seikaku.NebariDuyosa < atamanosumi.ResultKioku.Sippai) { // 今いだいている妄想を捨てます。 removee.Add(atamanosumi); } } foreach (Tenonagare atamanosumi in removee) { this.TenonagareItems.Remove(atamanosumi); } } // // とりあえずサンプルとして1つ作ってみます。 // { //MessageBox.Show( "とりあえずサンプルとして1つ作ってみます。","デバッグ"); Tenonagare atamanosumi; // 2Pの飛車先の歩の付き捨て { if (input_myPside == Playerside.P2) { //MessageBox.Show("プレイヤー2です。", "デバッグ"); // 8二に飛車がいる前提です。 RO_Star_Koma koma82 = Util_Sky.Koma_AtMasuNow(src_Sky, Masu_Honshogi.ban82_8二, Playerside.P2, PieceType.R); if (null != koma82) { //MessageBox.Show("8二に飛車がいました。", "デバッグ"); // 8二に飛車がいた。 // 飛車先の駒は? RO_Star_Koma koma83 = Util_Sky.Koma_AtMasuNow(src_Sky, Masu_Honshogi.ban83_8三, Playerside.P2, PieceType.P); RO_Star_Koma koma84 = Util_Sky.Koma_AtMasuNow(src_Sky, Masu_Honshogi.ban84_8四, Playerside.P2); RO_Star_Koma koma85 = Util_Sky.Koma_AtMasuNow(src_Sky, Masu_Honshogi.ban85_8五, Playerside.P2); RO_Star_Koma koma86 = Util_Sky.Koma_AtMasuNow(src_Sky, Masu_Honshogi.ban86_8六, Playerside.P2); RO_Star_Koma koma87 = Util_Sky.Koma_AtMasuNow(src_Sky, Masu_Honshogi.ban87_8七, Playerside.P2); RO_Star_Koma koma88 = Util_Sky.Koma_AtMasuNow(src_Sky, Masu_Honshogi.ban88_8八, Playerside.P2); if (koma83 != null && koma84 == null && koma85 == null && koma86 == null && koma87 == null && koma88 == null) { //MessageBox.Show("8三に自歩があり、8四~8八に自駒はありませんでした。", "デバッグ"); // 8三に自歩があり、8四~8八に自駒が無ければ。 // 8三の駒を、8九に向かって前進させます。 atamanosumi = new TenonagareImpl(save_node.ToRO_Kyokumen1(), TenonagareName.Tukisute, 1000.0d, koma83, //どの駒を null, Masu_Honshogi.ban83_8三 //初期位置 ); goto gt_Next1; } } } } int random = LarabeRandom.Random.Next(-9, 10); if (0 < random) { // // 自駒をランダムに1つ指定し、目指すマスをランダムに1つ指定し、進ませます。 // 係数は下げます。 // // どの駒が RO_Star_Koma koma1; switch (input_myPside) { case Playerside.P1: koma1 = Util_Koma.FromFinger(src_Sky, LarabeRandom.Random.Next(0, 19)); break; case Playerside.P2: koma1 = Util_Koma.FromFinger(src_Sky, LarabeRandom.Random.Next(20, 39)); break; default: koma1 = Util_Koma.FromFinger(src_Sky, -1); break; } atamanosumi = new TenonagareImpl(save_node.ToRO_Kyokumen1(), TenonagareName.Ido, // 「移動」タイプの狙い 0.05d, //1.0d, koma1, null, new Basho(LarabeRandom.Random.Next(0, 80))// 目指すマス ); } else { // // 自駒をランダムに1つ指定し、相手の駒をランダムに1つ指定し、 // 取るように目指させます。 // 係数は下げます。 // RO_Star_Koma koma1; switch (input_myPside) { // FIXME: 持ち駒を考えられていない。 case Playerside.P1: koma1 = Util_Koma.FromFinger(src_Sky, LarabeRandom.Random.Next(0, 19)); break; case Playerside.P2: koma1 = Util_Koma.FromFinger(src_Sky, LarabeRandom.Random.Next(20, 39)); break; default: koma1 = Util_Koma.FromFinger(src_Sky, -1); break; } // どの駒を RO_Star_Koma koma2; switch (input_myPside) { // FIXME: 持ち駒を考えられていない。 case Playerside.P1: koma2 = Util_Koma.FromFinger(src_Sky, LarabeRandom.Random.Next(20, 39)); break; case Playerside.P2: koma2 = Util_Koma.FromFinger(src_Sky, LarabeRandom.Random.Next(0, 19)); break; default: koma2 = Util_Koma.FromFinger(src_Sky, -1); break; } // 「取る」タイプの狙い atamanosumi = new TenonagareImpl(save_node.ToRO_Kyokumen1(), TenonagareName.Toru, 0.1d,//1.0d, koma1, koma2, new Basho(0)); // 目指す } gt_Next1: // 作った妄想は履歴に追加。 //MessageBox.Show("作った妄想は履歴に追加。", "デバッグ"); this.AddTenonagare(atamanosumi); } // FIXME: 「手の流れ」が?個を超えてたら、5個消していく☆秒読みで10超えてしまうので。 { int tenonagareMax = 15;//25 int kesuKazu = 5; if (tenonagareMax < this.TenonagareItems.Count) { int iKesu = kesuKazu;// tenonagareMax - this.TenonagareItems.Count + 5; List <Tenonagare> removee = new List <Tenonagare>(); foreach (Tenonagare nagare in this.TenonagareItems) { if (iKesu < 1) { break; } // 失敗回数が、粘り強さを超えたとき if (input_seikaku.NebariDuyosa < nagare.ResultKioku.Sippai) { // 今いだいている妄想を捨てます。 removee.Add(nagare); } iKesu--; } foreach (Tenonagare nagare in removee) { this.TenonagareItems.Remove(nagare); } } } }