Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 战舰游戏-战舰重叠_Java_Java Canvas_Acm Java Libraries - Fatal编程技术网

Java 战舰游戏-战舰重叠

Java 战舰游戏-战舰重叠,java,java-canvas,acm-java-libraries,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);

我正在使用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);
    }
}
private void-putsallships(){
对于(int i=0;i

正如您所见,我在for循环中加入了while循环,但它没有帮助。

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

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

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


然后您可以一次在屏幕上渲染它们

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

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

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


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

快速的方法是检查船舶将占用的任何位置是否已经被占用……while循环确保船舶的起点不会被放置在完全相同的点上,但不考虑船舶的其余部分,因此存在重叠。你也可以发布你的add函数的代码,因为那可能是放置代码的最佳位置,包括while循环和随机数生成。我认为将船只放置在随机位置更有意义。如果你事先知道发货地点,玩游戏会有点恼火。@user1455836是的,当然,但随机性也是有保证的(因为网格的分区/平铺是随机的,也就是说,我不总是使用相同的网格平铺)。