示例#1
0
        public void SetCell(Position p, char c)
        {
            if (!IsPositionInMap(p))
                return;

            _data[p.Row * NUM_COLS + p.Col] = c;
        }
示例#2
0
        public override void Move(MoveDirection dir)
        {
            Position to;
            switch (dir)
            {
                case MoveDirection.UpLeft:
                    to = new Position(Pos.Row - 1, Pos.Col - 1);
                    break;
                case MoveDirection.UpRight:
                    to = new Position(Pos.Row - 1, Pos.Col + 1);
                    break;
                case MoveDirection.DownLeft:
                    to = new Position(Pos.Row + 1, Pos.Col - 1);
                    break;
                case MoveDirection.DownRight:
                    to = new Position(Pos.Row + 1, Pos.Col + 1);
                    break;
                default: // Should cover all cases
                    return;
            }

            if (!_board.IsValidPosition(to))
                return;

            Move m = new Move(Pos, to);

            _board.Move(m);

            Pos = to;
        }
示例#3
0
        public char GetCell(Position p)
        {
            if (!IsPositionInMap(p))
                return '\0';

            return _data[p.Row * NUM_COLS + p.Col];
        }
示例#4
0
        public override bool CanMove()
        {
            var upLeft = new Position(Pos.Row - 1, Pos.Col - 1);
            var upRight = new Position(Pos.Row - 1, Pos.Col + 1);

            return _board.IsValidPosition(upLeft) && _board.IsCellEmpty(upLeft)
                || _board.IsValidPosition(upRight) && _board.IsCellEmpty(upRight);
        }
示例#5
0
 public static MoveDirection GetDirection(Position from, Position to)
 {
     if (to.Row - from.Row > 0)
     {
         if (to.Col - from.Col > 0)
             return MoveDirection.DownRight;
         else
             return MoveDirection.DownLeft;
     }
     else
     {
         if (to.Col - from.Col > 0)
             return MoveDirection.UpRight;
         else
             return MoveDirection.UpLeft;
     }
 }
示例#6
0
        // TODO make method less repetitive
        public static void generateBirdsChildren(ref BCTree<BoardConfig> parentNode, int lvl, Board Board)
        {
            //Console.Write("ParentNode Larva = " + GetScoreForPos(parentNode.data.LarvaPos));
            for (int i = 0; i < parentNode.data.BirdsPos.Length; ++i)
            {
                //Console.Write(", Bird " + (i + 1) + " = " + GetScoreForPos(parentNode.data.BirdsPos[i]));
            }
            //Console.WriteLine();

            Position bird1LeftPosition = new Position(parentNode.data.BirdsPos[0].Row - 1, parentNode.data.BirdsPos[0].Col - 1);
            if (Board.IsValidPosition(bird1LeftPosition) && parentNode.data.IsCellEmpty(bird1LeftPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[0] = bird1LeftPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 1 left position = " + GetScoreForPos(bird1LeftPosition));
            }

            Position bird1RightPosition = new Position(parentNode.data.BirdsPos[0].Row - 1, parentNode.data.BirdsPos[0].Col + 1);
            if (Board.IsValidPosition(bird1RightPosition) && parentNode.data.IsCellEmpty(bird1RightPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[0] = bird1RightPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 1 right position = " + GetScoreForPos(bird1RightPosition));
            }

            Position bird2LeftPosition = new Position(parentNode.data.BirdsPos[1].Row - 1, parentNode.data.BirdsPos[1].Col - 1);
            if (Board.IsValidPosition(bird2LeftPosition) && parentNode.data.IsCellEmpty(bird2LeftPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[1] = bird2LeftPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 2 left position = " + GetScoreForPos(bird2LeftPosition));
            }

            Position bird2RightPosition = new Position(parentNode.data.BirdsPos[1].Row - 1, parentNode.data.BirdsPos[1].Col + 1);
            if (Board.IsValidPosition(bird2RightPosition) && parentNode.data.IsCellEmpty(bird2RightPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[1] = bird2RightPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 2 right position = " + GetScoreForPos(bird2RightPosition));
            }

            Position bird3LeftPosition = new Position(parentNode.data.BirdsPos[2].Row - 1, parentNode.data.BirdsPos[2].Col - 1);
            if (Board.IsValidPosition(bird3LeftPosition) && parentNode.data.IsCellEmpty(bird3LeftPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[2] = bird3LeftPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 3 left position = " + GetScoreForPos(bird3LeftPosition));
            }

            Position bird3RightPosition = new Position(parentNode.data.BirdsPos[2].Row - 1, parentNode.data.BirdsPos[2].Col + 1);
            if (Board.IsValidPosition(bird3RightPosition) && parentNode.data.IsCellEmpty(bird3RightPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[2] = bird3RightPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 3 right position = " + GetScoreForPos(bird3RightPosition));
            }

            Position bird4LeftPosition = new Position(parentNode.data.BirdsPos[3].Row - 1, parentNode.data.BirdsPos[3].Col - 1);
            if (Board.IsValidPosition(bird4LeftPosition) && parentNode.data.IsCellEmpty(bird4LeftPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[3] = bird4LeftPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 4 left position = " + GetScoreForPos(bird4LeftPosition));
            }

            Position bird4RightPosition = new Position(parentNode.data.BirdsPos[3].Row - 1, parentNode.data.BirdsPos[3].Col + 1);
            if (Board.IsValidPosition(bird4RightPosition) && parentNode.data.IsCellEmpty(bird4RightPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.BirdsPos[3] = bird4RightPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bird 4 right position = " + GetScoreForPos(bird4RightPosition));
            }
        }
示例#7
0
 public Move(Position from, Position to)
     : this()
 {
     From = from;
     To = to;
 }
示例#8
0
        // TODO make method less repetitive
        public static void generateLarvaChildren(ref BCTree<BoardConfig> parentNode, int lvl, Board Board)
        {
            //Console.Write("ParentNode Larva = " + GetScoreForPos(parentNode.data.LarvaPos));
            for (int i = 0; i < parentNode.data.BirdsPos.Length; ++i)
            {
                //Console.Write(", Bird " + (i + 1) + " = " + GetScoreForPos(parentNode.data.BirdsPos[i]));
            }
            //Console.WriteLine();

            Position topLeftPosition = new Position(parentNode.data.LarvaPos.Row - 1, parentNode.data.LarvaPos.Col - 1);
            if (Board.IsValidPosition(topLeftPosition) && parentNode.data.IsCellEmpty(topLeftPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.LarvaPos = topLeftPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Top left position = " + GetScoreForPos(topLeftPosition));
            }

            Position topRightPosition = new Position(parentNode.data.LarvaPos.Row - 1, parentNode.data.LarvaPos.Col + 1);
            if (Board.IsValidPosition(topRightPosition) && parentNode.data.IsCellEmpty(topRightPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.LarvaPos = topRightPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Top right position = " + GetScoreForPos(topRightPosition));
            }

            Position bottomLeftPosition = new Position(parentNode.data.LarvaPos.Row + 1, parentNode.data.LarvaPos.Col - 1);
            if (Board.IsValidPosition(bottomLeftPosition) && parentNode.data.IsCellEmpty(bottomLeftPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.LarvaPos = bottomLeftPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bottom left position = " + GetScoreForPos(bottomLeftPosition));
            }

            Position bottomRightPosition = new Position(parentNode.data.LarvaPos.Row + 1, parentNode.data.LarvaPos.Col + 1);
            if (Board.IsValidPosition(bottomRightPosition) && parentNode.data.IsCellEmpty(bottomRightPosition))
            {
                BoardConfig tempBC = new BoardConfig(parentNode.data);
                tempBC.Level = lvl;
                tempBC.LarvaPos = bottomRightPosition;
                parentNode.AddChild(tempBC);
                //Console.WriteLine("Bottom right position = " + GetScoreForPos(bottomRightPosition));
            }
        }
示例#9
0
        public static int GetScoreForPos(Position pos)
        {
            /*
             The board's score looks like the following

             1	2	3	4	4	3	2	1
             2	4	6	8	8	6	4	2
             3	6	9	12	12	9	6	3
             4	8	12	16	16	12	8	4
             5	10	15	20	20	15	10	5
             6	12	18	24	24	18	12	6
             7	14	21	28	28	21	14	7
             8	16	24	32	32	24	16	8
             */

            int rowScore = pos.Row + 1;

            int dist1 = Math.Abs(pos.Col - 3);
            int dist2 = Math.Abs(pos.Col - 4);
            int distFromCenter = Math.Min(dist1, dist2);
            int colScore = 4 - distFromCenter;

            return rowScore * colScore;
        }
示例#10
0
        public void SetCell(Position pos, GamePiece piece)
        {
            if (!IsPositionInMap(pos))
                return;

            _data[pos.Row * NUM_COLS + pos.Col] = piece;
        }
示例#11
0
 public Bird(Position pos, Board b)
     : base(pos, b)
 {
 }
示例#12
0
        public bool IsCellEmpty(Position pos)
        {
            if (!IsPositionInMap(pos))
                throw new ArgumentException();

            return GetCell(pos) == null;
        }
示例#13
0
 /// <summary>
 /// Create a new Larva peice on Board b at Position p
 /// </summary>
 /// <param name="p">Position at which to place the Larva</param>
 /// <param name="b">Board on which to place the Larva</param>
 public Larva(Position pos, Board b)
     : base(pos, b)
 {
 }
示例#14
0
 public Move(Position from, Position to)
 {
     From = from;
     To = to;
     Direction = GetDirection(from, to);
 }
示例#15
0
 private bool IsPositionInMap(Position p)
 {
     return p.Row >= 0
         && p.Row < NUM_ROWS
         && p.Col >= 0
         && p.Col < NUM_COLS;
 }
示例#16
0
        public BoardConfig AIBirdsMove(Larva Larva, Bird[] Birds, Board Board)
        {
            // Get original positions
            Position origLarvaPosition = Larva.Pos;

            Position[] origBirdsPosition = new Position[Birds.Length];

            for (int i = 0; i < Birds.Length; ++i)
            {
                origBirdsPosition[i] = Birds[i].Pos;
            }

            BoardConfig origBC = new BoardConfig(0, origLarvaPosition, origBirdsPosition);

            BCTree<BoardConfig> MiniMaxTree = new BCTree<BoardConfig>(origBC);

            // Get level 1 kids for the Birds
            Utilities.generateBirdsChildren(ref MiniMaxTree, 1, Board);

            List<BCTree<BoardConfig>> level1Nodes = new List<BCTree<BoardConfig>>();
            Utilities.drill(MiniMaxTree, 0, 1, ref level1Nodes);
            //Console.WriteLine("Count of nodes at Level 1 given by drill method = " + level1Nodes.Count);

            // Get level 2 kids for the Larva
            for (int i = 0; i < level1Nodes.Count; ++i)
            {
                var temp = level1Nodes[i];
                Utilities.generateLarvaChildren(ref temp, 2, Board);
            }

            List<BCTree<BoardConfig>> level2Nodes = new List<BCTree<BoardConfig>>();
            Utilities.drill(MiniMaxTree, 0, 2, ref level2Nodes);
            //Console.WriteLine("Count of nodes at Level 2 given by drill method = " + level2Nodes.Count);

            // Get level 3 kids for the Birds
            for (int i = 0; i < level2Nodes.Count; ++i)
            {
                var temp = level2Nodes[i];
                Utilities.generateBirdsChildren(ref temp, 3, Board);
            }

            List<BCTree<BoardConfig>> level3Nodes = new List<BCTree<BoardConfig>>();
            Utilities.drill(MiniMaxTree, 0, 3, ref level3Nodes);
            //Console.WriteLine("Count of nodes at Level 3 given by drill method = " + level3Nodes.Count);

            //Console.WriteLine("Calculating level 3 heuristics...");
            Utilities.calculateLevelHeuristics(ref level3Nodes);

            for (int i = 0; i < level3Nodes.Count; i++)
            {
                //Console.WriteLine(i + " " + level3Nodes[i].data.heuristic);
            }

            //Console.WriteLine("Calculating level 2 heuristics...");
            Utilities.calculateLevelHeuristics(ref level2Nodes);

            for (int i = 0; i < level2Nodes.Count; i++)
            {
                //Console.WriteLine(i + " " + level2Nodes[i].data.heuristic);
            }

            //Console.WriteLine("Calculating level 1 heuristics...");
            Utilities.calculateLevelHeuristics(ref level1Nodes);

            for (int i = 0; i < level1Nodes.Count; i++)
            {
                //Console.WriteLine(i + " " + level1Nodes[i].data.heuristic);
            }

            Console.WriteLine();
            Console.Write("Current Positions - Larva = " + Utilities.GetScoreForPos(MiniMaxTree.data.LarvaPos));
            for (int i = 0; i < MiniMaxTree.data.BirdsPos.Length; ++i)
            {
                Console.Write(", Bird " + (i + 1) + " = " + Utilities.GetScoreForPos(MiniMaxTree.data.BirdsPos[i]));
            }
            Console.WriteLine();
            Console.WriteLine("Calculating best move for Birds...");
            BoardConfig nextConfig = Utilities.getBestMove(level1Nodes, ref MiniMaxTree, false);
            int birdToMove = getBirdToMove(nextConfig, origBC);
            Position nextBirdPosition = nextConfig.BirdsPos[birdToMove];

            Utilities.PreOrderPrintBirds(MiniMaxTree);

            Console.WriteLine("The best next move for the Birds is for Bird " + (birdToMove + 1) + " to go to position " + Utilities.GetScoreForPos(nextBirdPosition));
            Console.WriteLine();

            return nextConfig;
        }
示例#17
0
        public void DoAIMove(Larva Larva, Bird[] Birds, Board Board)
        {
            int birdIndex = 4;
            var to = new Position();

            BoardConfig nextConfig = AIBirdsMove(Larva, Birds, Board);

            for (int i = 0; i < _birds.Length; ++i)
            {
                if (!(nextConfig.BirdsPos[i].Equals(_birds[i].Pos)))
                {
                    birdIndex = i;
                    to = nextConfig.BirdsPos[i];
                }
            }

            try
            {
                _birds[birdIndex].Move(new Move(_birds[birdIndex].Pos, to));
            }
            catch (InvalidMoveException) { }
        }
示例#18
0
 public GamePiece(int r, int c, Board board)
 {
     Pos = new Position(r, c);
     _board = board;
 }
示例#19
0
 public bool IsValidPosition(Position pos)
 {
     return IsPositionInMap(pos);
 }
示例#20
0
        public GamePiece GetCell(Position pos)
        {
            if (!IsPositionInMap(pos))
                return null;

            return _data[pos.Row * NUM_COLS + pos.Col];
        }