8

我正在使用 ACM 库用 Java 编写一个简单的战舰游戏。游戏开始后,船只应该随机放置在画布上,但问题是船只可能会相互覆盖,这在游戏中是不允许的。我怎样才能避免船被放置在彼此之上?

我的代码是:

private void putSmallShips() {
    for (int i = 0; i < SMALL_SHIP_QUANTITY; i++){
        smallShip = new GRect(SMALL_SHIP_WIDTH, SHIP_HEIGHT);
        int x = rgen.nextInt(10, 510);
        int y = rgen.nextInt(10, 510);
        while (true){
            gobj = getElementAt(x, y);
            if (gobj == null) break;
            x = rgen.nextInt(10, 510);
            y = rgen.nextInt(10, 510);
        }
        smallShip.setLocation(x, y);
        add(smallShip);
    }
}

private void putMiddleShips() {
    for (int i = 0; i < MIDDLE_SHIP_QUANTITY; i++){
        middleShip = new GRect(MIDDLE_SHIP_WIDTH, SHIP_HEIGHT);
        int x = rgen.nextInt(10, 530);
        int y = rgen.nextInt(10, 530);

        while (true){
            gobj = getElementAt(x, y);
            if (gobj == null) break;
            System.out.println("opa!");
            x = rgen.nextInt(10, 530);
            y = rgen.nextInt(10, 530);
        }
        x = x + i * 10;
        y = y + i * 10;
        middleShip.setLocation(x, y);
        add(middleShip);
    }
}

private void putBigShips() {
    for (int i = 0; i < BIG_SHIP_QUANTITY; i++){
        bigShip = new GRect(BIG_SHIP_WIDTH, SHIP_HEIGHT);
        int x = rgen.nextInt(10, 550);
        int y = rgen.nextInt(10, 550);
        while (true){
            gobj = getElementAt(x, y);
            if (gobj == null) break;
            x = rgen.nextInt(10, 550);
            y = rgen.nextInt(10, 550);
        }
        bigShip.setLocation(x, y);
        add(bigShip);
    }
}

如您所见,我在 for 循环中放置了一个 while 循环,但这无济于事。

4

3 回答 3

4

首先,我建议您拆分模型层和表示层。

换句话说,您可以定义 BattleShip 类,该类将包含船舶位置、大小和其他属性,并且它还可以包含检查它是否与另一艘船相交的方法。

然后,只有当实例不与集合中存在的任何实例相交时,您才能创建实例并将它们添加到集合中。

然后,您可以一次将它们全部呈现在屏幕上。

于 2013-12-31T12:15:12.330 回答
2

当您将它们输入到画布上时,我将创建一个数组并存储每个船舶位置的值。然后对于下一艘船,在你放置它之前,检查那个位置是否已经在画布上。显然,您必须记住,船的长度不同,有些船也是水平的和垂直的。

于 2013-12-31T12:23:42.990 回答
1

我最近在一次采访中实施了这个游戏。我的解决方案是将网格随机划分/平铺成 N > 3 个区域,然后通过将一艘船放置在一个区域中来放置所需的 3 艘船(2 艘战列舰和 1 艘驱逐舰)。N 个区域不会成对重叠,它们一起覆盖整个网格(我认为这称为网格平铺)。因此,由于 N 个区域不重叠,因此船只也不重叠。面试官非常喜欢这个解决方案。此外,随机性也得到了保证。

另一种解决方案是继续将船只放置在随机位置并继续检查船只 K 是否与之前放置的任何船只重叠(1、2、3、...、K-1),但这有一些明显的缺点,我没有t 喜欢: 1) 必须做的船重叠检查本身不是很优雅和干净;2) 这不是一个确定性过程,并且您事先不知道您的放置算法是否会终止,以及它是否会终止多少步。

所以我只是做了上面提到的这个随机分区/平铺解决方案。

于 2013-12-31T12:28:15.903 回答