战舰游戏 - 船重叠

时间:2013-12-31 12:05:59

标签: java java-canvas acm-java-libraries

我正在使用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循环,但它没有帮助。

3 个答案:

答案 0 :(得分:3)

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

换句话说,你可以定义类BattleShip,该类将保存船位,大小和另一个属性,它还可以包含检查它是否与另一艘船相交的方法。

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

然后你可以一次性在屏幕上渲染它们。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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