Я загрузил ваш код из paste bin, первым делом я извлек этот метод и использовал его вместо проверки всех встроенных ячеек массива, чтобы я мог установить точку останова и посмотреть, какие значения для x
и y
и каково было содержимое этой индексированной ячейки.
private boolean isEmpty(final int x, final int y)
{
return world[x][y] == EMPTY;
}
Я бы извлек все проверки EMPTY
в нечто более читаемое, например isLeftEmpty(x,y)
и isRightEmpty(x,y)
и isNextLeftEmpty(x,y)
, это поможет вам понять правильность вашей логики в вашем коде.
Я бы также извлек (x + 1 < world.length)
в isNextXOutsideWorld(x)
, это поможет документировать ваши намерения и поможет в обосновании логики, которую вы намереваетесь.
У этого также есть побочный эффект упрощения логики в операторах if/elseif/else
.
Я сделал небольшую отладку и позволил ей работать в течение нескольких минут, и пришел к выводу, что следующая строка всегда соответствует и заменяет следующую else if
инструкцию.
else if ((x + 1 < world.length) && isEmpty(x + 1, y + 1) &&
(x - 1 >= 0) && isEmpty(x - 1,y + 1))
всегда верно, когда я запускаю его, поэтому оно никогда не достигает следующего оператора
else if ((x - 1 >= 0) && isEmpty(x - 1,y + 1))
Я бы попытался разбить каждое из else/if
выражений на вызовы методов с описательными именами и просто все их по порядку, используя шаблон Strategy
, поскольку все они взаимоисключающие. Этот большой метод определенно является запахом кода, в сочетании со всеми этими else/if
блоками, вонючий коэффициент высок.
Очень трудно экстраполировать, каково ваше предполагаемое поведение, из всего шума в if/elseif/else
блоках.