Presenterò un concetto generale e tre soluzioni usando quel concetto.
Il concetto è una mappa di influenza : per ogni posizione nella mappa, si memorizzerà un numero che rappresenta la distanza di ciascun punto di colore. In questo modo, per ogni posizione puoi interrogare quanto è distante da blu, rosso, verde, ecc. Chiamiamo il risultato è la mappa di influenza.
Per maggiori dettagli sulla motivazione, la creazione e l'uso delle mappe di influenza nei giochi, consultare: Mappatura dei meccanismi di influenza: rappresentazione, algoritmo e parametri .
Non ho idea di cosa serva questo muro, il mio principale canone è che stiamo parlando di un gioco di strategia e l'IA sta decidendo dove posizionare i muri. Per fare ciò, ci sono molti approcci oltre a quelli presentati qui. Un approccio semplice sarebbe quello di posizionare le pareti a una distanza fissa dai punti di colore e combinare le aree quando si sovrappongono - e, naturalmente, non costruirle sopra gli ostacoli - i vantaggi di questo metodo sono che garantisce che le pareti non siano troppo lontano per inviare truppe per difenderle ed è molto economico dal punto di vista computazionale. Presumo che tu voglia qualcosa di più complesso.
Soluzione 1 :
Per trovare un modo per avvolgere il blu, trova la differenza tra la distanza dal blu e qualsiasi altra cosa, per ogni punto. Addendum : L'area in cui la diffrerenza è positiva è il dominio di influenza per il blu. Se prendi i domini di influenza per ogni punto di colore, puoi costruire un diagramma Voronoi . Grazie a Sirisian per averlo menzionato .
Possiamo sostenere che per un punto vicino al blu, la differenza sarà positiva e per un punto vicino a un altro punto di colore, la differenza sarà negativa. Dato che la distanza è una funzione continua, con il teorema del valore intermedio, possiamo sostenere che almeno un punto nel mezzo la differenza si avvicinerà allo zero. Una soluzione sarebbe quella di tracciare un muro che minimizzi la distanza tra tutte le piastrelle in cui la differenza si avvicina allo zero.
Qualunque sia la soluzione che tenga conto degli ostacoli, dipende dalla funzione della distanza. Se usi solo le distanze di Manhattan o Euclide senza considerare possibili percorsi, il muro risultante non sfrutterà gli ostacoli esistenti nella mappa.
Nota: questa soluzione si avvicina alla stessa area per il blu e il resto in uno scenario piatto.
Soluzione 2 :
In astratto, puoi trovare i punti di strozzamento tra l'area di influenza del blu e gli altri, e quindi posizionare lì i muri. In questo modo i muri verranno posizionati in punti in cui l'influenza non è in equilibrio (i muri la mia estremità più vicina a un lato) ma ridurranno al minimo la lunghezza dei muri.
Un approccio utile per trovare i punti di strozzamento è suddividere lo scenario in nodi convessi e creare una rete che rappresenti lo scenario. Inizierai supponendo che metterai dei muri attorno ai nodi che hanno direttamente il blu, quindi inizierai ad avanzare sulla rete (aumentando sempre la distanza dal blu) e considerando la lunghezza del muro se lo hai posizionato attorno a ciò che hai avanzato finora. La tua soluzione è la posizione che aveva una lunghezza minima (e le posizioni delle pareti sono i punti di strozzamento).
In pratica, l'algoritmo è un po 'più complicato di quello perché potrebbero esserci delle ramificazioni nello scenario. Devi solo considerare ogni ramificazione una volta e scegliere la posizione migliore per il muro per quella ramificazione.
Soluzione 3 :
La prima soluzione ha il problema che potrebbe portare a un muro troppo lungo. La seconda soluzione ha il problema che potrebbe portare a muri troppo lontani dal blu.
Si noti che lavorare con pixel, riquadri o lavorare con una rete il concetto della mappa dell'influenza, poiché una rappresentazione della distanza dai punti di colore è valida e utile. Pertanto, è possibile applicare la soluzione 1 sulla rete di nodi convessi.
La mia terza soluzione è combinare i suddetti approcci. Una volta che lavori sulla rete, puoi considerare la lunghezza del muro e la differenza di influenza - e qualsiasi altra metrica che desideri - come un singolo indicatore "costo" che puoi ottimizzare.