Skip to content

Commit d223189

Browse files
Создал модуль по генерации карт (#3)
* Создал модуль по генерации карт * внесены небольшие изменения * внесены изменения по коду и созданы новые карты
1 parent d9196e4 commit d223189

19 files changed

+85875
-1
lines changed

CreateMap/pom.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>hypernull</artifactId>
7+
<groupId>ru.croccode.hypernull</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>create-map</artifactId>
13+
14+
15+
16+
</project>
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import java.io.IOException;
2+
import java.util.*;
3+
4+
public class CreateMap {
5+
private int MAP_WIDTH;
6+
private int MAP_HEIGHT;
7+
private boolean[][] MAP;
8+
private Queue<Point> queuePoint;
9+
private int countBot;
10+
private List<Point> listOfSpawn;
11+
12+
13+
public CreateMap(int height, int width) {
14+
this.MAP_WIDTH = width;
15+
this.MAP_HEIGHT = height;
16+
17+
MAP = new boolean[height][width];
18+
queuePoint = new ArrayDeque<>();
19+
20+
int rndX = (int) (Math.random() * MAP_HEIGHT);
21+
int rndY = (int) (Math.random() * MAP_WIDTH);
22+
queuePoint.add(new Point(rndX, rndY));
23+
24+
createLabirint();
25+
setSpawnBot();
26+
PrintMap();
27+
}
28+
29+
30+
/*
31+
* метод реализует создание идеального лабиринта
32+
* Логика метода: На вход передается случайная точка, метод определяет в какие точки можно пойти из это точки,
33+
* создает список этих точек, случайным образом выбирает в какую точку может пойти, удаляет выбранную точку
34+
* из нашего списка, отправляет наш список в очередь точек, для выбранной точки метод начинается сначала
35+
* */
36+
public void createLabirint() {
37+
while (!queuePoint.isEmpty()) {
38+
//получаем точку
39+
Point point = queuePoint.poll();
40+
MAP[point.getX()][point.getY()] = true;
41+
//добавляем точки, в которые можем пойти из начальной точки
42+
List<Point> list = addPointsList(point);
43+
//выбираем в какую точку отправимся
44+
int rnd = (int) (Math.random() * list.size());
45+
Point newPoint;
46+
//если список пуст, значит нет доступных точек, пропускаем ход
47+
if (list.size() != 0) {
48+
newPoint = list.get(rnd);
49+
list.remove(rnd);
50+
queuePoint.addAll(list);
51+
} else {
52+
continue;
53+
}
54+
//выбираем случайным образом в какую сторону сдвинемся от полученной точки
55+
// (влево/вправо по Х, или вверх/вниз по У)
56+
int rnd2 = (int) (Math.random() * 4);
57+
switch (rnd2) {
58+
//Сдвигаемся в зависимости от полученного рандомного положения
59+
case (0):
60+
if ((0 <= newPoint.getX() - 2 && newPoint.getX() + 2 < MAP_HEIGHT) && !MAP[newPoint.getX() - 2][newPoint.getY()]) {
61+
MAP[newPoint.getX()][newPoint.getY()] = true;
62+
MAP[newPoint.getX() + 1][newPoint.getY()] = true;
63+
addPoints(newPoint);
64+
break;
65+
}
66+
case (1):
67+
if ((0 <= newPoint.getX() - 2 && newPoint.getX() + 2 < MAP_HEIGHT) && !MAP[newPoint.getX() + 2][newPoint.getY()]) {
68+
MAP[newPoint.getX()][newPoint.getY()] = true;
69+
MAP[newPoint.getX() - 1][newPoint.getY()] = true;
70+
addPoints(newPoint);
71+
break;
72+
}
73+
case (2):
74+
if (0 <= newPoint.getY() - 2 && newPoint.getY() + 2 < MAP_WIDTH && !MAP[newPoint.getX()][newPoint.getY() - 2]) {
75+
MAP[newPoint.getX()][newPoint.getY()] = true;
76+
MAP[newPoint.getX()][newPoint.getY() + 1] = true;
77+
addPoints(newPoint);
78+
break;
79+
}
80+
case (3):
81+
if ((0 <= newPoint.getY() - 2 && newPoint.getY() + 2 < MAP_WIDTH) && !MAP[newPoint.getX()][newPoint.getY() + 2]) {
82+
MAP[newPoint.getX()][newPoint.getY()] = true;
83+
MAP[newPoint.getX()][newPoint.getY() - 1] = true;
84+
addPoints(newPoint);
85+
break;
86+
}
87+
}
88+
}
89+
if (countBot>=4){
90+
changeMap();
91+
}
92+
}
93+
94+
//метод изменяет наш лабиринт, "дробя" его на свободные ходы
95+
//т.е рандомим точку, проверяем есть ли в ней препятствие, если есть удаляем препятствие смешаемся по оси У
96+
public void changeMap() {
97+
for (int i = 0; i < MAP_HEIGHT * 2; i++) {
98+
int rnd1 = (int) (Math.random() * MAP_HEIGHT-1);
99+
int rnd2 = (int) (Math.random() * MAP_WIDTH-1);
100+
if (MAP[rnd1][rnd2]) {
101+
int count=0;
102+
while (MAP[rnd1][rnd2] && rnd1 != MAP_HEIGHT-1 &&count<4) {
103+
MAP[rnd1][rnd2] = false;
104+
rnd2++;
105+
count++;
106+
}
107+
}
108+
}
109+
}
110+
111+
//задаем количество ботов и координаты их спавна
112+
public void setSpawnBot() {
113+
//проверям размер карты и исходя из него задаем количество ботов
114+
if (0 < MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 100) {
115+
countBot = 2;
116+
} else if (100 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 200) {
117+
countBot = 3;
118+
} else if (200 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 900) {
119+
countBot = 4;
120+
} else if (900 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 1_600) {
121+
countBot = 5;
122+
} else if (1_600 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 4_200) {
123+
countBot = 6;
124+
} else if (4_200 <= MAP_WIDTH * MAP_HEIGHT && MAP_WIDTH * MAP_HEIGHT < 8_100) {
125+
countBot = 9;
126+
} else {
127+
countBot = 12;
128+
}
129+
//создаем список точек в которых будут спавниться боты
130+
listOfSpawn = new ArrayList<>();
131+
for (int i = 0; i < countBot; ) {
132+
int rndX = (int) (Math.random() * MAP_HEIGHT);
133+
int rndY = (int) (Math.random() * MAP_WIDTH);
134+
if (!MAP[rndX][rndY]) {
135+
listOfSpawn.add(new Point(rndX, rndY));
136+
i++;
137+
}
138+
}
139+
}
140+
141+
142+
/*
143+
* Метод реализует список точек, в которые мы можем пойти от изначальной точки
144+
* */
145+
public List<Point> addPointsList(Point point) {
146+
List<Point> list = new ArrayList<>();
147+
if (0 <= point.getX() - 2 && !MAP[point.getX() - 2][point.getY()]) {
148+
list.add(new Point(point.getX() - 2, point.getY()));
149+
}
150+
if (point.getX() + 2 < MAP_HEIGHT && !MAP[point.getX() + 2][point.getY()]) {
151+
list.add(new Point(point.getX() + 2, point.getY()));
152+
}
153+
if (point.getY() + 2 < MAP_WIDTH && !MAP[point.getX()][point.getY() + 2]) {
154+
list.add(new Point(point.getX(), point.getY() + 2));
155+
}
156+
if (0 <= point.getY() - 2 && !MAP[point.getX()][point.getY() - 2]) {
157+
list.add(new Point(point.getX(), point.getY() - 2));
158+
}
159+
return list;
160+
}
161+
162+
/*
163+
* Добавляем точки, в которые можем пойти, в нашу очередь
164+
* */
165+
public void addPoints(Point point) {
166+
if (0 <= point.getX() - 2 && !MAP[point.getX() - 2][point.getY()]) {
167+
queuePoint.add(new Point(point.getX() - 2, point.getY()));
168+
}
169+
if (point.getX() + 2 < MAP_HEIGHT && !MAP[point.getX() + 2][point.getY()]) {
170+
queuePoint.add(new Point(point.getX() + 2, point.getY()));
171+
}
172+
if (point.getY() + 2 < MAP_WIDTH && !MAP[point.getX()][point.getY() + 2]) {
173+
queuePoint.add(new Point(point.getX(), point.getY() + 2));
174+
}
175+
if (0 <= point.getY() - 2 && !MAP[point.getX()][point.getY() - 2]) {
176+
queuePoint.add(new Point(point.getX(), point.getY() - 2));
177+
}
178+
}
179+
180+
//записываем наши данные в файлы
181+
public void PrintMap() {
182+
try {
183+
WriteMap writeMap = new WriteMap(MAP, countBot, listOfSpawn);
184+
writeMap.writeMap();
185+
} catch (IOException e) {
186+
}
187+
}
188+
189+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import java.util.List;
2+
3+
public class InitSettings {
4+
private int WIDTH;
5+
private int HEIGHT;
6+
private int CountBot;
7+
private List<Point> ListOfSpawn;
8+
9+
public InitSettings(int WIDTH, int HEIGHT, int countBot, List<Point> listOfSpawn) {
10+
this.WIDTH = WIDTH;
11+
this.HEIGHT = HEIGHT;
12+
this.CountBot = countBot;
13+
this.ListOfSpawn = listOfSpawn;
14+
}
15+
16+
17+
//задаем радиус видимости в зависимости от количества ботов
18+
public int getViewRadius() {
19+
if ( CountBot <= 4) {
20+
return 4;
21+
} else if (CountBot <= 8) {
22+
return 7;
23+
} else if (CountBot <= 12) {
24+
return 10;
25+
}else {
26+
return 13;
27+
}
28+
}
29+
30+
//задаем радиус майнинга монет в зависимости от количества ботов
31+
public int getMiningRadius() {
32+
if ( CountBot <= 4) {
33+
return 2;
34+
} else if (CountBot <= 8) {
35+
return 3;
36+
} else {
37+
return 5;
38+
}
39+
}
40+
//задаем радиус атаки в зависимости от количества ботов
41+
public int getAtackRadius() {
42+
if ( CountBot <= 4) {
43+
return 2;
44+
} else if (CountBot <= 8) {
45+
return 3;
46+
} else {
47+
return 5;
48+
}
49+
}
50+
51+
public int getWIDTH() {
52+
return WIDTH;
53+
}
54+
55+
public int getHEIGHT() {
56+
return HEIGHT;
57+
}
58+
public List<Point> getListOfSpawn(){
59+
return ListOfSpawn;
60+
}
61+
}

CreateMap/src/main/java/Point.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import java.util.Set;
2+
3+
public class Point {
4+
private int x;
5+
private int y;
6+
7+
public Point(int x, int y) {
8+
this.x = x;
9+
this.y = y;
10+
}
11+
12+
public int getX() {
13+
return x;
14+
}
15+
16+
public int getY() {
17+
return y;
18+
}
19+
20+
public String toString() {
21+
return x + " " + y;
22+
}
23+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import java.io.FileWriter;
2+
import java.io.IOException;
3+
import java.io.Writer;
4+
import java.util.List;
5+
6+
public class WriteMap {
7+
private boolean[][] MAP;
8+
private int CountBot;
9+
private List<Point> ListOfSpawn;
10+
11+
public WriteMap(boolean[][] MAP,int countBot,List<Point> listOfSpawn) {
12+
this.MAP = MAP;
13+
CountBot=countBot;
14+
ListOfSpawn=listOfSpawn;
15+
}
16+
17+
18+
public void writeMap() throws IOException {
19+
InitSettings settings=new InitSettings(MAP.length,MAP[0].length,CountBot,ListOfSpawn);
20+
String nameOfFile="maze_"+CountBot+"_6.map";
21+
Writer writerOnTxt=new FileWriter("/Users/alekseyzhizhin/Documents/GitHub/hypernull/CreateMap/src/main/java/maze/"+nameOfFile);
22+
writerOnTxt.write("map_size "+settings.getWIDTH()+" "+settings.getHEIGHT()+"\n");
23+
writerOnTxt.write("view_radius "+settings.getViewRadius()+"\n");
24+
writerOnTxt.write("mining_radius "+settings.getMiningRadius()+"\n");
25+
writerOnTxt.write("attack_radius "+settings.getAtackRadius()+"\n");
26+
27+
for (int i = 0; i < MAP.length; i++) {
28+
for (int j = 0; j < MAP[0].length; j++) {
29+
if (MAP[i][j]) {
30+
writerOnTxt.write("Block " + i + " " + j + "\n");
31+
}else {
32+
}
33+
}
34+
}
35+
for (int i=0;i<ListOfSpawn.size();i++){
36+
writerOnTxt.write("spawn_position "+ListOfSpawn.get(i).getX()+" "+ListOfSpawn.get(i).getY()+"\n");
37+
}
38+
writerOnTxt.flush();
39+
writerOnTxt.close();
40+
}
41+
42+
}

CreateMap/src/main/java/main.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
public class main {
2+
public static void main(String[] args) {
3+
System.out.println("Карта успешно создана");
4+
CreateMap map=new CreateMap(180,240);
5+
}
6+
}

0 commit comments

Comments
 (0)