Как рандомизировать порядок операторов Java "if" или код заказа? - PullRequest
0 голосов
/ 08 мая 2019

Я пишу алгоритм поиска в глубину для сущности-призрака в игре Pacman.Призрак должен искать путь к Пакману.Но даже если есть путь к Пакману, алгоритм поиска в глубину не всегда найдет его из-за порядка операторов if.

     private boolean searchPath(
                int[][] maze, int x, int y, List<Point> path )
{
    System.out.println( "Inky.searchPath: " + "(" + x + "," + y +  ")" );
    if ( !grid.isValid( new Location( x, y ) ) )
    {
        System.out.println( "Inky.searchPath: Location is not valid" );
        return false;
    }

    //Target
    if ( maze[x][y] == 9 )
    {
        path.add( new Point( x, y ) );
        return true;
    }

    //Changing point to point visited
    if ( maze[x][y] == 0 )
    {
        maze[x][y] = 2;

        //Need something that executes these if statements at     random

        //Searching one block down
        if ( searchPath( maze, x - 1, y, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }

        //Searching one block up
        if ( searchPath( maze, x + 1, y, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }

        //Searching one block left
        if ( searchPath( maze, x, y - 1, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }

        //Searching one block right
        if ( searchPath( maze, x, y + 1, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }

    }
    System.out.println("Inky.searchPath: Path not found");
    return false;

}

Как вы можете видеть порядок операторов if1. Поиск на один блок вниз 2. Поиск на один блок вверх 3. Поиск на один блок влево 4. Поиск на один блок вправо

Так что, если Призрак входит в ситуацию, когда слева находится открытый блок, он будетидти до тех пор, пока слева не будет открытого блока, тогда вступит в действие второй шаг, и Призрак снова вернется к тому, с чего начал, потому что второй шаг ищет X-1.

Итак, мой вопросесть ли способ случайного порядка, в котором выполняются операторы if?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Поместите ваши операторы if в switch, сгенерируйте случайное число и используйте переключатель, чтобы решить, какой из них выполнить.

        //Need something that executes these if statements at     random

       int random=ThreadLocalRandom.current().nextInt(1,5);

       switch(random)

       {

        case 1:
        //Searching one block down
        if ( searchPath( maze, x - 1, y, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }
        break;

         case 2:    
        //Searching one block up
        if ( searchPath( maze, x + 1, y, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }
        break;

        case 3:
        //Searching one block left
        if ( searchPath( maze, x, y - 1, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }
        break;

        case 4:
        //Searching one block right
        if ( searchPath( maze, x, y + 1, path ) )
        {
            path.add( new Point( x, y ) );
            return true;
        }
        break;

        }
0 голосов
/ 08 мая 2019

Чтобы рандомизировать направления, вы можете:

    //introduce a collection of directions
    private List<int[]> directions = Arrays.asList (new int[][] {{1,0},{-1,0}, {0,1}, {0,-1}}); //right, left, down, up

    //use it
    Collections.shuffle(directions);
    for(int[] dir : directions){

        boolean result = searchPath( maze, x + dir[0], y + dir[1], path ) ;
        //todo handle result 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...