Exemplo n.º 1
0
        private MoveScenarios getAllCaptureScenarios(Board board, Position basePosition)
        {
            int piece = board.getPiece(basePosition);
            Stack <MoveOptionsContext> stack        = new Stack <MoveOptionsContext>();
            List <List <Position> >    allScenarios = new List <List <Position> >();
            List <Position>            currScenario = new List <Position>();
            MoveOptionsContext         currContext;
            MoveOptions currMoveOpt;

            MoveOptions rootMoveOpt = new MoveOptions(new Board(board), basePosition);

            stack.Push(new MoveOptionsContext(rootMoveOpt));

            while (stack.Count > 0)
            {
                currContext = stack.Pop();
                currMoveOpt = currContext.CurrMoveOpt;

                if (!currContext.IsVisited)
                {
                    if (!currMoveOpt.Equals(rootMoveOpt))
                    {
                        currScenario.Add(currMoveOpt.CurrentPos);
                    }

                    currContext.IsVisited = true;
                    stack.Push(currContext);

                    List <Position> foundCapture = findCaptures(currMoveOpt.CurrentBoard, currMoveOpt.CurrentPos, piece);

                    foreach (Position currCapturePos in foundCapture)
                    {
                        Board newBoardState = new Board(currMoveOpt.CurrentBoard);
                        MoveController.execMove(newBoardState, currMoveOpt.CurrentPos, currCapturePos);

                        MoveOptions captureMoveOpt = new MoveOptions(newBoardState, currCapturePos);
                        currMoveOpt.Add(captureMoveOpt);

                        stack.Push(new MoveOptionsContext(captureMoveOpt));
                    }
                }
                else
                {
                    if (currMoveOpt.AllMoveOptPos.Count == 0 && currScenario.Count > 0)
                    {
                        List <Position> leafPath = new List <Position>();
                        leafPath.AddRange(currScenario);

                        allScenarios.Add(leafPath);
                    }

                    if (currScenario.Count > 0)
                    {
                        currScenario.RemoveAt(currScenario.Count - 1);
                    }
                }
            }

            if (allScenarios.Count == 0)
            {
                return(null);
            }

            return(new MoveScenarios(basePosition, allScenarios, true));
        }