Estou fazendo um jogo de defesa em torre 2D. Até agora eu tenho uma matriz 2D que funciona como uma grade para o meu jogo. Sou capaz de colocar torres nele, executar inimigos e algumas coisas de arrasto e torre.
Agora estou enfrentando um problema na lógica de posicionamento da torre. Quero que sempre haja um caminho percorrido pelos inimigos, o que significa que o usuário não deve ser capaz de bloquear completamente o caminho colocando torres. Por exemplo. se o usuário colocar torres verticalmente em um mapa, o algoritmo deverá impedir a colocação de uma torre que completará a linha vertical. Ou, de qualquer outra forma, deve haver pelo menos um espaço livre (passável) para que o inimigo possa escapar.
Minha lógica atual verifica em todas as direções sempre que a torre é colocada. Se houver uma torre para cima, ela chamará novamente a mesma função nessa torre superior até atingir uma parede. Retorna 1 para parede superior e 5 para parede inferior e retorna a função (torre para cima / baixo) se houver uma torre. aqui está o código:
int checkCollision(tower)
{
if( there is a tower up)
return checkCollision(up tower);
if(there is a tower down)
return checkCollision(down tower);
......all directions.....
if( there is a wall on UP )
return 1;
if( there is a wall DOWN )
return 5;
....all walls......
return 0;
}
Agora, o que eu quero é verificar simultaneamente se existe uma parede norte e uma parede sul ou verificar outras direções com qualquer outra possibilidade (como para cima, para baixo, diagonal para cima, diagonal para baixo ... e assim por diante) para não deixar o usuário coloque uma torre, pois deve haver um lugar para o inimigo.
Estou insatisfeito com meu código no momento. Quero dizer, meu código diz que uma parede foi encontrada, mas como posso verificar se uma parede é encontrada em uma direção e uma parede também é encontrada em outra direção? Não quero entrar em possibilidades como:
if(checkCollision(tower) == 1 && checkCollision(tower) == 5)
"You cannot place"
Eu quero algo como:
if( any combination of more than 2 wall found and there is entry/exit point in between) //so it is wall to wall
"You cant place"
Eu também tentei pré-calcular sinalizadores se houver paredes nos dois lados (como de cima para baixo, de diagonal etc.), então não deixe o usuário colocar a torre, mas isso ainda não funciona.