3d labyrint

Tags:    c++

Her er et lille stykke kode jeg har skrevet, det er naturligvis lang fra færdigt, men jeg har et par spørgsmål til hvordan det kan gøres, har nogle problemer der mangler løsninger osv.

Fold kodeboks ind/udKode 

1)
Jeg har lavet en struct 'cell' med 4 boole variabler der hver fylder én bit, altså 4 bit total pr celle, nu forholder det sig sådan at selvom jeg reelt kun har brug for en halv byte pr celle, bruger den 1 byte. Om den bruger 8 eller 16 MB for en sådan 256^3 struktur, gør ikke den helt store forskel, men jeg kunne godt tænkte mig at få løst problemet alligevel hvis det kan lade sig gøre.

2)
I 'new_grid()' tildeler den værdier (0 eller 1) til til alle xy/xz/yz variablerne i cellerne. disse xy/xz/yz skal forstås som vægge i en 3d_labyrint; hvis værdien er 0 er der ingen væg og er den 1 er der en væg.
Det første problem er naturligvis at jeg har brug for en 'ikke pseudo' rand_bit(), men der er et lille problem, her på test stadiet fungerer denne fint nok.
Nu kommr den lumske del
Hver celle har 6 vægge. 3 af disse vægge er defineret i cellen, og de resterende vægge er defineret af de omkring liggende celler.
dvs.
celle xyz har væggene:
GRID[x][y][z].xy
GRID[x][y][z].xz
GRID[x][y][z].yz
GRID[x][y][z-1].xy
GRID[x][y-1][z].xz
GRID[x-1][y][z].yz

strukturen er uendelig/endelig hvilket vil sige hvis man skulle være så uheldig at befinde sig i 257,257,257, befinder man sig i hvirkeligheden i 1,1,1.
det er lidt kringle, men det virker.

Problemet består i at disse celler skal opfylde nogle krav:
De må ikke være lukkede, dvs. der skal være mindst én manglende væg pr celle.
Det skal være muligt at bevæge sig fra en given celle til en anden, uanset placering.

Dette er noget jeg grubler over.

3)
Jeg ønsker at høre en masse gpde idéer til forbedringer o.lign.
Jeg ønsker at høre om fejl og mangler.
Jeg ønsker en interessant diskution om hvorledes man kan/bør løse dette problem, det stykke kode jeg har postet er kun et oplæg, det kan meget vel gøres smartere.

4)
Jeg kan forestille mig at der måske er nogle der grubler over hvad meningen med galskaben er og det er jo naturligvis meningen at der skal skrives et grafisk interface med tiden og derefter kan jeg se adskillige muligheder for hvad det kan bruges til.

5)
I skal vide at jeg er nubegynder og faktisk ikke har været i gang i meget over en uge, jeg har dog lavet en del php scripts osv. men altså stadig en c++ n00b ;-)
Jeg er klar over at meget af dette ville tage sig rigtig godt ud i classes, men jeg har aldrig brug dem før og selv om jeg er igang med at læse på sagen, bliver jeg blot mere og mere forviret...

[Redigeret d. 08/02-06 17:12:02 af Felix Nielsen]



41 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Jeg er lidt på den her.
Efter at have indkoorporeret det nye system, virker den del af funktionen der skal sørge for at der ikke er nogen lukkede rum, ikke mere.
Jeg har prøvet forskellige ting for at finde fejlen, men det her går over min forstand.

Denne del virker:
Fold kodeboks ind/udKode 

Denne del virker ikke:
Fold kodeboks ind/udKode 

Denne del virker måske/måske ikke, men den stopper ihvertfald ikke programmet:
Fold kodeboks ind/udKode 


Jeg håber virkelig at der er en der kan hjælpe...



Jeg har ikke kikket hele koden igennem, men et par kommentarer.

write funktionen kan så vidt jeg kan se kun sætte bits ikke resette, er det med vilje?
I stedet for at bruge pow var det nok mere optimalt at bruge <<

read funktionen kan returnere 8 eller 128, det er måske ikke nogen god idé, da den står til at returnere en bool?



Jeg har ikke kikket hele koden igennem, men et par kommentarer.

write funktionen kan så vidt jeg kan se kun sætte bits ikke resette, er det med vilje?
I stedet for at bruge pow var det nok mere optimalt at bruge <<

read funktionen kan returnere 8 eller 128, det er måske ikke nogen god idé, da den står til at returnere en bool?


Write() burde fungerer efter hensigten. Kan ikke lige huske hvordan det fungerer med b?mask:0, men har fungeret før.

Boolen i read er lavet helt efter hensigten da den returnerer 0 hvis der ingen værdi er og ellers 1, jeg skal jo bare vide om bit'en er aktiv eller ej.



1: Det er ikke muligt.


Well...og så igen.
Lav et langt char array og fortolk det som et array af 4 bit størrelser:

Fold kodeboks ind/udKode 




Mht. generering af labyrinten så har jeg lavet labyrinter i 1000000 x 1000000 celle størrelsen med minimum spanning tree algoritmer.
Start med et grid hvor alle celler har alle vægge og start i en tilfældig celle. Hvis der er en ubesøgt nabo (celle med alle vægge intakte) så bryd væggen ned mellem den nuværende celle og naboen. Læg derefter den nuværende celle på stakken og flyt til naboen.
Hvis den nuværende celle ikke har ubesøgte naboer så gå tilbage til forrige celle (pop fra stakken).
Sådan fortsættes til alle celler har været besøgt.



Mht. generering af labyrinten så har jeg lavet labyrinter i 1000000 x 1000000 celle størrelsen med minimum spanning tree algoritmer.
Start med et grid hvor alle celler har alle vægge og start i en tilfældig celle. Hvis der er en ubesøgt nabo (celle med alle vægge intakte) så bryd væggen ned mellem den nuværende celle og naboen. Læg derefter den nuværende celle på stakken og flyt til naboen.
Hvis den nuværende celle ikke har ubesøgte naboer så gå tilbage til forrige celle (pop fra stakken).
Sådan fortsættes til alle celler har været besøgt.


Det lyder slet ikke som nogen dum idé og hvis oven i købet randomizer rækkefølgen hvori man ønsker at undersøge de omkringliggende celler, kan man også undgå at der bliver et fast system i gridet.

Du taler om "stakken" jeg kan sagtens finde på en måde hvorpå tingende vil fungere, men jeg kunne godt tænke mig at vide om du mener noget bestemt med udtrykket?



Så har jeg løst problemet med write funktionen, men jeg mener stadig at det kan gøres nemmere.

Fold kodeboks ind/udKode 




Dette bør virke:

Fold kodeboks ind/udKode 




Dette bør virke:

Fold kodeboks ind/udKode 

Ja det er da noget mere simpelt, vil straks prøve om det virker... takker.



Dette bør virke:

Ja det er da noget mere simpelt, vil straks prøve om det virker... takker.

Jo tak, det virker fint ;-)
således ser read og write ud nu:
write():
Fold kodeboks ind/udKode 

read():
Fold kodeboks ind/udKode 

Det er noget kortere og simplere. ;-)


Tilbage er nu at lave en funktion der bruger Robert Larsens idé til at klargøre Gridet.
Lave en funktion der undervejs kan ændre på tilfældige celler uden at det ødelægger strukturen.
Lave en pathfinder til at teste om det virker efter hensigten.
putte det hele i classes, headers og alt det jeg ikke har forstand på.
lave et grafisk interface.
Få en eller flere virtuelle laboratorie mus til at rende rundt i labyrinten.
Kunstig inteligens O_o
Multiplayer spil ala pacman ;-)
Jeg har mange idéer ;-)

Nuvel, tak for alt hjælpen.
Jeg vil naturligvis forsætte med at følge denne tråd, men jeg tror at jeg har styr på det værste nu. Der dukker jo nok flere ting op undervejs, så jeg vender jo nok tilbage med flere spørgsmål, det er dog ikke usandsynligt at jeg opretter en ny.

Jeg vil som sagt fortsat følge denne tråd, så hvis der er nogen der har idéer, gode råd, spørgsmål eller bare vil have en sluder for en slader skal de være velkomne. ;-)

Der er o også lige 100 point der skal deles ud, noget siger mig at der ikke er så meget rift om dem, men hvis nogen skulle være intereseret går pointene nu til bedste idé/forslag/kode bidrag (fx. pathfinder el.lign)

Tak for idag.



t