Riduci il numero di spigoli di un grafico, mantenendolo connesso


10

Sto progettando un gioco con dungeon generati casualmente. Mi piacerebbe vederlo come un grafico connesso e non orientato in cui i nodi sono stanze e i bordi sono porte o corridoi. Quindi scelgo un nodo "laterale" come ingresso del sotterraneo, calcolo la distanza tra questo ingresso e tutti gli altri nodi e decido che uno dei nodi più lontani è "l'obiettivo" del sotterraneo (la posizione del tesoro, boss, principessa, ecc.).

Ho visto 2 modi per generare la topografia del dungeon finale:

  • Generare prima un grafico casuale, quindi provare a riempire il mondo 2d di stanze in posizioni casuali, rispettando le connessioni ai bordi. Ho pensato che questo sarebbe stato a volte difficile perché la generazione della stanza poteva essere "bloccata" cercando di adattare le stanze in posti impossibili.
  • Genera le prime stanze, posizionandole casualmente dove si adattano, quindi mappa il risultato su nodi e bordi. Ho deciso di provare questo.

La mia idea consiste in:

  • Per prima cosa genera una grande stanza che conterrebbe l'intero sotterraneo.
  • Metti un muro all'interno della stanza grande, in una posizione casuale, dividendo la stanza grande in 2 stanze più piccole di area diversa.
  • Quindi continuo a dividere ogni stanza in 2, fino a quando non sono troppo piccole, o il numero totale di stanze raggiunge un massimo (o qualsiasi altra condizione). Ogni nuova stanza è un nodo.
  • Una volta finito, controllo ogni stanza e trovo tutte le altre stanze adiacenti, contrassegnando i 2 nodi come collegati da un bordo.

In questo modo mi assicuro che tutte le stanze abbiano una possibile posizione nel mondo 2D e siano correttamente mappate da un grafico collegato.

Il mio problema è che ci sono troppe porte e corridoi che collegano le stanze.

Quindi vorrei un algoritmo che riduca il numero di spigoli di un grafico non indirizzato connesso , ma mantenendolo connesso (tutti i nodi rimangono raggiungibili) alla fine.


La tua idea è fondamentalmente un albero di ricerca binario, se vuoi saperlo. L'ho usato; crea segrete piuttosto carine ed è facile. :)
L'anatra comunista il

2
A proposito: un grafico completo ha bordi tra tutte le coppie di vertici, quindi (supponendo che non siano consentiti bordi duplicati) non è possibile rimuovere alcun bordo e avere comunque un grafico completo. Il termine giusto è un grafico collegato .
Michael Madsen,

Albero di ricerca binario, grafico collegato, a destra. Sto così male con il nome convenzionale delle cose.
Splo

Risposte:


13

Usa l'algoritmo di Prim per ottenere l'albero di spanning minimo per il tuo grafico (aggiungi pesi casuali o aggiungi i pesi più alti vicino all'ingresso o esegui un algoritmo di tua scelta) e aggiungi nuovamente alcune porte / bordi a caso. In questo modo avrai tutte le stanze collegate e alcuni percorsi extra ridondanti.


1
Oh giusto, l'albero spanning minimo, ovviamente! Buona idea, grazie.
Splo,


0

Alcuni dei generatori di dungeon in questo elenco di Inkwell Ideas sono open source o forniscono documentazione sui loro algoritmi. Google ti darà anche molto da una ricerca di "[programmando il nome in lingua] generatore di sotterranei". Sfortunatamente il mio preferito non è reperibile con nessuno di questi metodi, nonostante sia il più ben documentato che abbia mai incontrato, e non ricordo il suo nome perché l'ho perso di recente a causa di un crash del disco rigido. Aggiornerò questa risposta dopo aver eseguito il ripristino su quell'unità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.