Sto realizzando un gioco con un mondo generato proceduralmente creato all'inizio del gioco, costituito da diverse aree rappresentate da griglie (diciamo, 8x8, 9x6, le dimensioni sarebbero idealmente arbitrarie). Queste aree dovrebbero essere collegate tra loro attraverso un elenco di dipendenze.
Esiste una connessione quando almeno 3 spazi di quella griglia sono esposti tra queste due aree. Nella cella centrale di quella 3 area di connessione spaziale si trova la porta tra le aree:
Ho cercato di trovare un modo per collegarli, ma diventa sempre più complesso quanto più aree devi considerare allo stesso tempo.
Ho provato alcuni prototipi di carta e sebbene sia un processo molto semplice quando lo faccio visivamente, non ho scoperto una buona serie di espressioni matematiche che mi permettono di posizionare le stanze con la stessa efficienza con il codice.
Ecco un esempio "semplice" con cui sto lottando in questo momento:
- L'area "a" deve essere collegata a "b" e "c"
- L'area "b" deve essere collegata a "a" e "d"
- L'area 'c' deve essere collegata a 'a' e 'd'
- L'area 'd' deve essere collegata a 'b' e 'c'
Considera, per semplicità, stiamo posizionando le stanze in base al loro ordine di apparizione nell'elenco (ne ho provate altre). Quindi mi sto avvicinando a questo come al tuo algoritmo procedurale standard di generazione sotterranea.
Posizioniamo "a" in qualsiasi punto del tabellone, poiché è la prima area. Quindi, scegliamo un muro a caso e, dal momento che nulla è collegato a quel muro, possiamo posizionare 'b' lì:
Ora dobbiamo posizionare 'c', ma 'a' è già sul tabellone e ha un muro occupato, quindi decidiamo di metterlo su un altro muro. Ma non tutti i posizionamenti lo faranno, perché 'd' sta arrivando e deve essere collegato anche a 'b' e 'c':
Ho provato una possibile limitazione che 2 stanze che hanno lo stesso insieme di dipendenze non possono trovarsi su pareti opposte, ma anche ciò non garantisce il successo:
E in altri casi, dove le aree hanno dimensioni diverse, trovarsi su pareti opposte può funzionare:
Inoltre, non considerare un muro usato è un presupposto imperfetto poiché esclude soluzioni valide:
Ho provato a cercare ricerche su altri algoritmi di generazione procedurale o simili, come gli algoritmi Optimal Rectangle Packing e Graph Layout, ma di solito quegli algoritmi non tengono conto di tutti i vincoli di questo problema e sono difficili da mescolare insieme.
Ho pensato a una serie di approcci, incluso il posizionamento di un'area e il backtrack fino a quando non viene trovato un posizionamento adatto, ma sembrano molto dipendenti da tentativi ed errori e costosi in termini di calcolo. Ma, data la vasta ricerca sugli ultimi due problemi che ho citato, potrebbe essere l'unica / migliore soluzione?
Volevo solo vedere se qualcuno ha avuto problemi simili in passato o è disposto ad aiutarmi a capirlo e darmi alcuni suggerimenti su dove dovrei iniziare con l'algoritmo. Oppure, in mancanza, dovrò cercare di allentare i vincoli che ho fissato.