Esempio n. 1
0
        /// <summary>
        /// Gikouの指し手に変換する
        /// </summary>
        /// <param name="move"></param>
        /// <returns></returns>
        private static GikouMove ConvertGikouMove(this SBookMove move)
        {
            GikouMove gikouMove = new GikouMove();

            if (move.Turn == PlayerColor.White)
            {
                gikouMove.to        = (uint)((move.To.FileOf() * 9) + (8 - move.To.RankOf()));
                gikouMove.from      = (uint)((move.From.FileOf() * 9) + (8 - move.From.RankOf()));
                gikouMove.promotion = move.Promotion ? 1U : 0;
                gikouMove.drop      = move.MoveType.HasFlag(MoveType.DropFlag) ? 1U : 0;
                gikouMove.piece     = (uint)move.Piece.Opp();
                gikouMove.capture   = (uint)move.CapturePiece.Opp();
            }
            else
            {
                gikouMove.to        = (uint)((8 - move.To.FileOf()) * 9 + move.To.RankOf());
                gikouMove.from      = (uint)((8 - move.From.FileOf()) * 9 + move.From.RankOf());
                gikouMove.promotion = move.Promotion ? 1U : 0;
                gikouMove.drop      = move.MoveType.HasFlag(MoveType.DropFlag) ? 1U : 0;
                gikouMove.piece     = (uint)move.Piece;
                gikouMove.capture   = (uint)move.CapturePiece;
            }

            return(gikouMove);
        }
Esempio n. 2
0
        public SBookMove(MoveData movedata, SBookState state)
        {
            this.NextState = state;

            this.Move      = SBookMove.MoveFromMoveData(movedata);
            this.Evalution = SBookMoveEvalution.None;
            this.Weight    = 1;
        }
Esempio n. 3
0
        /// <summary>
        /// 局面追加
        /// </summary>
        public void Add(SPosition pos, MoveData moveData, int weight, int value, int depth)
        {
            string key = pos.PositionToString(1);

            SBookState state = this.GetBookState(key);

            if (state == null)
            {
                // 現在の局面がない場合
                state          = new SBookState();
                state.Games    = 1;
                state.WonBlack = 0;
                state.WonWhite = 0;

                state.Position = key;

                this.books.Add(key, state);
                this.BookStates.Add(state);
            }

            if (moveData != null)
            {
                pos.Move(moveData);
                string     next_key   = pos.PositionToString(1);
                SBookState next_state = this.GetBookState(next_key);
                pos.UnMove(moveData, null);

                if (next_state == null)
                {
                    next_state          = new SBookState();
                    next_state.Games    = 1;
                    next_state.WonBlack = 0;
                    next_state.WonWhite = 0;

                    next_state.Position = next_key;

                    this.books.Add(next_key, next_state);
                    this.BookStates.Add(next_state);
                }

                SBookMove m    = new SBookMove(moveData, next_state);
                SBookMove move = state.GetMove(m);

                if (move == null)
                {
                    // 指し手が無い場合は追加
                    m.Weight = weight;
                    m.Value  = value;
                    m.Depth  = depth;
                    state.AddMove(m);

                    // next_stateのPositionをクリアする
                    next_state.Position = string.Empty;
                    move = m;
                }
            }
        }
Esempio n. 4
0
        private static SBookMove GetNextMove(SBookState bookstate)
        {
            if (bookstate == null)
            {
                return(null);
            }

            int       weight = 0;
            SBookMove next   = null;

            foreach (SBookMove move in bookstate.Moves)
            {
                if (move.Weight > weight)
                {
                    next   = move;
                    weight = move.Weight;
                }
            }

            return(next);
        }
Esempio n. 5
0
        /// <summary>
        /// Aperyの指し手に変換する
        /// </summary>
        /// <param name="move"></param>
        /// <returns></returns>
        private static ushort ConvFromToPro(this SBookMove move)
        {
            int fromToPro = 0;

            fromToPro = ((int)MakeSquare(move.To) << AperyBook.ToShift);

            if (move.MoveType.HasFlag(MoveType.DropFlag))
            {
                fromToPro |= (AperyBook.DropOfs + (int)move.Piece.TypeOf().ConvAperyPieceType()) << AperyBook.FromShift;
            }
            else
            {
                fromToPro |= (int)MakeSquare(move.From) << AperyBook.FromShift;
                if (move.MoveType.HasFlag(MoveType.Promotion))
                {
                    fromToPro |= AperyBook.PromoBit;
                }
            }

            return((ushort)fromToPro);
        }
Esempio n. 6
0
        /// <summary>
        /// 局面追加
        /// </summary>
        public void Add(SPosition pos, MoveData moveData, int weight, int value, int depth)
        {
            string key = pos.PositionToString(1);

            SBookState state = this.GetBookState(key);

            if (state == null)
            {
                // 現在の局面がない場合
                state = new SBookState();
                state.Games = 1;
                state.WonBlack = 0;
                state.WonWhite = 0;

                state.Position = key;

                this.books.Add(key, state);
                this.BookStates.Add(state);
            }

            if (moveData != null)
            {
                pos.Move(moveData);
                string next_key = pos.PositionToString(1);
                SBookState next_state = this.GetBookState(next_key);
                pos.UnMove(moveData, null);

                if (next_state == null)
                {
                    next_state = new SBookState();
                    next_state.Games = 1;
                    next_state.WonBlack = 0;
                    next_state.WonWhite = 0;

                    next_state.Position = next_key;

                    this.books.Add(next_key, next_state);
                    this.BookStates.Add(next_state);
                }

                SBookMove m = new SBookMove(moveData, next_state);
                SBookMove move = state.GetMove(m);

                if (move == null)
                {
                    // 指し手が無い場合は追加
                    m.Weight = weight;
                    m.Value = value;
                    m.Depth = depth;
                    state.AddMove(m);

                    // next_stateのPositionをクリアする
                    next_state.Position = string.Empty;
                    move = m;
                }
            }
        }
Esempio n. 7
0
 // 指し手があるかどうか
 public bool IsContainsMoves(SBookMove move)
 {
     return this.Moves.Exists(x => x.Move == move.Move);
 }
Esempio n. 8
0
 public SBookMove GetMove(SBookMove move)
 {
     return this.Moves.Find(x => x.Move == move.Move);
 }
Esempio n. 9
0
 public void AddMove(SBookMove move)
 {
     this.Moves.Add(move);
 }
Esempio n. 10
0
        /// <summary>
        /// 指し手の出力
        /// </summary>
        /// <param name="bookstate"></param>
        /// <param name="position"></param>
        /// <param name="aperyBook"></param>
        private static void WriteMoves(SBookState bookstate, SPosition position, StreamWriter wr, int depth)
        {
            if (bookstate == null)
            {
                return;
            }

            if (bookstate.Count != 0)
            {
                return; // 既に出力した
            }

            int count = 0;

            foreach (SBookMove move in bookstate.Moves)
            {
                if (move.Weight != 0)
                {
                    count++;
                }
            }

            bookstate.Count++;

            if (count != 0)
            {
                // 局面の出力
                wr.WriteLine("sfen " + position.PositionToString(depth));

                foreach (SBookMove move in bookstate.Moves)
                {
                    if (move.Weight != 0)
                    {
                        // 指し手の出力
                        MoveData moveData = move.GetMoveData();
                        string   next_str = "none";

                        SBookMove next_move = GetNextMove(move.NextState);
                        if (next_move != null)
                        {
                            MoveData nextMoveData = next_move.GetMoveData();
                            next_str = Sfen.MoveToString(nextMoveData);
                        }

                        wr.WriteLine("{0} {1} {3} {4} {2}", Sfen.MoveToString(moveData), next_str, move.Weight, move.Value, move.Depth);
                    }
                }
            }

            foreach (SBookMove move in bookstate.Moves)
            {
                // 指し手の出力
                MoveData moveData = move.GetMoveData();

                if (position.Move(moveData))
                {
                    // 再帰呼び出し
                    WriteMoves(move.NextState, position, wr, depth + 1);

                    position.UnMove(moveData, null);
                }
            }
        }
Esempio n. 11
0
 public void AddMove(SBookMove move)
 {
     this.Moves.Add(move);
 }
Esempio n. 12
0
 public SBookMove GetMove(SBookMove move)
 {
     return(this.Moves.Find(x => x.Move == move.Move));
 }
Esempio n. 13
0
 // 指し手があるかどうか
 public bool IsContainsMoves(SBookMove move)
 {
     return(this.Moves.Exists(x => x.Move == move.Move));
 }