战舰游戏:在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 . . .]