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