又是我。我正在尝试制作一个非常简单的战舰游戏。
现在,我要使飞船之间至少有一个自由空间。看图片



如您所见,该边缘完全是免费的,这使得可用的放置数量大大减少(或更少?对不起,我的英语不好)。

“字段”只是一个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/

10-10 15:17