2015-01-27 3 views
0

все. Я работаю над небольшой игрой, в которой 2D-массив создан для размещения каждой плитки «карты» игры. Игра порождает игрока и кучу разнообразных предметов. Ячейки выглядят так:Создание случайно сгенерированных объектов в 2D-массиве

private String [][] cells; 

... 

public void set(int cellX, int cellY, String str) 
{ 
    cells[cellX][cellY] = str; 
} 

с каждой строкой, указывающей на то, что ячейка в каждом месте выглядит. Например, иногда создается стена, и иногда создаются проходы (все это считывается из файла). Итак, вопрос в следующем:

Как я могу случайным образом генерировать объекты на определенных ячейках? Например, если у меня всего 36 ячеек (6x6), но только 23 из них могут быть «перемещены» игроком, как я могу случайным образом генерировать объекты, у которых есть равная вероятность появления на каждом из них?

Код, который у меня есть до сих пор.

public void draw() 
{ 
    for (int x = 0; x < cells.length; x++) 
    { 
     for (int y = 0; y < cells[w].length; y++) 
     { 
      if(cells[x][y] == "W"){ 
       Cell wall = new Cell(config.wallImage()); 
       wall.draw(config, x, y); 
      if(cells[x][y] == "P"){ 
       Cell passage = new CellPassage(config.passageImage()); 

       // This is where I need to check to see if the item is okay 
       // to be placed. If it is unable, nothing will be added to 
       // the Cell passage. 
       //passage.attemptToAdd(item); 

       passage.draw(config, x, y); 
      } 
     } 
    }  
    hero.draw(); 
} 
+4

Я прочитал ваше описание дважды, и я все еще не уверен, что вы пытаетесь сделать, но в качестве побочной рекомендации я могу сказать точно, не делайте этого: 'if (cells [x] [y] == "W") {'. не сравнивайте строки с помощью '==' или '! =', так как это сравнивается для ** равенства объектов **, то ли два объекта ** идентичны **, и это не то, что вы хотите. Вы хотите ** функциональное равенство **, и поэтому используйте методы 'equals (...)' или 'equalsIgnoreCase (...)'. Итак, вместо этого, 'if (cells [x] [y] .equals (" W ")) {' –

+1

Вы хотите создать лабиринт? Должен ли каждый «проход» быть доступен из любого другого «прохода»? – n0rd

+2

Я согласен с @HovercraftFullOfEels. Кроме того, вам не хватает закрывающего '' 'перед вторым' if'. И вы не имеете в виду 'cells [x] .length' во втором' if' тоже? –

ответ

2

Таким образом, было обсуждение в чате с OP и это проблема, который, казалось, немного запутанным от вопроса пост:

  1. Есть Item, такие как Key и Gem, которые могут породить в каждом раунде.
  2. У этих Item есть номер предела, который должен быть порожден каждый раунд. Например, в каждом раунде может появиться 5 Gem.
  3. Они должны появляться в проходах с равной вероятностью.

Таким образом, чтобы решить эту проблему, мое предложение:

  1. Создание ArrayList из Cell. Храните все ячейки проходов.
  2. Генерировать случайное число от 0 до длины массива - 1.
  3. Повторяйте до тех пор, пока не достигнут лимит необходимых предметов.

Это должно выглядеть примерно так:

public void addItem(Item item, int limit) 
{ 
    ArrayList<Cell> passages = new ArrayList<Cell>(); 

    for(int x = 0; x < cells.length; x++) 
    { 
     for (int y = 0; y < cells[w].length; y++) 
     { 
      if (cells[x][y] == "P") //if it's a passage 
       passages.add(new Cell(x,y)); 
     } 
    } 


    Random rand = new Random(); 
    while(spawnedItems < limit){ 

     if(passages.size() == 0) 
      throw LimitImpossibleError(); 

     int randomNum = rand.nextInt(passages.size()); 

     items.add(new ItemPosition(item, passages.get(randomNum))); //assuming that you have a global ArrayList of Item and respective Cell (ItemPosition) to draw them later 
    } 
} 

Другой вопрос ФП в обсуждении было как рисовать Item позже. Итак, я дал ему 2 предложения:

  1. Измените представление лабиринта на какой-то объект, представляющий то, что находится в лабиринте. Например, CellInfo, который может быть родителем Wall, Passage, Item и т. Д. Это, однако, потребует значительных изменений в реальной работе. Например, он читает лабиринт из файла.
  2. Имея ArrayList с Item и соответствующим Cell, где он должен быть нарисован. В методе draw, после рисования всех стен и проходов (единственное, что представлено в лабиринте с String), пройдите по этому ArrayList и нарисуйте их в соответствующем положении.
2

Вы можете создать ArrayList точек, которые имеют право иметь пункт на них, а затем случайным образом выбирать их с помощью [your ArrayList's name].get(Math.random() * [your ArrayList's name].size())

Смежные вопросы