Maze generation v1.2

Share your advanced PureBasic knowledge/code with the community.
User avatar
Joakim Christiansen
Addict
Addict
Posts: 2452
Joined: Wed Dec 22, 2004 4:12 pm
Location: Norway
Contact:

Maze generation v1.2

Post by Joakim Christiansen »

I found this website: http://weblog.jamisbuck.org/2011/2/7/ma ... ithm-recap
I then wanted to build a maze! :D

I decided to try the "Hunt-and-Kill algorithm" and wrote my own version of it.
Feel free to play around with it or implement some other algorithm and then post the new code here!
Note: If you set drawDelay to 0 it will draw it faster!

EDIT:My improved (faster and more random) algorithm is here: http://www.purebasic.fr/english/viewtop ... 82#p346482

Code: Select all

;Maze example by Joakim L. Christiansen
;Feel free to use and abuse!
;
;Extra credits to:
;http://weblog.jamisbuck.org/2011/2/7/maze-generation-algorithm-recap

EnableExplicit

#main=0
#main_image=0

Global wantedWidth=800, wantedHeight=600
Global blockSize=18
Global mazeWidth  = Round(wantedWidth/blockSize,#PB_Round_Up)
Global mazeHeight = Round(wantedHeight/blockSize,#PB_Round_Up)

Global Dim maze(mazeWidth,mazeHeight)
Global image, drawDelay = 10

Procedure.l passageAllowed(fromX,fromY,toX,toY)
  Protected i,u,result
  If toX>0 And toX<mazeWidth And toY>0 And toY<mazeHeight
    result=#True
    If maze(toX,toY)=0
      result = #False
    EndIf
    If maze(toX,toY-1)=0 And toY-1<>fromY
      result = #False
    EndIf
    If maze(toX,toY+1)=0 And toY+1<>fromY
      result = #False
    EndIf
    If maze(toX-1,toY)=0 And toX-1<>fromX
      result = #False
    EndIf
    If maze(toX+1,toY)=0 And toX+1<>fromX
      result = #False
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure
Procedure.l moveRandomDirection(*x.long,*y.long)
  Protected result, NewList possibleDirection()
  ClearList(possibleDirection())
  If passageAllowed(*x\l,*y\l, *x\l,*y\l-1) ;up
    AddElement(possibleDirection()): possibleDirection() = 0
  EndIf
  If passageAllowed(*x\l,*y\l, *x\l,*y\l+1) ;down
    AddElement(possibleDirection()): possibleDirection() = 1
  EndIf
  If passageAllowed(*x\l,*y\l, *x\l-1,*y\l) ;left
    AddElement(possibleDirection()): possibleDirection() = 2
  EndIf
  If passageAllowed(*x\l,*y\l, *x\l+1,*y\l) ;right
    AddElement(possibleDirection()): possibleDirection() = 3
  EndIf
  If ListSize(possibleDirection()) > 0
    SelectElement(possibleDirection(),Random(ListSize(possibleDirection())-1))
    Select possibleDirection()
      Case 0: *y\l-1
      Case 1: *y\l+1
      Case 2: *x\l-1
      Case 3: *x\l+1
    EndSelect
    maze(*x\l,*y\l) = 0
    result = #True
  Else
    result = #False
  EndIf
  ProcedureReturn result
EndProcedure
Procedure drawPassage(x,y)
  Protected round1,round2,round3,round4
  If maze(x,y-1)=1
    If maze(x+1,y)=1  ;top right
      round1=#True
    EndIf
    If maze(x-1,y)=1 ;top left
      round2=#True
    EndIf
  EndIf
  If maze(x,y+1)=1
    If maze(x+1,y)=1 ;bottom right
      round3=#True
    EndIf
    If maze(x-1,y)=1 ;bottom left
      round4=#True
    EndIf
  EndIf 
  RoundBox(x*blockSize,y*blockSize,blockSize,blockSize,7,7,RGB(180,180,180))
  If Not round1
    Box(x*blockSize+blockSize/2,y*blockSize,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
  If Not round2
    Box(x*blockSize,y*blockSize,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
  If Not round3
    Box(x*blockSize+blockSize/2,y*blockSize+blockSize/2,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
  If Not round4
    Box(x*blockSize,y*blockSize+blockSize/2,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
EndProcedure
Procedure drawMaze()
  Protected x,y
  If StartDrawing(ImageOutput(image))
    Box(0,0,mazeWidth*blockSize,mazeHeight*blockSize,#Black)
    For y=0 To mazeHeight
      For x=0 To mazeWidth
        If maze(x,y) = 1
          Box(x*blockSize,y*blockSize,blockSize,blockSize,RGB(0,0,0))
        Else
          drawPassage(x,y)
        EndIf
      Next
    Next
    StopDrawing()
    SetGadgetState(#main_image,ImageID(image))
  EndIf
EndProcedure
Procedure createMaze(d)
  Protected x,y, scanY, scanX, mazeComplete
 
  For x=0 To mazeWidth ;fill with walls
    For y=0 To mazeHeight
      maze(x,y) = 1
    Next
  Next
 
  x = Random(mazeWidth-2)+1
  y = Random(mazeHeight-2)+1
  maze(x,y) = 0 ;place first brick
 
  Repeat
    If moveRandomDirection(@x,@y) = #False
      ;Debug "end reached, finding new position..."
      For scanY=2 To mazeHeight-1
        For scanX=1 To mazeWidth-1
          If maze(scanX,scanY) = 0
            If moveRandomDirection(@scanX,@scanY)
              ;Debug "moved"
              x = scanX
              y = scanY
              Break 2
            EndIf
          EndIf
        Next
        If scanY=mazeHeight-1
          mazeComplete = #True
        EndIf
      Next
    EndIf
    If drawDelay
      drawMaze()
      Delay(drawDelay)
    EndIf
  Until mazeComplete
  ;Debug "Maze building completed!"
  drawMaze()
  Delay(2000)
  CreateThread(@createMaze(),0)
EndProcedure

image = CreateImage(#PB_Any,(mazeWidth+1)*blockSize,(mazeHeight+1)*blockSize,24)

OpenWindow(#main,0,0,(mazeWidth+1)*blockSize,(mazeHeight+1)*blockSize,"JLC's Maze Example v1.2",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(#main_image,0,0,(mazeWidth+1)*blockSize,(mazeHeight+1)*blockSize,ImageID(image))

CreateThread(@createMaze(),0)

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Remember: Sharing is caring! :wink:
Last edited by Joakim Christiansen on Thu Feb 10, 2011 11:52 pm, edited 4 times in total.
I like logic, hence I dislike humans but love computers.
Nituvious
Addict
Addict
Posts: 1027
Joined: Sat Jul 11, 2009 4:57 am
Location: United States

Re: Maze building

Post by Nituvious »

That's really cool, thank's for posting!
▓▓▓▓▓▒▒▒▒▒░░░░░
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Re: Maze building

Post by rsts »

Nice one :D

Thanks for caring.
User avatar
idle
Always Here
Always Here
Posts: 5836
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Maze generation

Post by idle »

interesting thanks
Windows 11, Manjaro, Raspberry Pi OS
Image
epidemicz
User
User
Posts: 86
Joined: Thu Jan 22, 2009 8:05 am
Location: USA
Contact:

Re: Maze generation

Post by epidemicz »

Wow, well done man. Looks like a lot less code than I thought.
Image
User avatar
Rook Zimbabwe
Addict
Addict
Posts: 4322
Joined: Tue Jan 02, 2007 8:16 pm
Location: Cypress TX
Contact:

Re: Maze generation

Post by Rook Zimbabwe »

extremely COOL!!!
Binarily speaking... it takes 10 to Tango!!!

Image
http://www.bluemesapc.com/
User avatar
Joakim Christiansen
Addict
Addict
Posts: 2452
Joined: Wed Dec 22, 2004 4:12 pm
Location: Norway
Contact:

Re: Maze generation

Post by Joakim Christiansen »

epidemicz wrote:Wow, well done man. Looks like a lot less code than I thought.
Added a little more code now (for rounded corners), but yes with PureBasic one can write amazing stuff with little code! :D
Rook Zimbabwe wrote:extremely COOL!!!
Thanks!
And now even cooler with rounded corners! :)

EDIT: I changed the algorithm a little (more random maze and faster generation) and will post this version here.
Note: Change both delays into 0 and turn of the debugger to see how fast the algorithm is. Setting blockSize to 18 speeds it up as well.

Code: Select all

;Maze example by Joakim L. Christiansen
;Feel free to use and abuse!
;
;Extra credits to:
;http://weblog.jamisbuck.org/2011/2/7/maze-generation-algorithm-recap

EnableExplicit

#main=0
#main_image=0

Global wantedWidth=800, wantedHeight=600, blockSize=8
Global drawDelay = 1, showDelay = 2000
Global mazeWidth  = Round(wantedWidth/blockSize,#PB_Round_Up)
Global mazeHeight = Round(wantedHeight/blockSize,#PB_Round_Up)
Global image, Dim maze(mazeWidth,mazeHeight)

Procedure.l passageAllowed(fromX,fromY,toX,toY)
  Protected i,u,result
  If toX>0 And toX<mazeWidth And toY>0 And toY<mazeHeight
    result=#True
    If maze(toX,toY)=0
      result = #False
    EndIf
    If maze(toX,toY-1)=0 And toY-1<>fromY
      result = #False
    EndIf
    If maze(toX,toY+1)=0 And toY+1<>fromY
      result = #False
    EndIf
    If maze(toX-1,toY)=0 And toX-1<>fromX
      result = #False
    EndIf
    If maze(toX+1,toY)=0 And toX+1<>fromX
      result = #False
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure
Procedure.l moveRandomDirection(*x.long,*y.long,checkOnly=#False)
  Protected result, NewList possibleDirection()
  ClearList(possibleDirection())
  If passageAllowed(*x\l,*y\l, *x\l,*y\l-1) ;up
    AddElement(possibleDirection()): possibleDirection() = 0
  EndIf
  If passageAllowed(*x\l,*y\l, *x\l,*y\l+1) ;down
    AddElement(possibleDirection()): possibleDirection() = 1
  EndIf
  If passageAllowed(*x\l,*y\l, *x\l-1,*y\l) ;left
    AddElement(possibleDirection()): possibleDirection() = 2
  EndIf
  If passageAllowed(*x\l,*y\l, *x\l+1,*y\l) ;right
    AddElement(possibleDirection()): possibleDirection() = 3
  EndIf
  If ListSize(possibleDirection()) > 0
    If checkOnly=#False
      SelectElement(possibleDirection(),Random(ListSize(possibleDirection())-1))
      Select possibleDirection()
        Case 0: *y\l-1
        Case 1: *y\l+1
        Case 2: *x\l-1
        Case 3: *x\l+1
      EndSelect
      maze(*x\l,*y\l) = 0
    EndIf
    result = #True
  Else
    result = #False
  EndIf
  ProcedureReturn result
EndProcedure
Procedure drawPassage(x,y)
  Protected round1,round2,round3,round4
  If maze(x,y-1)=1
    If maze(x+1,y)=1  ;top right
      round1=#True
    EndIf
    If maze(x-1,y)=1 ;top left
      round2=#True
    EndIf
  EndIf
  If maze(x,y+1)=1
    If maze(x+1,y)=1 ;bottom right
      round3=#True
    EndIf
    If maze(x-1,y)=1 ;bottom left
      round4=#True
    EndIf
  EndIf
  RoundBox(x*blockSize,y*blockSize,blockSize,blockSize,7,7,RGB(180,180,180))
  If Not round1
    Box(x*blockSize+blockSize/2,y*blockSize,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
  If Not round2
    Box(x*blockSize,y*blockSize,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
  If Not round3
    Box(x*blockSize+blockSize/2,y*blockSize+blockSize/2,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
  If Not round4
    Box(x*blockSize,y*blockSize+blockSize/2,blockSize/2,blockSize/2,RGB(180,180,180))
  EndIf
EndProcedure
Procedure drawMaze()
  Protected x,y
  If StartDrawing(ImageOutput(image))
    Box(0,0,mazeWidth*blockSize,mazeHeight*blockSize,#Black)
    For y=0 To mazeHeight
      For x=0 To mazeWidth
        If maze(x,y) = 1
          Box(x*blockSize,y*blockSize,blockSize,blockSize,RGB(0,0,0))
        Else
          drawPassage(x,y)
        EndIf
      Next
    Next
    StopDrawing()
    SetGadgetState(#main_image,ImageID(image))
  EndIf
EndProcedure
Procedure createMaze(d)
  Protected x,y, scanY, scanX, mazeComplete, didNotMove, noMoreMoves
  Protected xScanDirection, yScanDirection

  For x=0 To mazeWidth ;fill with walls
    For y=0 To mazeHeight
      maze(x,y) = 1
    Next
  Next

  x = Random(mazeWidth-2)+1
  y = Random(mazeHeight-2)+1
  maze(x,y) = 0 ;place first brick

  Repeat
    If moveRandomDirection(@x,@y) = #False
      didNotMove = #True
      yScanDirection = Random(1)
      scanY = 1+Random(mazeHeight-2)
      Repeat
        xScanDirection = Random(1)
        scanX = 1+Random(mazeWidth-2)
        If xScanDirection=0: scanX=1: Else: scanX = mazeWidth-1: EndIf
        Repeat
          If maze(scanX,scanY) = 0
            If moveRandomDirection(@scanX,@scanY)
              x = scanX: y = scanY
              didNotMove = #False
              Break 2
            EndIf
          EndIf
          If xScanDirection = 0
            scanX + 1: If scanX > mazeWidth-1: Break: EndIf
          Else
            scanX - 1: If scanX < 1: Break: EndIf
          EndIf
        ForEver
        If yScanDirection = 0
          scanY + 1: If scanY > mazeHeight-1: Break: EndIf
        Else
          scanY - 1: If scanY < 1: Break: EndIf
        EndIf
      ForEver
      If didNotMove
        noMoreMoves = #True
        For scanY=1 To mazeHeight-1
          For scanX=1 To mazeWidth-1
            If maze(scanX,scanY) = 0
              If moveRandomDirection(@scanX,@scanY,#True)
                noMoreMoves = #False
                Break 2
              EndIf
            EndIf
          Next
        Next
        If noMoreMoves
          mazeComplete = #True
        EndIf
      EndIf
    EndIf
    If drawDelay
      drawMaze()
      Delay(drawDelay)
    EndIf
  Until mazeComplete
  Debug "Maze building completed!"
  drawMaze()
  Delay(showDelay)
  CreateThread(@createMaze(),0)
EndProcedure

image = CreateImage(#PB_Any,(mazeWidth+1)*blockSize,(mazeHeight+1)*blockSize,24)

OpenWindow(#main,0,0,(mazeWidth+1)*blockSize,(mazeHeight+1)*blockSize,"JLC's Maze Example v1.2",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(#main_image,0,0,(mazeWidth+1)*blockSize,(mazeHeight+1)*blockSize,ImageID(image))

CreateThread(@createMaze(),0)

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
I like logic, hence I dislike humans but love computers.
Nituvious
Addict
Addict
Posts: 1027
Joined: Sat Jul 11, 2009 4:57 am
Location: United States

Re: Maze generation v1.2

Post by Nituvious »

This looks like it could be a nightmare to try and solve! :shock:
▓▓▓▓▓▒▒▒▒▒░░░░░
Kelebrindae
Enthusiast
Enthusiast
Posts: 151
Joined: Tue Apr 01, 2008 3:23 pm

Re: Maze generation v1.2

Post by Kelebrindae »

Joakim Christiansen wrote:Feel free to play around with it or implement some other algorithm and then post the new code here!
Ok, so here's mine!
I made it from scratch some 10 years ago or more in another language, so I don't understand anymore how it works... :P
It's quite slow, and the results are not as satisfying as yours, but it (kinda) does the job.

Code: Select all

; Window size
#SCREENWIDTH = 800
#SCREENHEIGHT = 500

#LIMX = 50
#LIMY = 40
#TARGETPERCENTAGE = 0.5
#DRAWMAZE = #True

#UNDIGGABLE = 255
#DIGGABLE = 250
#EMPTY = 0
#START = 1
#GOAL = 2


Global Dim w.i(#LIMX + 1,#LIMY + 1)
Global Dim xd.i(4)
Global Dim yd.i(4)
xd(0) = 0:xd(1) = 1:xd(2) = 0:xd(3) = -1
yd(0) = -1:yd(1) = 0:yd(2) = 1:yd(3) = 0

;- --- Procedures ---
EnableExplicit


Procedure drawMaze()
  Protected x.i,y.i,color.i
  
  StartDrawing(ScreenOutput()) 
  
  For y=0 To #LIMY
    For x=0 To #LIMX
      Select w(x,y)
        Case #UNDIGGABLE
          color = $777777
        Case #DIGGABLE
          color = $DDDDDD
        Case #EMPTY
          color = $000000
        Case #START
          color = $00DDFF
        Case #GOAL
          color = $00FF00
      EndSelect
      
      Box(x*8,y*8,8,8,color)
    Next x
  Next y

  StopDrawing()
 
  FlipBuffers()
  
EndProcedure


Procedure.f dig(x.i,y.i,xd.i,yd.i,count.i,nbEmptySpaces.f)
  
  ; If all conditions are satisfied, dig in the given direction for [count] steps
  While count > 0 And w(x,y) = #DIGGABLE And (Not (w(x + xd,y + yd) = #EMPTY And (w(x + yd,y + xd) = #EMPTY Or w(x - yd,y - xd) = #EMPTY))) And (Not ((w(x + yd,y + xd) = #EMPTY And w(x - xd + yd,y - yd + xd) = #EMPTY) Or (w(x - yd,y - xd) = #EMPTY And w(x - xd - yd,y - yd - xd) = #EMPTY)))
    If w(x,y) > #EMPTY
      w(x,y) = #EMPTY
      nbEmptySpaces + 1
    EndIf
        
    If #DRAWMAZE = #True
      drawMaze()      
    EndIf
       
    x + xd
    y + yd
    count - 1
  Wend

  ProcedureReturn nbEmptySpaces
EndProcedure  
  
Procedure.f changeDirection(x.i,y.i,nbEmptySpaces.f)
  Protected i.i
  
  If w(x,y) = #DIGGABLE 
    If Not ((w(x + 1,y) = #EMPTY And w(x,y + 1) = #EMPTY) Or  (w(x,y + 1) = #EMPTY And w(x - 1,y) = #EMPTY) Or  (w(x - 1,y) = #EMPTY And w(x,y - 1) = #EMPTY) Or  (w(x,y - 1) = #EMPTY And w(x + 1,y) = #EMPTY))
      
      ; For each direction (north, east, south, west):
      For i = 0 To 3
        ; If we can dig in this direction, there's a 30% chance we do it 
        If w(x + xd(i),y + yd(i)) = #DIGGABLE And Random(100) > 30
          ; (but only if some other conditions that I don't understand anymore are satisfied...)
          If ((yd(i) <> 0 And (w(x + 1,y + yd(i)) > #EMPTY Or w(x - 1,y + yd(i)) > #EMPTY)) Or (xd(i) <> 0 And (w(x + xd(i),y - 1) > #EMPTY Or w(x + xd(i),y + 1) > #EMPTY)))
            nbEmptySpaces = dig(x,y,xd(i),yd(i),Random(4) + 2,nbEmptySpaces)
          EndIf
        EndIf
      Next i
      
    EndIf    
  EndIf

  ProcedureReturn nbEmptySpaces
EndProcedure


Procedure createMaze()
  Protected a.i,b.i,value.i
  Protected x.i,y.i,nbEmptySpaces.f
  Protected xtarget.i, ytarget.i
  
  ; Fill the grid
  For b = 0 To #LIMY - 1
    For a = 0 To #LIMX - 1
      If a = 0 Or a = #LIMX - 1 Or b = 0 Or b = #LIMY - 1
        value = #UNDIGGABLE
      Else 
        value = #DIGGABLE
      EndIf
      w(a,b) = value
    Next a
  Next b
  
  ; Dig a space in the middle
  w(Int(#LIMX / 2),Int(#LIMY / 2)) = #EMPTY
  
  ; Dig until a predefined percentage (#TARGETPERCENTAGE) of the gris is empty  
  x = Int(#LIMX / 2) - 1
  y = Int(#LIMY / 2)
  While nbEmptySpaces / (#LIMX * #LIMY) < #TARGETPERCENTAGE
    If w(x + 1,y) = #EMPTY Or w(x,y + 1) = #EMPTY Or w(x - 1,y) = #EMPTY Or w(x,y - 1) = #EMPTY
      nbEmptySpaces = changeDirection (x,y,nbEmptySpaces)
    EndIf
    x = Random(#LIMX - 3) + 1
    y = Random(#LIMY - 3) + 1
  Wend
    
EndProcedure

;********************************************************
;- --- Main program ---
;********************************************************

;- initialization
InitSprite()
InitKeyboard()

;- Window
OpenWindow(0, 0, 0, #SCREENWIDTH, #SCREENHEIGHT, "Maze Digger", #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0), 0, 0, #SCREENWIDTH,#SCREENHEIGHT, 0, 0, 0,#PB_Screen_WaitSynchronization)

createMaze()
;- --- Main Loop ---
Repeat
  While WindowEvent() : Wend
  
  drawMaze()
  FlipBuffers()
  
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
User avatar
Rook Zimbabwe
Addict
Addict
Posts: 4322
Joined: Tue Jan 02, 2007 8:16 pm
Location: Cypress TX
Contact:

Re: Maze generation v1.2

Post by Rook Zimbabwe »

OK so take it to the next level... I will give you floor tiles and wall tiles and you random up a 3D maze with rooms...
Binarily speaking... it takes 10 to Tango!!!

Image
http://www.bluemesapc.com/
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: Maze generation v1.2

Post by netmaestro »

Nice work JC! :wink:
BERESHEIT
User avatar
IceSoft
Addict
Addict
Posts: 1682
Joined: Thu Jun 24, 2004 8:51 am
Location: Germany

Re: Maze generation v1.2

Post by IceSoft »

Rook Zimbabwe wrote:OK so take it to the next level... I will give you floor tiles and wall tiles and you random up a 3D maze with rooms...
You should attached this tiles too ;-)
Belive! C++ version of Puzzle of Mystralia
<Wrapper>4PB, PB<game>, =QONK=, PetriDish, Movie2Image, PictureManager,...
User avatar
Rook Zimbabwe
Addict
Addict
Posts: 4322
Joined: Tue Jan 02, 2007 8:16 pm
Location: Cypress TX
Contact:

Re: Maze generation v1.2

Post by Rook Zimbabwe »

here... multiple formats including B3D and 3DS and MESH
http://www.bluemesapc.com/Downloads/floorandwall.zip

included a couple extra textures for thems that wants to play...

I would suggest picking out the rooms locations FIRST and noting those... draw rooms out from center point...
then
maze path between those points place floor tiles and wall tiles in array
then
draw the room floor
check before wall draw to see if floor tile placed already so no draw DOORway

be interesting to see :mrgreen:
Binarily speaking... it takes 10 to Tango!!!

Image
http://www.bluemesapc.com/
User avatar
Joakim Christiansen
Addict
Addict
Posts: 2452
Joined: Wed Dec 22, 2004 4:12 pm
Location: Norway
Contact:

Re: Maze generation v1.2

Post by Joakim Christiansen »

Hmm, interesting Rook Zimbabwe. Maybe I'll give it a try!
But damn, this from first person perspective will be hard to solve..
I like logic, hence I dislike humans but love computers.
User avatar
Rook Zimbabwe
Addict
Addict
Posts: 4322
Joined: Tue Jan 02, 2007 8:16 pm
Location: Cypress TX
Contact:

Re: Maze generation v1.2

Post by Rook Zimbabwe »

It is ALL about he spacing JC!!! :D
Binarily speaking... it takes 10 to Tango!!!

Image
http://www.bluemesapc.com/
Post Reply