Пример #1
0
        /// <summary>
        /// クローンを作ります。
        /// </summary>
        /// <param name="src"></param>
        public SkyBuffer(Sky src)
        {
            // 手得ヒストリーのクローン
            this.tedokuHistory = TedokuHistoryConst.New_Clone(src.TedokuHistory);

            // 手番のクローン
            this.kaisiPside = src.KaisiPside;
            this.temezumi   = src.Temezumi;

            // 星々のクローン
            this.starlights = new List <IMoveHalf>();
            src.Foreach_Starlights((Finger finger, IMoveHalf light, ref bool toBreak) =>
            {
                this.starlights.Add(light);
            });
        }
Пример #2
0
        /// <summary>
        /// 手得ヒストリーを進めます。
        /// </summary>
        /// <param name="src"></param>
        /// <param name="komasyurui"></param>
        /// <param name="index"></param>
        /// <param name="masu"></param>
        /// <returns></returns>
        public static TedokuHistory NewInstance_AppendSasitamasu(TedokuHistory src, PieceType komasyurui, int index, SyElement masu)
        {
            TedokuHistoryConst result = (TedokuHistoryConst)TedokuHistoryConst.New_Clone(src);

            // 持駒を打った場合はどうする?
            switch (komasyurui)
            {
            case PieceType.PP:                                      //どの歩?
            case PieceType.P: result.Fu___[index].Add(masu); break; //suji-1=index

            case PieceType.PL:
            case PieceType.L: result.Kyo__[index].Add(masu); break;

            case PieceType.PN:
            case PieceType.N: result.Kei__[index].Add(masu); break;

            case PieceType.PS:
            case PieceType.S: result.Gin__[index].Add(masu); break;

            case PieceType.G: result.Kin__[index].Add(masu); break;

            case PieceType.K: result.Gyoku.Add(masu); break;

            case PieceType.PR:
            case PieceType.R: result.Hisya[index].Add(masu); break;

            case PieceType.PB:
            case PieceType.B: result.Kaku_[index].Add(masu); break;

            default: break;
            }

#if DEBUG
            //
            // ログ出力
            //
            Util_TedokuHistory.WriteLog(EngineConf.GetResourceFullPath("N19TedokuKeisanLog"), result);
#endif

            return(result);
        }
Пример #3
0
        /// <summary>
        /// クローンを作ります。
        /// </summary>
        /// <param name="src"></param>
        private SkyConst(Sky src, bool toReversePlayerside, int update_temezumi_orMinus1, Finger[] finger1, IMoveHalf[] light1,
                         //
                         // 手得計算
                         //
                         PieceType tedokuKeisan_komasyurui, int tedokukeisan_index, SyElement tedokukeisan_sasitamasu)
        {
            Debug.Assert(src.Count == 40, $"本将棋とみなしてテスト中。sky.Starlights.Count=[{src.Count}]");//将棋の駒の数

            if (tedokuKeisan_komasyurui == PieceType.None)
            {
                //----------------------------------------
                // 手得計算のヒストリーを作らない場合
                //----------------------------------------

                // 手得ヒストリーのクローン
                this.tedokuHistory = TedokuHistoryConst.New_Clone(src.TedokuHistory);
            }
            else
            {
                //----------------------------------------
                // 手得計算のヒストリーを作る場合
                //----------------------------------------

                // 手駒ヒストリーへの追加
                this.tedokuHistory = TedokuHistoryConst.NewInstance_AppendSasitamasu(
                    src.TedokuHistory,
                    tedokuKeisan_komasyurui,
                    tedokukeisan_index,
                    tedokukeisan_sasitamasu
                    );
            }


            // 手番のクローン
            if (toReversePlayerside)
            {
                this.kaisiPside = Conv_Playerside.Reverse(src.KaisiPside);
            }
            else
            {
                this.kaisiPside = src.KaisiPside;
            }

            // 手目済み
            if (-1 == update_temezumi_orMinus1)
            {
                // そのまま
                this.temezumi = src.Temezumi;
            }
            else
            {
                // 上書き更新
                this.temezumi = update_temezumi_orMinus1;
            }

            // 星々のクローン
            this.starlights = new List <IMoveHalf>();
            src.Foreach_Starlights((Finger finger2, IMoveHalf light2, ref bool toBreak2) =>
            {
                this.starlights.Add(light2);
            });

            //
            // 追加分があれば。
            //
            for (int i = 0; i < finger1.Length; i++)
            {
                if (finger1[i] != Fingers.Error_1)
                {
                    if (this.starlights.Count == (int)finger1[i])
                    {
                        // オブジェクトを追加します。
                        this.starlights.Add(light1[i]);
                    }
                    else if (this.starlights.Count + 1 <= (int)finger1[i])
                    {
                        // エラー
                        Debug.Assert((int)finger1[i] < this.starlights.Count, $"要素の個数より2大きいインデックスを指定しました。 インデックス[{(int)finger1[i]}] 要素の個数[{this.starlights.Count}]");

                        throw new Exception($"{this.GetType().Name}#SetStarPos: リストの要素より2多いインデックスを指定されましたので、追加しません。starIndex=[{finger1[i]}] / this.stars.Count=[{this.starlights.Count}]");
                    }
                    else
                    {
                        this.starlights[(int)finger1[i]] = light1[i];
                    }
                }
            }
        }