Если все, что вы хотите сделать, это убедиться, что у клика по плитке есть открытые плитки, я бы просто создал функцию, которая проверяет плитки вокруг нее. И затем назовите это на нажатой плитке.
Вы можете установить его в (вложенный) цикл или просто создать для него операторы if. Итак, в псевдокоде:
function IsTileOpen(tile)
if tile NOT open
return false because if the clicked tile isn't open, why check any others
if tile on top row
return false because we're against the top wall
if tile on left column
return false because we're against the left wall
if tile on right column
return false because we're against the right wall
if tile on bottom row
return false because we're against the bottom wall
if top left tile NOT open
return false
if top tile NOT open
return false
if top right tile NOT open
return false
if left tile NOT open
return false
if right tile NOT open
return false
if bottom left tile NOT open
return false
if bottom tile NOT open
return false
if bottom right tile NOT open
return false
return true because all the surrounding tiles were open
end function
Редактировать на основе комментария
Есть два способа справиться с ситуацией:
- (Самый простой) Вы можете просто воспроизвести звук и указать, что выбранная ими позиция недействительна, и им нужно выбрать другой вариант.
- Используйте алгоритм поиска, чтобы найти открытую плитку. Тем не менее, я думаю, должны быть ограничения на то, как вы используете это. Возьмем, к примеру, ситуацию, когда они нажимают на левую сторону карты, а единственное открытое место находится далеко на правой стороне. Ваш алгоритм поиска находит это открытое место и помещает туда другую основу. Это не кажется очень интуитивным и может расстраивать. Мое предложение в этом случае (при условии, что вы не хотите делать № 1, что является моим основным предложением), - это искать только плитки вокруг текущей плитки (возможно, в радиусе n-плитки). Таким образом, ворота варпа не появятся слишком далеко от того места, где вы щелкнули. Чтобы выполнить такой поиск (при условии радиуса в 1 плитку), вам просто нужно вызвать вышеуказанную функцию на восьми плитках вокруг текущей (при условии, что текущая не была доступна). Вы можете сделать это в цикле или, опять же, с помощью операторов if.