Ci scusiamo per il titolo scadente ma non avevo un modo migliore per esprimerlo ...
Quindi c'è questo fantastico gioco per Nintendo (sì!) Su Wii chiamato WiiPlay . Ci sono 9 minigiochi al suo interno e il mio preferito si chiama Tanks! . Si tratta di distruggere i carri armati nemici della COM senza farsi distruggere. Ecco uno screenshot di un livello:
Un modo per distruggere i carri armati è sparando proiettili. C'è questo carro armato nemico verde lime che spara proiettili ad alta velocità che rimbalzano (contro le pareti e i blocchi) due volte. Puoi vedere come il carro armato del giocatore può essere immediatamente distrutto se rimane dove si trova ora, poiché quel carro armato di calce al centro può sparare un proiettile che segue il percorso verde che ho disegnato sull'immagine.
Come programmatore dilettante, mi sono chiesto come può il carro armato di calce determinare in quale direzione dovrebbe sparare per colpire il carro armato del giocatore.
Ci ho pensato da solo ma non ho trovato nessun algoritmo possibile. Spiegherò le mie conclusioni nel caso in cui ispirino qualcuno. Solo per semplicità durante la mia spiegazione, presumo che un muro sia qualsiasi superficie contro la quale un proiettile può rimbalzare . Un rettangolo isolato di blocchi forma così quattro pareti.
Ho concluso che i 2 punti in cui i rimbalzi dei proiettili si trovano sempre su un lato di un parallelogramma o diventano vertici opposti di un parallelogramma. Il carro armato nemico che spara e il carro armato del giocatore che mira non sono necessariamente gli altri 2 vertici, ma si trovano sicuramente sulle linee colinear a uno dei quattro lati del parallelogramma. Ecco un'illustrazione dei 4 possibili modi per formare un parallelogramma:
HOR-VER significa che il proiettile colpisce prima un muro orizzontale, quindi colpisce un muro verticale.
E poi sono bloccato. Ho pensato di spostarmi su una linea che collega il carro armato nemico e il carro armato del giocatore intorno alla mappa per vedere se forma un parallelogramma con due colpi con qualsiasi muro, ma questo non funziona sempre perché il carro armato nemico e il carro armato del giocatore non lo sono necessariamente coincidente con i vertici del parallelogramma.
Inoltre, non sono sicuro del flusso generale dell'algoritmo. L'algoritmo accetta una delle seguenti 2 strutture o forse mi sbaglio con entrambe?
- Continua a capire i possibili percorsi e segna sempre uno dei migliori (può essere il più breve, il più oscuro, il più inevitabile o una valutazione combinata e ponderata basata su più criteri) e dimentica il resto. Quello rimasto dopo tutto il calcolo è il migliore da prendere.
- Per prima cosa determinare tutti i muri prima raggiungibili con il proiettile (il proiettile non deve rimbalzare contro nessun altro muro per raggiungere ognuna di queste pareti), quindi determinare tutti gli intervalli raggiungibili su ciascuna di queste pareti (a volte è impossibile raggiungere un punto lontano su un muro senza rimbalzo se un altro muro si trova vicino a te), quindi di nuovo determinare tutti i muri raggiungibili con un rimbalzo e tutte le distanze raggiungibili su questi muri. Questi 4 processi possono essere eseguiti in modo simile al ray-tracing. Durante ogni processo, se il carro armato del giocatore viene colpito da un raggio, capire il percorso del proiettile secondo quel raggio.
Secondo me, questo algoritmo è difficile da capire perché:
- un proiettile può essere sparato in qualsiasi direzione; e
- ci sono infiniti punti su ogni muro, come in matematica, dove ci sono infiniti punti su una linea.
Ma la gente Nintendo ce l'ha fatta comunque, quindi ... qualcuno con un'idea?