又是我。我正在尝试制作一个非常简单的战舰游戏。
现在,我要使飞船之间至少有一个自由空间。看图片
如您所见,该边缘完全是免费的,这使得可用的放置数量大大减少(或更少?对不起,我的英语不好)。
“字段”只是一个int [10] [10]数组。
我有一个非常不礼貌的方法来检查是否可用以放置船只:
(IS_WATER const = 0)
private static boolean checkIfShipAvailable(int x, int y, int dir, int length) {
int counter = 0;
switch(dir) {
case DIRECTION_RIGHT:
try {
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++;
if(field[x][y+1] == IS_WATER) counter++;
if(field[x+1][y-1] == IS_WATER) counter++;
if(field[x+1][y+1] == IS_WATER) counter++;
if(field[x+length-1][y-1] == IS_WATER) counter++;
if(field[x+length-1][y+1] == IS_WATER) counter++;
if(field[x+length][y] == IS_WATER) counter++;
if(field[x+length][y-1] == IS_WATER) counter++;
if(field[x+length][y+1] == IS_WATER) counter++;
} catch (IndexOutOfBoundsException e) {
counter++;
}
Log.d(TAG, "Direction: Right. Counter = " + counter);
if (counter == 12)
return true;
break;
case DIRECTION_DOWN:
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-1][y+length-1] == IS_WATER) counter++ ;
if(field[x+1][y+length-1] == IS_WATER) counter++ ;
if(field[x-1][y+length] == IS_WATER) counter++ ;
if(field[x][y+length] == IS_WATER) counter++ ;
if(field[x+1][y+length] == IS_WATER) counter++ ;
} catch (IndexOutOfBoundsException e) {
counter++;
}
Log.d(TAG, "Direction: Down. Counter = " + counter);
if (counter == 12)
return true;
break;
}
return false;
}
那是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;
}
您能告诉我,哪里出了问题,如何使船只甚至可以放在边缘?
最佳答案
不要测试水。测试是否有另一艘船。像这样:
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;
}
关于java - 战舰的船只不能放在边缘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17047815/