예제 #1
0
        /// <summary>
        /// オセロの初期状態として盤を生成
        /// </summary>
        /// <returns></returns>
        public static ReversiBoard InitBoard()
        {
            var res = new ReversiBoard()
            {
                //オセロの初期状態
                black = 0x0000000810000000,
                white = 0x0000001008000000
            };

            return(res);
        }
예제 #2
0
        /// <summary>
        /// 盤の情報をもとに思考し、次の手を返す
        /// </summary>
        /// <param name="board"></param>
        /// <param name="player"></param>
        /// <returns></returns>
        public Reversi.Core.ReversiMove Think(ReversiBoard board, StoneType player)
        {
            this.board  = board;
            this.player = player;
            legalMoves  = board.SearchLegalMoves(player); //合法手
            if (legalMoves.Count == 0)
            {
                throw new InvalidOperationException("合法手がありません");
            }
            else
            {
                var best     = 0;
                var bestMove = default(ReversiMove);
                foreach (var item in board.SearchLegalMoves(player))
                {
                    var child = board.AddStone(item.Row, item.Col, player);
                    switch (player)
                    {
                    case StoneType.None:
                        break;

                    case StoneType.Sente:
                        if (best < child.NumOfBlack())
                        {
                            best     = child.NumOfBlack();
                            bestMove = item;
                        }
                        break;

                    case StoneType.Gote:
                        if (best < child.NumOfWhite())
                        {
                            best     = child.NumOfWhite();
                            bestMove = item;
                        }
                        break;

                    default:
                        break;
                    }
                }
                return(bestMove);
            }
        }
예제 #3
0
        /// <summary>
        /// 文字列から記録を生成
        /// </summary>
        /// <param name="record"></param>
        /// <returns></returns>
        public static MatchRecord FromRecordString(string record)
        {
            MatchRecord res   = new MatchRecord();
            var         array = record.Split('\n');

            foreach (var bits in array)
            {
                if (bits == "")
                {
                    break;
                }
                var bitArray = bits.Split('|');
                var bl       = Convert.ToUInt64(bitArray[0], 2);
                var wh       = Convert.ToUInt64(bitArray[1], 2);
                var board    = new ReversiBoard(bl, wh);
                res.Boards.Add(board);
            }
            return(res);
        }
예제 #4
0
        /// <summary>
        /// 石を打つ
        /// </summary>
        /// <param name="row"></param>
        /// <param name="col"></param>
        /// <param name="player"></param>
        /// <returns></returns>
        public ReversiBoard AddStone(int row, int col, StoneType player)
        {
            this.player = player;
            ulong pl  = 0;
            ulong opp = 0;

            switch (this.player)
            {
            case StoneType.None:
                break;

            case StoneType.Sente:
                pl  = black;
                opp = white;
                break;

            case StoneType.Gote:
                pl  = white;
                opp = black;
                break;

            default:
                break;
            }
            ulong mov = (ulong)1 << (8 * row + col);
            var   rev = Reverse(pl, opp, mov, Right)
                        | Reverse(pl, opp, mov, Left)
                        | Reverse(pl, opp, mov, Up)
                        | Reverse(pl, opp, mov, Down)
                        | Reverse(pl, opp, mov, UpRight)
                        | Reverse(pl, opp, mov, UpLeft)
                        | Reverse(pl, opp, mov, DownRight)
                        | Reverse(pl, opp, mov, DownLeft);

            if (rev != 0)
            {
                pl  ^= mov | rev;
                opp ^= rev;
                ReversiBoard board = new ReversiBoard();
                switch (player)
                {
                case StoneType.Sente:
                    board.black = pl;
                    board.white = opp;
                    break;

                case StoneType.Gote:
                    board.black = opp;
                    board.white = pl;
                    break;

                default:
                    break;
                }
                return(board);
            }
            else
            {
                throw new ArgumentException("非合法手です");
            }
        }