Exemple #1
0
        static void Main(string[] args)
        {
            var game      = new Piskvorky3D();
            var alphabeta = new AlphaBeta <Position, ulong>(game);

            var moves = new List <ulong>();

            while (true)
            {
                var eval = alphabeta.Alphabeta_recursive(ref moves, 8, game.InitialState, double.MinValue, double.MaxValue);
                Console.WriteLine("Eval: " + eval);
                moves.Reverse();
                var state = game.InitialState; //todo clone

                game.Apply(ref state, moves.First());
                Console.WriteLine(BitBoard.DebugPrintUlong(state.White) + "\n");
                Console.WriteLine(BitBoard.DebugPrintUlong(state.Black) + "\n");

                int opponentMove  = int.Parse(Console.ReadLine()); // todo zkontrolovat 1-16
                var possibleMoves = game.Generator.GetActions(state);


                ulong ONE    = (ulong)1;
                ulong column = (ONE) + (ONE << 16) + (ONE << 32) + (ONE << 48);
                column = (column << (opponentMove - 1));

                foreach (var move in possibleMoves)
                {
                    if ((column & move) != 0)
                    {
                        game.Apply(ref state, move);
                        break;
                    }
                }

                Console.WriteLine(BitBoard.DebugPrintUlong(state.White) + "\n");
                Console.WriteLine(BitBoard.DebugPrintUlong(state.Black) + "\n");
            }


            //var generator = new StonePlacementGenerator();
            //
            //var pos = new Position(0, 0, 1);
            //pos.White |= ((ulong)1 << 5);
            //pos.White |= ((ulong)1 << 8);
            //pos.White |= ((ulong)1 << 0);
            //pos.White |= ((ulong)1 << 16);
            //
            //var a = generator.GetActions(pos);
            //
            //Console.WriteLine(BitBoard.DebugPrintUlong(pos.White) + "\n");
            //Console.WriteLine(BitBoard.DebugPrintUlong(pos.Black) + "\n");
            //
            //foreach (var item in a)
            //{
            //    Console.WriteLine(BitBoard.DebugPrintUlong(item) + "\n");
            //}
        }
        public List <ulong> GetActions(Position state)
        {
            var result = new List <ulong>();

            ulong allStones  = state.White | state.Black;
            ulong stoneUnder = (allStones << 16) | fullFirstFloor;

            ulong allActions = (~allStones & stoneUnder);

            while (allActions != 0)
            {
                ulong action = BitBoard.GetLeastSignificantBit(allActions);
                allActions &= (~action);

                result.Add(action);
            }

            return(result);
        }