diff --git a/CreateMap/pom.xml b/CreateMap/pom.xml new file mode 100644 index 0000000..c2ca472 --- /dev/null +++ b/CreateMap/pom.xml @@ -0,0 +1,16 @@ + + + + hypernull + ru.croccode.hypernull + 1.0-SNAPSHOT + + 4.0.0 + + create-map + + + + \ No newline at end of file diff --git a/CreateMap/src/main/java/CreateMap.java b/CreateMap/src/main/java/CreateMap.java new file mode 100644 index 0000000..7bc93d3 --- /dev/null +++ b/CreateMap/src/main/java/CreateMap.java @@ -0,0 +1,189 @@ +import java.io.IOException; +import java.util.*; + +public class CreateMap { + private int MAP_WIDTH; + private int MAP_HEIGHT; + private boolean[][] MAP; + private Queue queuePoint; + private int countBot; + private List listOfSpawn; + + + public CreateMap(int height, int width) { + this.MAP_WIDTH = width; + this.MAP_HEIGHT = height; + + MAP = new boolean[height][width]; + queuePoint = new ArrayDeque<>(); + + int rndX = (int) (Math.random() * MAP_HEIGHT); + int rndY = (int) (Math.random() * MAP_WIDTH); + queuePoint.add(new Point(rndX, rndY)); + + createLabirint(); + setSpawnBot(); + PrintMap(); + } + + + /* + * метод реализует создание идеального лабиринта + * Логика метода: На вход передается случайная точка, метод определяет в какие точки можно пойти из это точки, + * создает список этих точек, случайным образом выбирает в какую точку может пойти, удаляет выбранную точку + * из нашего списка, отправляет наш список в очередь точек, для выбранной точки метод начинается сначала + * */ + public void createLabirint() { + while (!queuePoint.isEmpty()) { + //получаем точку + Point point = queuePoint.poll(); + MAP[point.getX()][point.getY()] = true; + //добавляем точки, в которые можем пойти из начальной точки + List list = addPointsList(point); + //выбираем в какую точку отправимся + int rnd = (int) (Math.random() * list.size()); + Point newPoint; + //если список пуст, значит нет доступных точек, пропускаем ход + if (list.size() != 0) { + newPoint = list.get(rnd); + list.remove(rnd); + queuePoint.addAll(list); + } else { + continue; + } + //выбираем случайным образом в какую сторону сдвинемся от полученной точки + // (влево/вправо по Х, или вверх/вниз по У) + int rnd2 = (int) (Math.random() * 4); + switch (rnd2) { + //Сдвигаемся в зависимости от полученного рандомного положения + case (0): + if ((0 <= newPoint.getX() - 2 && newPoint.getX() + 2 < MAP_HEIGHT) && !MAP[newPoint.getX() - 2][newPoint.getY()]) { + MAP[newPoint.getX()][newPoint.getY()] = true; + MAP[newPoint.getX() + 1][newPoint.getY()] = true; + addPoints(newPoint); + break; + } + case (1): + if ((0 <= newPoint.getX() - 2 && newPoint.getX() + 2 < MAP_HEIGHT) && !MAP[newPoint.getX() + 2][newPoint.getY()]) { + MAP[newPoint.getX()][newPoint.getY()] = true; + MAP[newPoint.getX() - 1][newPoint.getY()] = true; + addPoints(newPoint); + break; + } + case (2): + if (0 <= newPoint.getY() - 2 && newPoint.getY() + 2 < MAP_WIDTH && !MAP[newPoint.getX()][newPoint.getY() - 2]) { + MAP[newPoint.getX()][newPoint.getY()] = true; + MAP[newPoint.getX()][newPoint.getY() + 1] = true; + addPoints(newPoint); + break; + } + case (3): + if ((0 <= newPoint.getY() - 2 && newPoint.getY() + 2 < MAP_WIDTH) && !MAP[newPoint.getX()][newPoint.getY() + 2]) { + MAP[newPoint.getX()][newPoint.getY()] = true; + MAP[newPoint.getX()][newPoint.getY() - 1] = true; + addPoints(newPoint); + break; + } + } + } + if (countBot>=4){ + changeMap(); + } + } + + //метод изменяет наш лабиринт, "дробя" его на свободные ходы + //т.е рандомим точку, проверяем есть ли в ней препятствие, если есть удаляем препятствие смешаемся по оси У + public void changeMap() { + for (int i = 0; i < MAP_HEIGHT * 2; i++) { + int rnd1 = (int) (Math.random() * MAP_HEIGHT-1); + int rnd2 = (int) (Math.random() * MAP_WIDTH-1); + if (MAP[rnd1][rnd2]) { + int count=0; + while (MAP[rnd1][rnd2] && rnd1 != MAP_HEIGHT-1 &&count<4) { + MAP[rnd1][rnd2] = false; + rnd2++; + count++; + } + } + } + } + + //задаем количество ботов и координаты их спавна + public void setSpawnBot() { + //проверям размер карты и исходя из него задаем количество ботов + if (0 < MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 100) { + countBot = 2; + } else if (100 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 200) { + countBot = 3; + } else if (200 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 900) { + countBot = 4; + } else if (900 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 1_600) { + countBot = 5; + } else if (1_600 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 4_200) { + countBot = 6; + } else if (4_200 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 8_100) { + countBot = 9; + } else { + countBot = 12; + } + //создаем список точек в которых будут спавниться боты + listOfSpawn = new ArrayList<>(); + for (int i = 0; i < countBot; ) { + int rndX = (int) (Math.random() * MAP_HEIGHT); + int rndY = (int) (Math.random() * MAP_WIDTH); + if (!MAP[rndX][rndY]) { + listOfSpawn.add(new Point(rndX, rndY)); + i++; + } + } + } + + + /* + * Метод реализует список точек, в которые мы можем пойти от изначальной точки + * */ + public List addPointsList(Point point) { + List list = new ArrayList<>(); + if (0 <= point.getX() - 2 && !MAP[point.getX() - 2][point.getY()]) { + list.add(new Point(point.getX() - 2, point.getY())); + } + if (point.getX() + 2 < MAP_HEIGHT && !MAP[point.getX() + 2][point.getY()]) { + list.add(new Point(point.getX() + 2, point.getY())); + } + if (point.getY() + 2 < MAP_WIDTH && !MAP[point.getX()][point.getY() + 2]) { + list.add(new Point(point.getX(), point.getY() + 2)); + } + if (0 <= point.getY() - 2 && !MAP[point.getX()][point.getY() - 2]) { + list.add(new Point(point.getX(), point.getY() - 2)); + } + return list; + } + + /* + * Добавляем точки, в которые можем пойти, в нашу очередь + * */ + public void addPoints(Point point) { + if (0 <= point.getX() - 2 && !MAP[point.getX() - 2][point.getY()]) { + queuePoint.add(new Point(point.getX() - 2, point.getY())); + } + if (point.getX() + 2 < MAP_HEIGHT && !MAP[point.getX() + 2][point.getY()]) { + queuePoint.add(new Point(point.getX() + 2, point.getY())); + } + if (point.getY() + 2 < MAP_WIDTH && !MAP[point.getX()][point.getY() + 2]) { + queuePoint.add(new Point(point.getX(), point.getY() + 2)); + } + if (0 <= point.getY() - 2 && !MAP[point.getX()][point.getY() - 2]) { + queuePoint.add(new Point(point.getX(), point.getY() - 2)); + } + } + + //записываем наши данные в файлы + public void PrintMap() { + try { + WriteMap writeMap = new WriteMap(MAP, countBot, listOfSpawn); + writeMap.writeMap(); + } catch (IOException e) { + } + } + +} diff --git a/CreateMap/src/main/java/InitSettings.java b/CreateMap/src/main/java/InitSettings.java new file mode 100644 index 0000000..604c7af --- /dev/null +++ b/CreateMap/src/main/java/InitSettings.java @@ -0,0 +1,61 @@ +import java.util.List; + +public class InitSettings { + private int WIDTH; + private int HEIGHT; + private int CountBot; + private List ListOfSpawn; + + public InitSettings(int WIDTH, int HEIGHT, int countBot, List listOfSpawn) { + this.WIDTH = WIDTH; + this.HEIGHT = HEIGHT; + this.CountBot = countBot; + this.ListOfSpawn = listOfSpawn; + } + + + //задаем радиус видимости в зависимости от количества ботов + public int getViewRadius() { + if ( CountBot <= 4) { + return 4; + } else if (CountBot <= 8) { + return 7; + } else if (CountBot <= 12) { + return 10; + }else { + return 13; + } + } + + //задаем радиус майнинга монет в зависимости от количества ботов + public int getMiningRadius() { + if ( CountBot <= 4) { + return 2; + } else if (CountBot <= 8) { + return 3; + } else { + return 5; + } + } + //задаем радиус атаки в зависимости от количества ботов + public int getAtackRadius() { + if ( CountBot <= 4) { + return 2; + } else if (CountBot <= 8) { + return 3; + } else { + return 5; + } + } + + public int getWIDTH() { + return WIDTH; + } + + public int getHEIGHT() { + return HEIGHT; + } + public List getListOfSpawn(){ + return ListOfSpawn; + } +} diff --git a/CreateMap/src/main/java/Point.java b/CreateMap/src/main/java/Point.java new file mode 100644 index 0000000..c12001f --- /dev/null +++ b/CreateMap/src/main/java/Point.java @@ -0,0 +1,23 @@ +import java.util.Set; + +public class Point { + private int x; + private int y; + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public String toString() { + return x + " " + y; + } +} diff --git a/CreateMap/src/main/java/WriteMap.java b/CreateMap/src/main/java/WriteMap.java new file mode 100644 index 0000000..1793cb8 --- /dev/null +++ b/CreateMap/src/main/java/WriteMap.java @@ -0,0 +1,42 @@ +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.util.List; + +public class WriteMap { + private boolean[][] MAP; + private int CountBot; + private List ListOfSpawn; + + public WriteMap(boolean[][] MAP,int countBot,List listOfSpawn) { + this.MAP = MAP; + CountBot=countBot; + ListOfSpawn=listOfSpawn; + } + + + public void writeMap() throws IOException { + InitSettings settings=new InitSettings(MAP.length,MAP[0].length,CountBot,ListOfSpawn); + String nameOfFile="maze_"+CountBot+"_6.map"; + Writer writerOnTxt=new FileWriter("/Users/alekseyzhizhin/Documents/GitHub/hypernull/CreateMap/src/main/java/maze/"+nameOfFile); + writerOnTxt.write("map_size "+settings.getWIDTH()+" "+settings.getHEIGHT()+"\n"); + writerOnTxt.write("view_radius "+settings.getViewRadius()+"\n"); + writerOnTxt.write("mining_radius "+settings.getMiningRadius()+"\n"); + writerOnTxt.write("attack_radius "+settings.getAtackRadius()+"\n"); + + for (int i = 0; i < MAP.length; i++) { + for (int j = 0; j < MAP[0].length; j++) { + if (MAP[i][j]) { + writerOnTxt.write("Block " + i + " " + j + "\n"); + }else { + } + } + } + for (int i=0;iserver player starter-bot - + CreateMap + UTF-8 11