Я делаю игру-симулятор, в которой есть болваны и муравьи, а пока симуляция продолжается, болваны пытаются съесть муравьев. Проблема, с которой я столкнулся, заключается в инициализации созданного мной 2-мерного массива. Мне нужно 100 муравьев и 5 дудлбагов, которые можно случайным образом разместить на сетке. Я рандомизировал сетку, но в целом, поэтому я получаю случайное количество муравьев и болванов. Я также работаю с меньшим массивом, просто использую, чтобы это работало. Любая помощь приветствуется.

 Random rand = new Random(); 
int[][] cells = new int[10][10];

public void display() {

    for(int i=0; i<10; i++) {
        for(int j=0; j<10; j++) {
            cells[i][j] = (int) (Math.random()*3);

            if(cells[i][j] == 2) { // 2 = ants; 
                cells[i][j] = 4;
            }
            if(cells[i][j] == 1) { // 1 = doodlebugs 
                cells[i][j] = 3;
            }
            if(cells[i][j] == 0) {
                cells[i][j] = 0;
            }
        System.out.print(cells[i][j]);  
        }
        System.out.println();
    }
}
0
amanhasnoname 12 Мар 2018 в 20:50

2 ответа

Лучший ответ

Вы создали массив 10x10, что означает, что он имеет 100 позиций, что означает, что все позиции должны быть заняты муравьями? (потому что вы сказали, что вам нужно 100 муравьев - если в одной позиции не может быть более одного насекомого).


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

Если вам нужно точное количество муравьев и дудлбагов, они исправлены - вы не звоните random(), чтобы узнать, муравей это или дублбаг, вы уже знаете, сколько из них вы необходимость. Их положения должны быть случайными, поэтому следует вызвать random(), чтобы получить позиции строки и столбца, а не тип насекомого.

Прежде всего, я бы создал несколько классов для представления насекомых и клетки:

// enum type, better than "magic numbers"
public enum Insect {
    ANT,
    DOODLEBUG;
}

public class Cell {

    // the insect placed in this cell
    private Insect insect;

    public Cell() {
        // cell starts without any insect
        this.insect = null;
    }

    public Insect getInsect() {
        return insect;
    }

    public void setInsect(Insect insect) {
        this.insect = insect;
    }

    // check if cell already has an insect
    public boolean isOccupied() {
        return this.insect != null;
    }
}

Затем инициализирую плату:

int size = 10; // assuming a square
Cell[][] cells = new Cell[size][size];
// fill with empty cells
for (int i = 0; i < cells.length; i++) {
    for (int j = 0; j < cells[i].length; j++) {
        cells[i][j] = new Cell();
    }
}

А потом заполняю насекомыми:

// how many ants? Just an example, change the value according to your needs
int nAnts = 8;
// how many doodlebugs? Just an example, change the value according to your needs
int nBugs = 2;

Random rand = new Random();

// place the ants
for (int i = 0; i < nAnts; i++) {
    int row, column;
    // get a random position that's not occupied
    do {
        row = rand.nextInt(size);
        column = rand.nextInt(size);
    } while (cells[row][column].isOccupied());

    // fill with ant
    cells[row][column].setInsect(Insect.ANT);
}

// place the doodlebugs
for (int i = 0; i < nBugs; i++) {
    int row, column;
    // get a random position that's not occupied
    do {
        row = rand.nextInt(size);
        column = rand.nextInt(size);
    } while (cells[row][column].isOccupied());

    // fill with doodlebug
    cells[row][column].setInsect(Insect.DOODLEBUG);
}

Циклы for с размещением насекомых немного повторяются, поэтому вы также можете преобразовать их в метод.

Я также предположил, что cells является квадратом, но если это не так, просто создайте две переменные для количества строк и столбцов и измените код соответствующим образом - однако логика та же.

1
tsttt2 12 Мар 2018 в 18:48

Простым способом сделать это было бы создать один цикл for, который будет повторяться столько раз, сколько требуется максимального количества вещей (в данном случае, муравьев и болванов). На каждой итерации цикла for вы можете генерировать случайные координаты объекта. Это равняется двум петлям, одной для муравьев и одной для болванов.

for (int i = 0; i < desiredNumOfAnts; i++)
{
     int randX = rand.nextInt(cells[i].length); // this generates a random X coordinate, up to the length of the current row
     int randY = rand.nextInt(cells.length); // this generates a random Y coordinate, according to the height of the array

     /* using these coordinates, insert a new ant into the cells */
}

Посмотрим, сможете ли вы придумать, как сделать все остальное самостоятельно!

0
Nick Silvestri 12 Мар 2018 в 18:14