2016-05-15 6 views
0

Я разрабатываю генератор карт в 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; 

} 

Я понятия не имею, о что случилось с ним.

+0

Вы можете использовать одни и те же значения 'movingThroughX' /' Forward' дважды. Разве не должно быть 4 отдельных случая? – usr2564301

+0

Вы правы, но это было проблемой, так как я до сих пор получаю восходящего покровителя и меньше флотилей, чем ожидалось. –

+0

Не должно быть перемещениеThroughX и movingThroughY? Я вижу только X. Кроме того, я настоятельно рекомендую вместо представления направления с булевыми словами использовать целые числа «dx» и «dy», чтобы представить изменение позиции со следующим шагом. Распечатайте их, и вы легко сможете увидеть направление, над которым оно ДОЛЖНО двигаться. Это сделает ваш код намного легче отлаживать. – Luke

ответ

0

Я получил это работает

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; 
     } 
    } 
    int dx, dy; 
    dx = 0; 
    dy= 1; 
    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){ 

     //rotate 
     decide = rand.nextInt(100); 
     if(decide<25){ 

     }else if(decide<50){ 
      if(dx == 1){ 
       dy = -1; 
       dx = 0; 
      }else if(dx == -1){ 
       dy = 1; 
       dx = 0; 
      }else if(dy == 1){ 
       dx = 1; 
       dy = 0; 
      }else{ 
       dx = -1; 
       dy = 0; 
      } 
     }else if(decide<75){ 
      if(dx == 1){ 
       dy = 1; 
       dx = 0; 
      }else if(dx == -1){ 
       dy = -1; 
       dx = 0; 
      }else if(dy == 1){ 
       dx = -1; 
       dy = 0; 
      }else{ 
       dx = 1; 
       dy = 0; 
      } 
     }else{ 
      dx = -dx; 
      dy = -dy; 
     } 


     //aply movement 
     currentX += dx; 
     currentY += dy; 
     currentX = Math.min(Math.max(0,currentX),floorTiles-1); 
     currentY = Math.min(Math.max(0,currentY),floorTiles-1); 


     //place tiles 

     if(map[currentX][currentY] == 0){ 
      map[currentX][currentY] = 1; 
      counter++; 
     } 


    } 
    return map; 

}