Я делаю игру-симулятор, в которой есть болваны и муравьи, а пока симуляция продолжается, болваны пытаются съесть муравьев. Проблема, с которой я столкнулся, заключается в инициализации созданного мной 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();
}
}
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
является квадратом, но если это не так, просто создайте две переменные для количества строк и столбцов и измените код соответствующим образом - однако логика та же.
Простым способом сделать это было бы создать один цикл 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 */
}
Посмотрим, сможете ли вы придумать, как сделать все остальное самостоятельно!
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].