Создание ArrayList объектов с циклом, проверка на перекрывающиеся объекты - PullRequest
0 голосов
/ 13 декабря 2010

Я делаю игру для класса, и один элемент игры отображает количество капуст, которые хранятся в ArrayList. Этот ArrayList должен быть фиксированным числом 20, 10 из Good Cabbage и 10 из Bad Cabbage.

Поскольку капусты созданы, я хочу убедиться, что они не перекрываются при их отображении. В связи с этим у меня возникают проблемы: когда я нахожу капусту, которая перекрывается, я не знаю, как вернуться и создать новую капусту на ее месте. Пока код обнаруживает перекрытие, он просто останавливает цикл. Думаю, у меня возникают проблемы с правильным выходом из цикла и перезапуском по индексу, который остается незаполненным.

Вот что у меня есть для этого. Любые предложения будут высоко оценены.

        // Initialize the elements of the ArrayList = cabbages
    // (they should not overlap and be in the garden) ....
    int minX = 170 ;
    int maxX = 480;
    int minY = 15;
    int maxY = 480;
    boolean r = false;
    Cabbage cabbage;
    for (int i = 0; i < N_GOOD_CABBAGES + N_BAD_CABBAGES; i++){
        if (i % 2 == 0){
        cabbage = new GoodCabbage((int)(Math.random()* (maxX-minX + 1))+ minX,
                (int)(Math.random()*(maxY-minY + 1))+ minY,window);
        } 
        else {
            cabbage = new BadCabbage((int)(Math.random()* (maxX-minX + 1))+ minX,
                    (int)(Math.random()*(maxY-minY + 1))+ minY,window);
            }
        if (i >= cabbages.size()){
        // compares the distance between two cabbages
            for (int j = 0; j < cabbages.size(); j++){
                Point c1 = cabbage.getLocation();
                Cabbage y = (Cabbage) cabbages.get(j);
                Point c2 = y.getLocation();
                int distance = (int) Math.sqrt((Math.pow((c1.x - c2.x), 2) + Math.pow((c1.y - c2.y),2)));
                if (distance <= (CABBAGE_RADIUS*2) && !(i == j)){
                    r = true;
                }
            }
        if (r){
            break;
            }
        cabbage.draw();
        cabbages.add(i, cabbage);
        }       
    }

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Самый простой способ сделать это, вероятно, добавить еще один цикл.

Цикл do ... while подходит для случаев, когда вам всегда требуется хотя бы одна итерация. Что-то вроде:

  boolean overlapped;
  do {
      // create your new cabbage here

      overlapped = /* check whether it overlaps another cabbage here */;
  } while (overlapped);

  cabbage.draw();
  cabbages.add(i, cabbage);
0 голосов
/ 13 декабря 2010

Похоже, вы делаете капустные объекты, а затем выбрасываете их, что является (тривиальной) тратой.

Почему бы не выбрать случайные X и Y, проверить, есть ли место в этом месте, а затем приготовить капусту, когда у вас будет хорошее место? Вы будете просто перебирать числа, а не создавать и отбрасывать целые Объекты. Кроме того, вам не придется повторять случайный код местоположения для хорошей и плохой капусты.

int x, y делать { // выбираем x и y } while (cabbageOverlaps (x, y, list)

// создать капусту в этом x, y и добавить ее в список

булевы капустные перекрытия (int x, int y, ArrayList существующих Cabbages)

...