Я разрабатываю генератор карт в java для своей игры с шутером сверху, и я реализую нечто похожее на то, что делает ядерный трон. Он создает «ходунок» , который проходит через карту, создавая напольные плитки. Существует вероятность, что она будет поворотным поворотом 90, -90 и 180 градусов после того, как она переместит одну плиту.Map generator, возвращающий странные результаты
Ходок, который должен работать до тех пор, пока не будет установлено необходимое количество плиток для пола.
Функция иногда берет навсегда, а время ее работы возвращает карту с меньшим количеством напольных плиток, чем предполагалось, и она всегда имеет один и тот же шаблон. Это примерный результат:
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000000000000000010000000000000000000000
00000000000000000000000000011000000000000000000000
00000000000000000000000000001111000000000000000000
00000000000000000000000000000001100000000000000000
00000000000000000000000000000000100000000000000000
00000000000000000000000000000000110000000000000000
00000000000000000000000000000000011000000000000000
00000000000000000000000000000000001100000000000000
00000000000000000000000000000000000111000000000000
00000000000000000000000000000000000001110000000000
00000000000000000000000000000000000000010000000000
00000000000000000000000000000000000000011000000000
00000000000000000000000000000000000000001100000000
00000000000000000000000000000000000000000111000000
00000000000000000000000000000000000000000001000000
00000000000000000000000000000000000000000001100000
00000000000000000000000000000000000000000000100000
00000000000000000000000000000000000000000000110000
00000000000000000000000000000000000000000000011000
00000000000000000000000000000000000000000000001000
00000000000000000000000000000000000000000000001110
00000000000000000000000000000000000000000000000011
1 является напольной плитки. 0 ничего не начинайте.
Эта карта имеет только 44 плитки для пола, а функция generateMap была вызвана с 50 желаемыми напольными плитами.
Вот его мой код:
public static int[][]generateMap(int floorTiles){
int map[][] = new int[floorTiles][floorTiles];
int currentX, currentY;
for (int x = 0; x<floorTiles;x++){
for (int y = 0; y<floorTiles;y++){
map[x][y] = 0;
}
}
boolean movingThroughX = true;
boolean Forward = true;
Random rand = new Random();
int counter = 0;
int decide = 0;
currentX = (floorTiles/8)*2 + (int)(Math.random() * ((floorTiles/8)*6 - (floorTiles/8)*2) + 1);
currentY = (floorTiles/8)*2 + (int)(Math.random() * ((floorTiles/8)*6 - (floorTiles/8)*2) + 1);
while(counter < floorTiles){
if(map[currentX][currentY] ==0){
map[currentX][currentY] = 1;
counter++;
}
//aply movement
if(movingThroughX){
if(Forward){
if(currentX<floorTiles-1){
currentX++;
}
}else{
if(currentX>floorTiles+1){
currentX--;
}
}
}else{
if(Forward){
if(currentY<floorTiles-1){
currentY++;
}
}else{
if(currentY>floorTiles+1){
currentY--;
}
}
}
decide = rand.nextInt(100);
if(decide<20){
//keep walking forward
}
else if(decide<45){
//turn 90degres
if(movingThroughX){
if(Forward){
movingThroughX = false;
Forward = false;
}else{
movingThroughX = false;
Forward = true;
}
}else{
if(Forward){
movingThroughX = true;
Forward = true;
}else{
movingThroughX = false;
Forward = true;
}
}
}else if(decide<70){
//turn -90degres
if(movingThroughX){
if(Forward){
movingThroughX=false;
Forward = true;
}else{
movingThroughX = false;
Forward = false;
}
}else{
if(Forward){
movingThroughX = true;
Forward = false;
}else{
movingThroughX = true;
Forward = true;
}
}
}else{
//turn 180 degres
Forward = !Forward;
}
}
return map;
}
Я понятия не имею, о что случилось с ним.
Вы можете использовать одни и те же значения 'movingThroughX' /' Forward' дважды. Разве не должно быть 4 отдельных случая? – usr2564301
Вы правы, но это было проблемой, так как я до сих пор получаю восходящего покровителя и меньше флотилей, чем ожидалось. –
Не должно быть перемещениеThroughX и movingThroughY? Я вижу только X. Кроме того, я настоятельно рекомендую вместо представления направления с булевыми словами использовать целые числа «dx» и «dy», чтобы представить изменение позиции со следующим шагом. Распечатайте их, и вы легко сможете увидеть направление, над которым оно ДОЛЖНО двигаться. Это сделает ваш код намного легче отлаживать. – Luke