示例#1
0
        public int[] makeNextMove(Grid board)
        {
            PriorityQueue <MoveNode> q = new PriorityQueue <MoveNode>();

            q.initialize(expandNodes(board, null, 1));
            MoveNode current = q.Dequeue();

            while ((current.Ply < depth) && !(q.isEmpty))
            {
                MoveNode next = q.Dequeue();
                if (next.Rank > current.Rank)
                {
                    current = next;
                    MoveNode[] expnd = expandNodes(current.Board, current, (current.Ply + 1));
                    if (expnd.Length > 0)
                    {
                        q.EnqueueArray(expnd);
                    }
                }
            }

            while (current.Ply > 1)
            {
                current = current.PreviousMove;
            }
            //this will be the best move to make after expanding down to depth plys.
            int[] result = { current.Group.X, current.Group.Y };
            Console.WriteLine("rank: " + current.Rank);

            return(result);
        }
示例#2
0
        public MoveNode solveTree(Grid board)
        {
            MoveNode         result = null;
            Stack <MoveNode> s      = new Stack <MoveNode>();

            MoveNode[] expnd = expandNodes(board, null, 1);
            for (int i = 0; i < expnd.Length; i++)
            {
                s.Push(expnd[i]);
            }

            MoveNode current = s.Pop();

            while (!(current.Board.checkWin()) && (s.Count > 0))
            {
                expnd = expandNodes(current.Board, current, current.Ply + 1);
                for (int j = 0; j < expnd.Length; j++)
                {
                    s.Push(expnd[j]);
                }
                current = s.Pop();
            }

            if (current.Board.checkWin())
            {
                result = current;
            }

            return(result);
        }
示例#3
0
 public MoveNode(int x, int y, double rank)
 {
     group        = new Group(x, y, 0);
     this.rank    = rank;
     ply          = 0;
     board        = null;
     previousMove = null;
 }
示例#4
0
 public MoveNode(Group m, double rank, int ply, Grid board, MoveNode last)
 {
     this.group   = m;
     this.rank    = rank;
     this.ply     = ply;
     this.board   = board;
     previousMove = last;
 }
示例#5
0
 public MoveNode()
 {
     group        = new Group(0, 0, 0);
     rank         = 0;
     ply          = 0;
     board        = null;
     previousMove = null;
 }
示例#6
0
        public int CompareTo(object obj)
        {
            MoveNode m      = (MoveNode)obj;
            double   r      = m.Rank;
            double   result = rank - r;

            if (result > 0)
            {
                return(1);
            }
            if (result < 0)
            {
                return(-1);
            }
            return(0);
        }
示例#7
0
        public MoveNode[] expandNodes(Grid board, MoveNode last, int ply)
        {
            List <MoveNode> nodes = new List <MoveNode>();
            List <Group>    moves = board.calculateGroups();

            foreach (Group move in moves)
            {
                Grid b = board.copy();
                if (b.checkMove(move.X, move.Y))
                {
                    b.removeGroup(move.X, move.Y);
                    b.compressGrid();
                    nodes.Add(new MoveNode(move, rankGrid(b), ply, b, last));
                }
            }
            return(nodes.ToArray());
        }
示例#8
0
        public static void newAIGame(Grid game)
        {
            bool             GameLoop = true;
            bool             list     = false;
            AI               blue     = new AI(50);
            Stack <MoveNode> moves    = new Stack <MoveNode>();

            if ((game.Colors <= 5 && game.X < 7) || (game.Colors < 4 && game.X <= 15))
            {
                MoveNode move = blue.solveTree(game);
                if (move != null)
                {
                    list = true;

                    while (move != null)
                    {
                        moves.Push(move);
                        move = move.PreviousMove;
                    }
                }
            }

            while (GameLoop)
            {
                int[] nextMove;
                game.displayGrid();



                if (list)
                {
                    nextMove = new int[2];
                    MoveNode cur = moves.Pop();
                    nextMove[0] = cur.Group.X;
                    nextMove[1] = cur.Group.Y;
                }
                else
                {
                    nextMove = blue.makeNextMove(game);
                }

                Console.WriteLine("AI makes the move (" + nextMove[0] + ", " + nextMove[1] + ")");

                game.removeGroup(nextMove[0], nextMove[1]);
                game.Logger.addLog("MOVE: (" + nextMove[0] + "," + nextMove[1] + ")");
                game.Logger.addLog("      --Points: " + game.calculatePoints());

                game.compressGrid();

                if (game.checkWin())
                {
                    GameLoop = false;
                    Console.WriteLine("You Win!");
                    game.Logger.addLog("GAME WIN: All bubbles eliminated");
                    game.Logger.addLog("FINAL POINTS: " + game.Points);
                    game.Logger.close();
                    Console.ReadLine();
                }
                else if (game.checkLocked())
                {
                    GameLoop = false;
                    //display final game board showing locked game
                    game.displayGrid();
                    Console.WriteLine("You Lose!");
                    game.Logger.addLog("GAME LOSS: Gameboard locked!");
                    game.Logger.addLog("FINAL POINTS: " + game.Points);
                    game.Logger.close();
                    Console.ReadLine();
                }
            }
        }