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

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?


Tja...bare en måde man kan komme tilbage til den celle, man var ved sidst...og før den, og før den, osv.

Man kan bruge en stl vector og så bare smide celle informationer i. Hvis du laver meget store labyrinter skal du bare være opmærksom på at denne vector potentielt bliver meget stor.
Du kan løse problemet (delvist) ved kun at gemme "retningen" man skal gå i for at komme tilbage til celle. Altså hvis du gik mod vest for at komme til den nuværende celle, kan du gemme informationer om at du skal gå mod øst for at komme tilbage. 6 retninger (3D) kan gemmes i 3 bits, og så kan du igen gemme dette i arrays, og holde styr på, hvor mange retninger arrayet indeholder:

Fold kodeboks ind/udKode 


Ovenstående ville jeg selvfølgelig gøre anderledes så arrayet kan udviddes dynamisk...nok med en vector men you get the point.
Du kunne evt. bruge ovenstående kode og så når pushDirections bliver kaldt og numDirections er 8 så smide directions arrayet bagest i vectoren og nulstille directions arrayet og numDirections.
Og hvis popDirection() bliver kaldt når numDirections er 0 så hente det bageste array fra vectoren ud i directions arrayet og sætte numDirections til 8. Det burde kunne gøre det.




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?


Tja...bare en måde man kan komme tilbage til den celle, man var ved sidst...og før den, og før den, osv.

Man kan bruge en stl vector og så bare smide celle informationer i. Hvis du laver meget store labyrinter skal du bare være opmærksom på at denne vector potentielt bliver meget stor.
Du kan løse problemet (delvist) ved kun at gemme "retningen" man skal gå i for at komme tilbage til celle. Altså hvis du gik mod vest for at komme til den nuværende celle, kan du gemme informationer om at du skal gå mod øst for at komme tilbage. 6 retninger (3D) kan gemmes i 3 bits, og så kan du igen gemme dette i arrays, og holde styr på, hvor mange retninger arrayet indeholder:

Fold kodeboks ind/udKode 


Ovenstående ville jeg selvfølgelig gøre anderledes så arrayet kan udviddes dynamisk...nok med en vector men you get the point.
Du kunne evt. bruge ovenstående kode og så når pushDirections bliver kaldt og numDirections er 8 så smide directions arrayet bagest i vectoren og nulstille directions arrayet og numDirections.
Og hvis popDirection() bliver kaldt når numDirections er 0 så hente det bageste array fra vectoren ud i directions arrayet og sætte numDirections til 8. Det burde kunne gøre det.


Det virker lige lovlig frvirende til mit intelekt ;-) hvad er fx. union?

Well, never min, jeg skal nok finde ud af det, det er jo sådan man lærer.

Jeg havde dog forestillet mig en deque, er ikke helt sikker på hvordan den i givet fald skal bygges op, men det kunne se således ud:
Fold kodeboks ind/udKode 

Det kan sikkert gøres smartere, men pricipet er vist forståeligt nok.

Dette betyder på ingen måde at jeg ikke er taknemmelig og/eller intereseret i det stykke kode du er kommet med, jeg giver bare min N00b menning til kende ,-)




Dette betyder på ingen måde at jeg ikke er taknemmelig og/eller intereseret i det stykke kode du er kommet med, jeg giver bare min N00b menning til kende ,-)


hehe...jep. Listen and learn :-)
Din _stack struct fylder 18 bytes (20 faktisk da det som regel skal være deleligt med fire) fordi du gemmer alle informationer om cellerne. Jeg gemte informationer om 8 celler i 3 bytes (igen vil det fylde 4 bytes men pakket rigtigt så sætter man bare flere arrays sammen så det passer), eller 3 bits pr. "nødvendig information". Noget af en forskel, men hvis du laver relativt små labyrinter gør det ikke det helt store.
Du nævnte 256^3 celler. Det er potentielt ca. 335 MB. Altså en hel del. Med min metode bruger du kun 6 MB.

En union er en datatype som giver dig flere "indgange" til de samme data.
Dette:
Fold kodeboks ind/udKode 


Er ca. det samme som dette:
Fold kodeboks ind/udKode 


Men i den anden version oprettes to variable (et array og en pointer), og så er den første lidt pænere (synes jeg).
Du vil altså med det første eksempel kunne læse et hukommelses område som et array på 4 bytes eller som en integer.
Union bliver desværre ikke brugt så meget, men kig lidt mere på dem. De er virkelig rare at kende :-)




Dette betyder på ingen måde at jeg ikke er taknemmelig og/eller intereseret i det stykke kode du er kommet med, jeg giver bare min N00b menning til kende ,-)


hehe...jep. Listen and learn :-)
Din _stack struct fylder 18 bytes (20 faktisk da det som regel skal være deleligt med fire) fordi du gemmer alle informationer om cellerne. Jeg gemte informationer om 8 celler i 3 bytes (igen vil det fylde 4 bytes men pakket rigtigt så sætter man bare flere arrays sammen så det passer), eller 3 bits pr. "nødvendig information". Noget af en forskel, men hvis du laver relativt små labyrinter gør det ikke det helt store.
Du nævnte 256^3 celler. Det er potentielt ca. 335 MB. Altså en hel del. Med min metode bruger du kun 6 MB.

En union er en datatype som giver dig flere "indgange" til de samme data.
Dette:
Fold kodeboks ind/udKode 


Er ca. det samme som dette:
Fold kodeboks ind/udKode 


Men i den anden version oprettes to variable (et array og en pointer), og så er den første lidt pænere (synes jeg).
Du vil altså med det første eksempel kunne læse et hukommelses område som et array på 4 bytes eller som en integer.
Union bliver desværre ikke brugt så meget, men kig lidt mere på dem. De er virkelig rare at kende :-)


Du må meget undskylde.
Det do laver her minder meget om C, og for at være helt ærlig, så fatter jeg ikke det store af det, er det muligt fx at bruge cout istedet for printf?



Her er så det foreløbige udkast til omtalte funktion, det er endnu ikke færdigt og er en mærkelig blandning af pseudo kode, c++, og andet geil, men skulle være nogenlunde forståeligt, dog er strukturen sådan at deet ikke er muligt at have en størelse størrer end 256^3.

Fold kodeboks ind/udKode 




Nu er jeg nået til et punkt hvor jeg har et udkast der rent faktisk kan kompileres, delen der skulle sørge for at opbygge labyrinten fungerer dog ikke. Jeg har ingen idé om hvorfor.

Jeg poster alt det kode jeg har da tingene jo har ændret sig en del siden første udkast ;-)

Fold kodeboks ind/udKode 




Har lavet nogle ændringer, men har stadig ikke fundet fejlen...

Fold kodeboks ind/udKode 


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



Ny kode der rent faktisk virker, den kunne nu godt bruge lidt optimering, så tag et kig hvis du lyster. ;-)

Fold kodeboks ind/udKode 




Ja den gav point, hvadenten det betyder noget eller ej ;-)

Jeg vil tage en kigger og vende tilbage med evt. problemmer.



Ja den gav point, hvadenten det betyder noget eller ej ;-)

Jeg vil tage en kigger og vende tilbage med evt. problemmer.


eks. 2 og 3 virker ganske enkelt ikke (har ikke prøvet 3eren) de fungerer ikke på samme måde som eks 1., har prøve eks 2 og det fun gerer ikke.
Jeg synes at eks 3 virker utrolig interesant, men jeg forstår det altså ikke.

Her er den opdaterede kode:
Fold kodeboks ind/udKode 


Takker endnu engang.



t