Ejemplo n.º 1
0
        private async Task expandTree(GameTreeNode node, int level, int currentLevel, DateTime start, DateTime current)
        {
            List <Coordinate> moves = node.CurrentBoardConfig.GetAllAvailableMoves();

            if (node.Parent == null)
            {
                node.Alpha = -10000;
                node.Beta  = 10000;
            }
            else
            {
                node.Alpha = node.Parent.Alpha;
                node.Beta  = node.Parent.Beta;
            }

            if (moves.Count == 0 || level == currentLevel)
            {
                game.Board = node.CurrentBoardConfig.Clone();

                game.getPlayer1Points();
                game.getPlayer2Points();
                node.HeuristicValue = game.Player2Points - game.Player1Points;
                if (currentLevel % 2 == 0)
                {
                    if (node.HeuristicValue > node.Parent.Alpha)
                    {
                        node.Parent.Alpha = node.HeuristicValue;
                        if (currentLevel == 2)
                        {
                            chosenMove = node.Move;
                        }
                    }
                }
                else
                {
                    if (node.HeuristicValue < node.Parent.Beta)
                    {
                        node.Parent.Beta = node.HeuristicValue;
                    }
                }
            }
            else
            {
                foreach (Coordinate c in moves)
                {
                    Gameboard newConfig = node.CurrentBoardConfig.Clone();
                    if (node.Alpha >= node.Beta)
                    {
                        break;
                    }
                    string move;
                    if (currentLevel % 2 == 0)
                    {
                        move = "R" + c.Row + c.Col;
                    }
                    else
                    {
                        move = "B" + c.Row + c.Col;
                    }
                    newConfig.MakeMoveOnBoard(move);
                    GameTreeNode child = new GameTreeNode(node, newConfig);
                    child.Parent         = node;
                    child.Move           = move;
                    child.HeuristicValue = -100000;
                    node.Children.Add(child);
                    if ((current - start).TotalSeconds < 5.6)
                    {
                        await expandTree(child, level, currentLevel + 1, start, DateTime.Now);
                    }
                    else
                    {
                        finishedTree = false;
                        break;
                    }
                }

                if (currentLevel != 1) //something wrong here maybe with logic
                {
                    if ((current - start).TotalSeconds < 5.6)
                    {
                        if (currentLevel % 2 == 0)
                        {
                            if (node.Beta > node.Parent.Alpha)
                            {
                                node.Parent.Alpha = node.Beta;
                                if (currentLevel == 2)
                                {
                                    chosenMove = node.Move;
                                }
                            }
                        }
                        else
                        {
                            if (node.Alpha < node.Parent.Beta)
                            {
                                node.Parent.Beta = node.Alpha;
                            }
                        }
                    }
                }
            }
        }