это я снова. Я пытаюсь сделать очень простую игру Battleships. Теперь я хочу, чтобы корабли были отделены хотя бы одной свободной ячейкой. Посмотрите на картинкуБоевые корабли не могут быть размещены на краю
Как вы видите, край полностью корабельного бесплатно, что делает доступным количество размещения гораздо меньше (или меньше? Извините за мой плохой английский).
«Поле» - это просто массив int [10] [10].
У меня есть очень грубый метод, чтобы проверить avaibality поместить корабль: (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;
}
Не могли бы вы сказать мне, где ошибка и как я могу сделать корабли быть размещены даже на краях?
Вы не хотите испытывать воду. Вы хотите проверить, нет ли еще какого-то корабля. – NeplatnyUdaj
IS_WATER означает пустую ячейку – Groosha
Я вижу это. Но если вы попытаетесь это сделать, проверив для кораблей, алгоритм будет легче понять. – NeplatnyUdaj