Exemplo n.º 1
0
        /// <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);
                    }
                }
            }
        }