战舰游戏:在java中随机放置战舰
我正在写游戏的代码。我怎么做这个板子战舰游戏:在java中随机放置战舰,java,Java,我正在写游戏的代码。我怎么做这个板子 It should be like this example. 0 1 2 3 4 5 6 7 8 9 0 . . . . . . . . . . 1 . . o . . . . . . . 2 . . . . . . . o . . 3 . . . . . . . o . . 4 . . . o o . . o . . 5 . . . . . . . o . o 6 . . . . . . . . . o 7 . o o o . . . . .
It should be like this example.
0 1 2 3 4 5 6 7 8 9
0 . . . . . . . . . .
1 . . o . . . . . . .
2 . . . . . . . o . .
3 . . . . . . . o . .
4 . . . o o . . o . .
5 . . . . . . . o . o
6 . . . . . . . . . o
7 . o o o . . . . . o
8 . . . . . . . . . o
9 . . . . . . . . . o
您的循环只迭代了5次,每次迭代中只会放置一个“o”。
其中一个解决方案可以是,有一个10x10的嵌套循环,在该循环中创建另一个大小可变的循环,以控制船舶的大小。最后,再添加一个条件来检查周围是否已经有船了 您可以检查此解决方案:
static int FIELD_SIZE = 10;
static void fillField() {
Random random = new Random();
int[][] field = new int[FIELD_SIZE][FIELD_SIZE];
for (int i = 5; i > 0; i--) {
//System.out.println("Placing ship with length: " + i);
// start point of the ship and direction
int x = random.nextInt(field.length);
int y = random.nextInt(field.length);
boolean vertical = random.nextBoolean();
// correct start point so that the ship could fit in the field
if (vertical) {
if (y + i > FIELD_SIZE) {
y -= i;
}
} else if (x + i > FIELD_SIZE) {
x -= i;
}
//System.out.println("Start point: " + x + ", " + y + "; dir: " + (vertical ? "VERTICAL" : "HORIZONTAL"));
boolean isFree = true;
// check for free space
if (vertical) {
for (int m = y; m < y + i; m++) {
if (field[m][x] != 0) {
//System.out.println("Neighbors found, " + x + ", " + m);
isFree = false;
break;
}
}
} else {
for (int n = x; n < x + i; n++) {
if (field[y][n] != 0) {
//System.out.println("Neighbors found, " + n + ", " + y);
isFree = false;
break;
}
}
}
if (!isFree) { // no free space found, retry
i++;
continue;
}
// fill in the adjacent cells
if (vertical) {
for (int m = Math.max(0, x - 1); m < Math.min(FIELD_SIZE, x + 2); m++) {
for (int n = Math.max(0, y - 1); n < Math.min(FIELD_SIZE, y + i + 1); n++) {
field[n][m] = 9;
}
}
} else {
for (int m = Math.max(0, y - 1); m < Math.min(FIELD_SIZE, y + 2); m++) {
for (int n = Math.max(0, x - 1); n < Math.min(FIELD_SIZE, x + i + 1); n++) {
field[m][n] = 9;
}
}
}
// fill in the ship cells
for (int j = 0; j < i; j++) {
field[y][x] = i;
if (vertical) {
y++;
} else {
x++;
}
}
}
// build char map
char[][] map = new char[FIELD_SIZE][FIELD_SIZE];
for (int i = 0; i < FIELD_SIZE; i++) {
for (int j = 0; j < FIELD_SIZE; j++) {
map[i][j] = field[i][j] == 0 || field[i][j] == 9 ? '.' : 'O';
}
}
// print map
Arrays.stream(map)
.forEach(m -> System.out.println(Arrays.toString(m).replace(",", "")));
}
换句话说,您有一个循环,用于迭代船舶的数量。你需要一个循环来迭代第n艘船应该占据的位置数。除了我对Hamza回答的评论之外:既然你知道第n艘船将占据多少位置,你可以使用这些信息来生成始终有效的船只位置。现在,如果你为一艘飞船选择了一个无效的起始位置,你什么也不做,不管是因为飞船在所选位置会占用太多空间,还是因为该位置已经有一艘飞船。
[. O O O O O . . . .]
[. . . . . . . . . .]
[. . . . . . . . . .]
[. . O . . . . . . .]
[. . . . . . . . . .]
[. . . . . . . . O .]
[. O O O O . . . O .]
[. . . . . . O . . .]
[. . . . . . O . . .]
[. . . . . . O . . .]