Se tudo o que você deseja fazer é garantir que o bloco clicado tenha blocos abertos, eu apenas criaria uma função que verifique os blocos ao seu redor. E depois chame isso no bloco clicado.
Você pode configurá-lo em um loop (aninhado) ou apenas criar instruções if para ele. Então, no pseudo-código:
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
Editar com base no comentário
Há duas maneiras de lidar com a situação:
- (Mais fácil) Você pode simplesmente tocar um som e indicar que a posição que eles escolheram é inválida e eles precisam escolher outra opção.
- Use um algoritmo de pesquisa para encontrar um bloco aberto. No entanto, acho que deve haver limites em como você usa isso. Veja, por exemplo, uma situação em que eles clicam no lado esquerdo do mapa e o único ponto aberto fica longe no lado direito. Seu algoritmo de pesquisa encontra esse ponto aberto e coloca o outro warp lá. Isso não parece muito intuitivo e pode ser frustrante. Minha sugestão neste caso (supondo que você não queira fazer o número 1, que é minha sugestão principal), é pesquisar apenas os blocos ao redor do bloco atual (talvez em um raio de n blocos). Dessa forma, o warp gate não aparecerá muito longe de onde você clicou. Para fazer uma pesquisa como essa (assumindo um raio de 1 bloco), basta chamar a função acima nos oito blocos ao redor do atual (assumindo que o atual não estava disponível). Você pode fazer isso em um loop ou, novamente, com instruções if.