Как найти все блоки по кругу, в сетке? - PullRequest
1 голос
/ 29 июня 2011

Я пытаюсь создать серверный плагин для популярной инди-игры Minecraft. Пока что у меня есть нерекурсивный метод нахождения всех блоков в двух местах от местоположения игрока. Я ищу, чтобы создать метод, чтобы сделать это эффективно. Я хотел бы иметь возможность указать расстояние. Вот что у меня сейчас:

Block b = player.getLocation().getBlock();
b.getRelative(BlockFace.NORTH).getRelative(BlockFace.NORTH).setType(Material.FIRE);
b.getRelative(BlockFace.NORTH).getRelative(BlockFace.EAST).setType(Material.FIRE);
b.getRelative(BlockFace.EAST).getRelative(BlockFace.EAST).setType(Material.FIRE);
b.getRelative(BlockFace.EAST).getRelative(BlockFace.SOUTH).setType(Material.FIRE);
b.getRelative(BlockFace.WEST).getRelative(BlockFace.WEST).setType(Material.FIRE);
b.getRelative(BlockFace.SOUTH).getRelative(BlockFace.SOUTH).setType(Material.FIRE);
b.getRelative(BlockFace.SOUTH).getRelative(BlockFace.WEST).setType(Material.FIRE);
b.getRelative(BlockFace.NORTH).getRelative(BlockFace.WEST).setType(Material.FIRE);

Не могли бы вы мне помочь? Спасибо.

1 Ответ

2 голосов
/ 29 июня 2011

Если я правильно понимаю проблему, вам нужен нерекурсивный алгоритм, чтобы найти все точки на двумерной квадратной сетке на заданном расстоянии Манхэттена d от начала координат.Эти точки лежат на плиточном квадрате, и их можно легко сгенерировать последовательно.Например:

public class Points {

    public static void points(int d) {
        int px = d;
        int py = 0;
        int dx = -1, dy = 1;
        int n = d * 4;
        for( int i = 0; i < n; i++ ) {
            if( px == d && dx > 0 ) dx = -1;
            else if( px == -d && dx < 0 ) dx = 1;
            if( py == d && dy > 0 ) dy = -1;
            else if( py == -d && dy < 0 ) dy = 1;
            px += dx;
            py += dy;
            doSomething(px, py);
        }
    }

    private static void doSomething(int px, int py) {
        System.out.printf("(%2d,%2d)\n", px, py);
        // do whatever you need 
    }

    public static void main(String[] args) {
        points(2);
    }
}

Это печатает

( 1, 1)
( 0, 2)
(-1, 1)
(-2, 0)
(-1,-1)
( 0,-2)
( 1,-1)
( 2, 0)

Вам нужно только кодировать в doSomething() ваше действие в соответствии с переданными координатами.

...