Java 战列舰可以';不要把它放在边缘上

Java 战列舰可以';不要把它放在边缘上,java,android,Java,Android,又是我。我想做一个非常简单的战舰游戏。 现在我想用至少一个空闲单元来分隔飞船。看这幅画 正如你所看到的,edge是完全免费的,这使得可用的放置数量要小得多(或者更少?对不起,我的英语不好) “Field”只是一个int[10][10]数组 我有一个非常粗鲁的方法来检查是否可以放置船只: (IS_水常数=0) 那是为2-4艘战舰准备的。对于1细胞船: private static boolean checkIfOneAvailable(int x, int y) { int c

又是我。我想做一个非常简单的战舰游戏。 现在我想用至少一个空闲单元来分隔飞船。看这幅画

正如你所看到的,edge是完全免费的,这使得可用的放置数量要小得多(或者更少?对不起,我的英语不好)

“Field”只是一个int[10][10]数组

我有一个非常粗鲁的方法来检查是否可以放置船只: (IS_水常数=0)

那是为2-4艘战舰准备的。对于1细胞船:

private static boolean checkIfOneAvailable(int x, int y) {
         int counter = 0;
         try {
                if(field[x-1][y-1] == IS_WATER) counter++ ;
                if(field[x][y-1] == IS_WATER)counter++ ;
                if(field[x+1][y-1] == IS_WATER) counter++ ;
                if(field[x-1][y] == IS_WATER) counter++ ;
                if(field[x+1][y] == IS_WATER) counter++ ;
                if(field[x-1][y+1] == IS_WATER) counter++ ;
                if(field[x+1][y+1] == IS_WATER) counter++ ;
                if(field[x][y+1] == IS_WATER) counter++ ;   
        } catch (IndexOutOfBoundsException e) {     
          counter++;
        } 
         if (counter == 8) 
             return true;
        return false;

     }

你能告诉我,哪里出了错,我怎么能把船放在边缘上呢?

如果
索引自动边界异常
以后发生
如果(字段…
捕获的队列从未执行,计数器不再增加


更好的解决方案:创建一个方法,该方法获取坐标并返回
字段[x][y]
值或一个特殊的
越界值(通过捕捉
索引自动边界异常或检查边界)

不要测试是否有水。测试是否有另一艘船。如下:

private static boolean checkIfOneAvailable(int x, int y) {        
    if(x!=0 && y!=0 && field[x-1][y-1] == IS_SHIP) return false;
    if(y!=0 && field[x][y-1] == IS_SHIP) return false;
    ...
    return true;
 }
请注意,我已将数组边界检查添加到条件中。将异常用于流控制被认为是一个坏习惯,主要是因为它很慢。 使用这种方法时,您还可以从以下事实中获得性能增益:您不必总是检查周围的所有字段。一旦发现冲突,您就会得到结果

此外,复制粘贴大型船舶的代码也没有意义。在放置船舶之前,您仍然可以对大型船舶的每个字段执行相同的检查:

private static boolean checkIfAvailable(int x, int y, int dir, int length){
    for (int i = 0; i<length; i++){
        switch (dir) {
            case DIRECTION_RIGHT:
                if (!checkIfOneAvailable(x+i,y))
                    return false;
                break;
            case DIRECTION_DOWN:
                if (!checkIfOneAvailable(x,y+i))
                    return false;
                break;
        }             
    }
    return true;
}
private静态布尔校验可用(int x,int y,int dir,int length){

对于(int i=0;i你不想测试水。你想检查是否已经没有另一艘船了。IS_water意味着空单元格。我看到了。但是如果你尝试通过测试船只来做这件事,算法会更容易理解。你的意思是(if((字段[x+1][y]==IS_water)| myNewMethod==true)?你赢了!将来他还可以在调试模式下运行应用程序并逐步执行该方法。这会比询问堆栈溢出更快,尽管这会使我们无法争取代表分数哈哈。@Kondra007不,用
myNewMethod(x+1,y)替换你的
字段[x+1][y]==IS_WATER
!=IS_SHIP
@Mr.Will,顺便问一句,你能给我一个链接来解释如何在Eclipse中使用调试器吗?我习惯于在脑子里调试,但有时很难。我认为它不适用于大型船舶,因为字段[x+1][y]例如,虽然方向正确,但总是会给出错误。但这只是一个我不明白的注释。为什么会是错误的?我以为你在检查是否可以放置整艘船之后才放置它。因此,如果你有一艘2*1的船,那么你要检查船的两部分是否都可以放置。捕获物在哪里?你能看看这个:……没有船吗位于底部和右侧。其他方法可能也有问题。我认为您发布的内容很好。请使用调试器进行尝试。设置它一点都不困难,您会找到大量教程。谢谢您的帮助=)
private static boolean checkIfAvailable(int x, int y, int dir, int length){
    for (int i = 0; i<length; i++){
        switch (dir) {
            case DIRECTION_RIGHT:
                if (!checkIfOneAvailable(x+i,y))
                    return false;
                break;
            case DIRECTION_DOWN:
                if (!checkIfOneAvailable(x,y+i))
                    return false;
                break;
        }             
    }
    return true;
}