Hex_Maze - James D Jarvis - 03-14-2023
This is Hex_Maze version 0B. It generates a crude labyrinth using hexes as cells as opposed to a standard orthogonal square grid.
There are a couple subs in it that don't get used in this run but would prove useful in using the hex-grid in a program.
Code: (Select All) 'hex_maze
'by James D. Jarvis Mar. 14,2023
' geneate a haex "maze" in a hex grid as opposed to a more standard orthogonal square grid
'generates a new hexmaze on a keypress press q to exit
Screen _NewImage(1100, 600, 32)
_FullScreen _SquarePixels , _Smooth
Randomize Timer
Dim Shared hexradius
Dim Shared hexborder As _Unsigned Long
hexborder = _RGB32(100, 100, 100)
hexradius = 8 'can be any value but draws cleaner if radius is evenly divisible by 4
maxx = 80: maxy = 40 'maxx is the maxximum number of columns and maxy is the maximum height of a column
Dim Shared map(maxx, maxy)
Dim Shared hgrid(0 To maxx + 1, 0 To maxy + 1, 6)
Do
Cls
For y = 1 To maxy
For x = 1 To maxx
map(x, y) = 1
Next x
Next y
sx = Int(maxx / 5 + Rnd * maxx / 2)
sy = Int(maxy / 5 + Rnd * maxy / 2)
'map(sx, sy) = 0
lastgo = Int(1 + Rnd * 6)
c = 0
clim = 600 + Int((1 + Rnd * 4) * (Rnd * (maxx + maxy))) 'determine how many hex cells will be dug for this hex maze haven't found an ideal ratio yet
hrun = 7
lasthrun = Int(1 + Rnd * 3)
Do
'generate hex maze with a drunken wanderer method. Not a true maze but it will work for a shoot-n-scoot or a roguelike
dgo = Int(1 + Rnd * 8) 'generate direction to send the tunnel
hrun = Int(1 + Rnd * (2 + Sqr(maxy))) 'generate a length for the tunnel being dug
If hrun > Sqr(maxy) Then hrun = lasthrun
If sx = 2 And dgo = 5 Then dgo = 3
If sx = 2 And dgo = 6 Then dgo = 2
If dgo > 6 Then dgo = lastgo
For hgo = 1 To hrun
Select Case dgo
Case 1
If sy - 1 > 1 Then
sy = sy - 1
End If
Case 2
If sx + 1 < maxx Then
If sx Mod 2 Then
If sy - 1 > 1 Then
sx = sx + 1
sy = sy - 1
End If
Else
sx = sx + 1
End If
End If
Case 3
If sx + 1 < maxx Then
If sx Mod 2 Then
sx = sx + 1
Else
If sy + 1 < (maxy - 1) Then
sx = sx + 1
sy = sy + 1
End If
End If
End If
Case 4
If sy + 1 < maxy Then
sy = sy + 1
End If
Case 5
If sx - 1 > 1 Then
If sx Mod 2 Then
If sy - 1 > 1 Then
sx = sx - 1
sy = sy - 1
End If
Else
sx = sx - 1
End If
End If
Case 6
If sx - 1 > 1 Then
If sx Mod 2 Then
sx = sx - 1
Else
If sy + 1 < (maxy - 1) Then
sx = sx - 1
sy = sy + 1
End If
End If
End If
End Select
If map(sx, sy) = 1 Then 'only dig out and count the hex-cell if it is filled
map(sx, sy) = 0
c = c + 1
End If
lastgo = dgo
lasthrun = hrun
Next hgo
Loop Until c >= clim
'draw the hex grid
For y = 1 To maxy
For x = 1 To maxx
If map(x, y) = 1 Then
hexat x, y
hexpaint x, y, _RGB32(200, 200, 200)
End If
Next x
Next y
_Display
Do
_KeyClear
_Limit 60
kk$ = InKey$
Loop Until kk$ <> ""
Loop Until kk$ = "q"
Sub hexpaint (x, y, hklr As _Unsigned Long)
'paint an arbitrary hex
'hexradius and hexborder defined as shared variables in main program
hr = hexradius
If x Mod 2 Then
Paint ((x * 2) * hr * .75, y * (hr * 1.75)), hklr, hexborder
Else
Paint ((x * 2) * hr * .75, y * (hr * 1.75) + (hr * .875)), hklr, hexborder
End If
End Sub
Sub hexput (sp&, x, y, sscale, hf)
'drop a sprite/image inside a hex , hf is hexfacing given in degrees
'sp& would be an image handle to a sprite created elsewere in program
hr = hexradius
If x Mod 2 Then
RotoZoom23d (x * 2) * hr * .75, y * (hr * 1.75), sp&, sscale, sscale, hf
Else
RotoZoom23d (x * 2) * hr * .75, y * (hr * 1.75) + (hr * .875), sp&, sscale, sscale, hf
End If
End Sub
Sub hexat (xx, yy)
'draw an arbitrary hex, hexradius and hexborder are shared variables created in main porgram
hr = hexradius
y = yy
x = xx
If x Mod 2 Then
rotpoly (x * 2) * hr * .75, y * (hr * 1.75), hr, 60, 30, hexborder
Else
rotpoly (x * 2) * hr * .75, y * (hr * 1.75) + (hr * .875), hr, 60, 30, hexborder
End If
End Sub
Sub hexgrid (xx, yy)
'draw a whole empty hexgrid
hr = hexradius
For y = 1 To yy
For x = 1 To xx
If x Mod 2 Then
rotpoly (x * 2) * hr * .75, y * (hr * 1.75), hr, 60, 30, hexborder
Else
rotpoly (x * 2) * hr * .75, y * (hr * 1.75) + (hr * .875), hr, 60, 30, hexborder
End If
Next x
Next y
End Sub
Sub rotpoly (cx, cy, rr, shapedeg, turn, klr As _Unsigned Long)
'draw an equilateral polygon (if shapedeg divides evenly into 360) centered on cx and cy
x = rr * Sin(0.01745329 * turn)
y = rr * Cos(0.01745329 * turn)
Line (cx + x, cy + y)-(cx + x, cy + y), klr
For deg = turn To turn + 360 Step shapedeg
x2 = rr * Sin(0.01745329 * deg)
y2 = rr * Cos(0.01745329 * deg)
Line -(cx + x2, cy + y2), klr
Next
End Sub
'used in hexput to drop a sprite in a hex
Sub RotoZoom23d (centerX As Long, centerY As Long, Image As Long, xScale As Single, yScale As Single, Rotation As Single)
Dim px(3) As Single: Dim py(3) As Single
Wi& = _Width(Image&): Hi& = _Height(Image&)
W& = Wi& / 2 * xScale
H& = Hi& / 2 * yScale
px(0) = -W&: py(0) = -H&: px(1) = -W&: py(1) = H&
px(2) = W&: py(2) = H&: px(3) = W&: py(3) = -H&
sinr! = Sin(-0.01745329 * Rotation): cosr! = Cos(-0.01745329 * Rotation)
For i& = 0 To 3
x2& = (px(i&) * cosr! + sinr! * py(i&)) + centerX: y2& = (py(i&) * cosr! - px(i&) * sinr!) + centerY
px(i&) = x2&: py(i&) = y2&
Next
_MapTriangle (0, 0)-(0, Hi& - 1)-(Wi& - 1, Hi& - 1), Image& To(px(0), py(0))-(px(1), py(1))-(px(2), py(2))
_MapTriangle (0, 0)-(Wi& - 1, 0)-(Wi& - 1, Hi& - 1), Image& To(px(0), py(0))-(px(3), py(3))-(px(2), py(2))
End Sub
RE: Hex_Maze - bplus - 03-14-2023
Nice start.
First question that comes to mind is how to navigate in such a maze. Up and down arrows OK but left and right, upper and lower? hmm...
Also I wonder if possible to generate a maze that passes through every room like orthogonal maze generators do.
RE: Hex_Maze - mnrvovrfc - 03-14-2023
(03-14-2023, 02:54 PM)bplus Wrote: First question that comes to mind is how to navigate in such a maze. Up and down arrows OK but left and right, upper and lower? hmm...
Use the number pad if your computer supports it.
Otherwise, recall "7" "8" "9" the regular keys match the ones on the number pad my computer doesn't have, then "U" "I" "O" just below them ("I" would be a dead key then) and finally "J" "K" "L" the bottom row. Or for two-player game that could be for the second player while the keys that begin with "1" "Q" "A" would be for player one.
This is a good beginning to a simple shooter game like a certain shareware one, many many years ago done I think in Turbo Pascal with "SCREEN 0". I liked that one a lot although I didn't spend a lot of time on it and I got stuck cooked in the "lava" LOL.
RE: Hex_Maze - johannhowitzer - 03-15-2023
WASD just becomes QWEASD.
RE: Hex_Maze - bplus - 03-15-2023
(03-15-2023, 01:25 AM)johannhowitzer Wrote: WASD just becomes QWEASD.
Yeah I can see that!
RE: Hex_Maze - SMcNeill - 03-15-2023
When dealing with hex maps, I always just use an arrow to indicate a character direction, and then left/right arrows change heading by 60 degrees for that arrow and up moves forward, down moves backwards in that direction.
Say arrow is pointing North... press up, move one hex north. press down, move one hext south. Press right, arrow now faces north-east diagional. (Assuming the hex grid looks somewhat similar to the below.)
_
/ \
\_/
RE: Hex_Maze - SMcNeill - 03-15-2023
Code: (Select All) Type MapInfo
Wall As _Unsigned _Byte
Distance As _Byte
End Type
Const min = 1, max = 20
Const TopLeftX = 50, TopLeftY = 50 'just where I want to put my top left corner of my map on the screen
Const HexSize = 16 'Size of Hex
Const NE = 1, East = 2, SE = 4, SW = 8, West = 16, NW = 32
Dim Shared HeroPointer, HeroHeading, Difficulty
Dim Shared map(min - 1 To max + 1, min - 1 To max + 1) As MapInfo
Difficulty = 140
Screen _NewImage(800, 600, 32)
Color -1
Randomize Timer
HeroX = 1: HeroY = 1: HeroHeading = SE: direction = 2
HeroPointer = TextToImage("", 16, &HFFFF0000, 0, 0)
CreateMap
TargetX = Int(Rnd * max) + min: TargetY = Int(Rnd * max) + min
Do
_Limit 30
Cls , 0
_DontBlend: DrawMap
_Blend: DrawHero HeroX, HeroY
k = _KeyHit
Select Case k
Case 19200 'left arrow
direction = direction - 1: If direction < 0 Then direction = 5
HeroHeading = 2 ^ direction
Case 20480 'down arrow
Select Case HeroHeading
Case NE: HeroX = HeroX - .5: HeroY = HeroY + 1
Case East: HeroX = HeroX - 1
Case SE: HeroX = HeroX - .5: HeroY = HeroY - 1
Case SW: HeroX = HeroX + .5: HeroY = HeroY - 1
Case West: HeroX = HeroX + 1
Case NW: HeroX = HeroX + .5: HeroY = HeroY + 1
End Select
Case 19712 'right arrow
direction = direction + 1: If direction > 5 Then direction = 0
HeroHeading = 2 ^ direction
Case 18432 'up arrow
Select Case HeroHeading
Case NE: If (map(_Ceil(HeroX), HeroY).Wall And 1) = 0 Then HeroX = HeroX + .5: HeroY = HeroY - 1
Case East: If (map(_Ceil(HeroX), HeroY).Wall And 2) = 0 Then HeroX = HeroX + 1
Case SE: If (map(_Ceil(HeroX), HeroY).Wall And 4) = 0 Then HeroX = HeroX + .5: HeroY = HeroY + 1
Case SW: If (map(_Ceil(HeroX), HeroY).Wall And 8) = 0 Then HeroX = HeroX - .5: HeroY = HeroY + 1
Case West: If (map(_Ceil(HeroX), HeroY).Wall And 16) = 0 Then HeroX = HeroX - 1
Case NW: If (map(_Ceil(HeroX), HeroY).Wall And 32) = 0 Then HeroX = HeroX - .5: HeroY = HeroY - 1
End Select
Case Asc("r"), Asc("R")
TargetX = Int(Rnd * max) + min: TargetY = Int(Rnd * max) + min
End Select
_PrintString (680, 100), "AV: " + Str$(HeroX) + "," + Str$(HeroY)
_PrintString (680, 130), "TV: " + Str$(_Ceil(HeroX)) + "," + Str$(HeroY)
_PrintString (680, 160), "WL: " + Str$(map(_Ceil(HeroX), HeroY).Wall)
DrawHex TargetX, TargetY, &HFFFF00FF
If _Ceil(HeroX) = TargetX And HeroY = TargetY Then
CreateMap
Difficulty = Difficulty + 5
TargetX = Int(Rnd * max) + min: TargetY = Int(Rnd * max) + min
End If
_Display
Loop Until k = 27
System
Sub CreateMap
For x = min - 1 To max + 1 'Reset the map to just borders
For y = min - 1 To max + 1
map(x, y).Distance = -1: map(x, y).Wall = 0
Next y, x
For x = min - 1 To max + 1 'borders are non-moveable
map(x, min - 1).Wall = -1
map(x, max + 1).Wall = -1
map(min - 1, x).Wall = -1
map(max + 1, x).Wall = -1
Next
D = 256 - Difficulty: If D < 63 Then D = 63
For x = min To max
For y = min To max
r = Int(Rnd * D)
If r > 63 Then r = 0
If r > 0 Then map(x, y).Wall = map(x, y).Wall Or r
Next
Next
For x = min - 1 To max + 1
For y = min - 1 To max + 1
If y Mod 2 = 0 Then xmod = 0 Else xmod = 1
If map(x, y).Wall And NE And x <= max And y >= min Then map(x + xmod, y - 1).Wall = map(x + xmod, y - 1).Wall Or SW
If map(x, y).Wall And East And x <= max Then map(x + 1, y).Wall = map(x + 1, y).Wall Or West
If map(x, y).Wall And SE And y <= max And x <= max Then map(x + xmod, y + 1).Wall = map(x + xmod, y + 1).Wall Or NW
If xmod = 0 Then xmod = 1 Else xmod = 0
If map(x, y).Wall And SW And x >= min And y <= max Then map(x - xmod, y + 1).Wall = map(x - xmod, y + 1).Wall Or NE
If map(x, y).Wall And West And x >= min Then map(x - 1, y).Wall = map(x - 1, y).Wall Or East
If map(x, y).Wall And NW And x >= min And y >= min Then map(x - xmod, y - 1).Wall = map(x - xmod, y - 1).Wall Or SE
Next
Next
End Sub
Sub DrawHero (TempX, Y)
X = _Ceil(TempX)
HexWidth = Sqr(3) * HexSize: HexHeight = 2 * HexSize 'Height and Width of each individual hex
CenterX = TopLeftX + X * HexWidth
CenterY = TopLeftY + Y * HexHeight * 0.75
If Y Mod 2 Then CenterX = CenterX + HexWidth / 2 'offset for odd/even rows
Select Case HeroHeading
Case NE: Angle = -30
Case East: Angle = -90
Case SE: Angle = -150
Case SW: Angle = 150
Case West: Angle = 90
Case NW: Angle = 30
End Select
DisplayImage HeroPointer, CenterX, CenterY, Angle, 0
End Sub
Sub DrawHex (X, Y, C As _Unsigned Long)
HexWidth = Sqr(3) * HexSize: HexHeight = 2 * HexSize 'Height and Width of each individual hex
CenterX = TopLeftX + X * HexWidth
CenterY = TopLeftY + Y * HexHeight * 0.75
If Y Mod 2 Then CenterX = CenterX + HexWidth / 2 'offset for odd/even rows
Color C
Point1X = CenterX - HexWidth / 2
Point2X = CenterX
Point3x = CenterX + HexWidth / 2
Point1y = CenterY - HexHeight / 2
Point2y = CenterY - HexHeight / 4
Point3y = CenterY + HexHeight / 4
Point4y = CenterY + HexHeight / 2
Line (Point1X, Point2y)-(Point2X, Point1y) 'NorthWest
Line (Point2X, Point1y)-(Point3x, Point2y) 'NorthEast
Line (Point3x, Point2y)-(Point3x, Point3y) 'East
Line (Point3x, Point3y)-(Point2X, Point4y) 'SouthEast
Line (Point2X, Point4y)-(Point1X, Point3y) 'SouthWest
Line (Point1X, Point3y)-(Point1X, Point2y) 'West
Paint (CenterX, CenterY), C
Color -1
End Sub
Sub DrawMap
HexWidth = Sqr(3) * HexSize: HexHeight = 2 * HexSize 'Height and Width of each individual hex
For X = min - 1 To max + 1
For Y = min - 1 To max + 1
CenterX = TopLeftX + X * HexWidth
CenterY = TopLeftY + Y * HexHeight * 0.75
If Y Mod 2 Then CenterX = CenterX + HexWidth / 2 'offset for odd/even rows
Point1X = CenterX - HexWidth / 2
Point2X = CenterX
Point3x = CenterX + HexWidth / 2
Point1y = CenterY - HexHeight / 2
Point2y = CenterY - HexHeight / 4
Point3y = CenterY + HexHeight / 4
Point4y = CenterY + HexHeight / 2
If map(X, Y).Wall And NW Then Line (Point1X, Point2y)-(Point2X, Point1y) 'NorthWest
If map(X, Y).Wall And NE Then Line (Point2X, Point1y)-(Point3x, Point2y) 'NorthEast
If map(X, Y).Wall And East Then Line (Point3x, Point2y)-(Point3x, Point3y) 'East
If map(X, Y).Wall And SE Then Line (Point3x, Point3y)-(Point2X, Point4y) 'SouthEast
If map(X, Y).Wall And SW Then Line (Point2X, Point4y)-(Point1X, Point3y) 'SouthWest
If map(X, Y).Wall And West Then Line (Point1X, Point3y)-(Point1X, Point2y) 'West
If (map(X, Y).Wall And 63) = 63 Then Paint (CenterX, CenterY)
Next
Next
End Sub
Sub DisplayImage (Image As Long, x As Integer, y As Integer, angle As Single, mode As _Byte)
'Image is the image handle which we use to reference our image.
'x,y is the X/Y coordinates where we want the image to be at on the screen.
'angle is the angle which we wish to rotate the image.
'mode determines HOW we place the image at point X,Y.
'Mode 0 we center the image at point X,Y
'Mode 1 we place the Top Left corner of oour image at point X,Y
'Mode 2 is Bottom Left
'Mode 3 is Top Right
'Mode 4 is Bottom Right
Dim px(3) As Integer, py(3) As Integer, w As Integer, h As Integer
Dim sinr As Single, cosr As Single, i As _Byte
w = _Width(Image): h = _Height(Image)
Select Case mode
Case 0 'center
px(0) = -w \ 2: py(0) = -h \ 2: px(3) = w \ 2: py(3) = -h \ 2
px(1) = -w \ 2: py(1) = h \ 2: px(2) = w \ 2: py(2) = h \ 2
Case 1 'top left
px(0) = 0: py(0) = 0: px(3) = w: py(3) = 0
px(1) = 0: py(1) = h: px(2) = w: py(2) = h
Case 2 'bottom left
px(0) = 0: py(0) = -h: px(3) = w: py(3) = -h
px(1) = 0: py(1) = 0: px(2) = w: py(2) = 0
Case 3 'top right
px(0) = -w: py(0) = 0: px(3) = 0: py(3) = 0
px(1) = -w: py(1) = h: px(2) = 0: py(2) = h
Case 4 'bottom right
px(0) = -w: py(0) = -h: px(3) = 0: py(3) = -h
px(1) = -w: py(1) = 0: px(2) = 0: py(2) = 0
End Select
sinr = Sin(angle / 57.2957795131): cosr = Cos(angle / 57.2957795131)
For i = 0 To 3
x2 = (px(i) * cosr + sinr * py(i)) + x: y2 = (py(i) * cosr - px(i) * sinr) + y
px(i) = x2: py(i) = y2
Next
_MapTriangle (0, 0)-(0, h - 1)-(w - 1, h - 1), Image To(px(0), py(0))-(px(1), py(1))-(px(2), py(2))
_MapTriangle (0, 0)-(w - 1, 0)-(w - 1, h - 1), Image To(px(0), py(0))-(px(3), py(3))-(px(2), py(2))
End Sub
Function TextToImage& (text$, font&, fc&, bfc&, mode As _Byte)
'text$ is the text that we wish to transform into an image.
'font& is the handle of the font we want to use.
'fc& is the color of the font we want to use.
'bfc& is the background color of the font.
'Mode 1 is print forwards
'Mode 2 is print backwards
'Mode 3 is print from top to bottom
'Mode 4 is print from bottom up
'Mode 0 got lost somewhere, but it's OK. We check to see if our mode is < 1 or > 4 and compensate automatically if it is to make it one (default).
If mode < 1 Or mode > 4 Then mode = 1
dc& = _DefaultColor: bgc& = _BackgroundColor
D = _Dest
F = _Font
T2Idown = CsrLin: T2Iright = Pos(0)
If font& <> 0 Then _Font font&
If mode < 3 Then
'print the text lengthwise
w& = _PrintWidth(text$): h& = _FontHeight
Else
'print the text vertically
For i = 1 To Len(text$)
If w& < _PrintWidth(Mid$(text$, i, 1)) Then w& = _PrintWidth(Mid$(text$, i, 1))
Next
h& = _FontHeight * (Len(text$))
End If
TextToImage_temp& = _NewImage(w&, h&, 32)
TextToImage = TextToImage_temp&
_Dest TextToImage_temp&
If font& <> 0 Then _Font font&
Color fc&, bfc&
Select Case mode
Case 1
'Print text forward
_PrintString (0, 0), text$
Case 2
'Print text backwards
temp$ = ""
For i = 0 To Len(text$) - 1
temp$ = temp$ + Mid$(text$, Len(text$) - i, 1)
Next
_PrintString (0, 0), temp$
Case 3
'Print text upwards
'first lets reverse the text, so it's easy to place
temp$ = ""
For i = 0 To Len(text$) - 1
temp$ = temp$ + Mid$(text$, Len(text$) - i, 1)
Next
'then put it where it belongs
For i = 1 To Len(text$)
fx = (w& - _PrintWidth(Mid$(temp$, i, 1))) / 2 + .99 'This is to center any non-monospaced letters so they look better
_PrintString (fx, _FontHeight * (i - 1)), Mid$(temp$, i, 1)
Next
Case 4
'Print text downwards
For i = 1 To Len(text$)
fx = (w& - _PrintWidth(Mid$(text$, i, 1))) / 2 + .99 'This is to center any non-monospaced letters so they look better
_PrintString (fx, _FontHeight * (i - 1)), Mid$(text$, i, 1)
Next
End Select
_Dest D
Color dc&, bgc&
_Font F
Locate T2Idown, T2Iright
End Function
^ An old hex maze generator which I wrote several years back.
Notice that the game gets consistently harder as you progress, with more walls blocking your path, and I must admit: I didn't bother to have the program check to make certain that you can actually reach the target location. In fact, I freely confess, if you keep playing, you'll eventually get to a stage where you WON'T be able to reach the target -- the non-intelligent randomness of this little demo WILL make it an impossible task eventually.
ESC stops the program.
R will Relocate the target location.
Left/Right allows us to change heading.
Up moves us in the direction we're facing.
Down is a terrible cheat (intentionally left at this point, to allow full map movement), which moves us away from the direction we're facing.
Try it out and see what you think; it's definitely different than most other quad-directional maze-generators which I've seen and played around with in the past.
RE: Hex_Maze - James D Jarvis - 03-15-2023
(03-14-2023, 02:54 PM)bplus Wrote: Nice start.
First question that comes to mind is how to navigate in such a maze. Up and down arrows OK but left and right, upper and lower? hmm...
Also I wonder if possible to generate a maze that passes through every room like orthogonal maze generators do.
You could navigate with forward, backward and rotation left or right like SMcNiel shows. Use the number keys 1 through 6 is pretty quick and easy as well. You can also just stick with the player and sprites still interacting in a standard x-y grid with the hexes just defining the overall geometry.
I suppose a standard maze generating algorithm that visits every cell would still function as the hex grid is ultimately just a standard grid where the geometry is offset every other column (or row) of cells. The resulting mazes may demonstrate a bias but they'd likely work.
RE: Hex_Maze - James D Jarvis - 03-15-2023
(03-15-2023, 05:49 AM)SMcNeill Wrote: ^ An old hex maze generator which I wrote several years back.
Notice that the game gets consistently harder as you progress, with more walls blocking your path, and I must admit: I didn't bother to have the program check to make certain that you can actually reach the target location. In fact, I freely confess, if you keep playing, you'll eventually get to a stage where you WON'T be able to reach the target -- the non-intelligent randomness of this little demo WILL make it an impossible task eventually.
ESC stops the program.
R will Relocate the target location.
Left/Right allows us to change heading.
Up moves us in the direction we're facing.
Down is a terrible cheat (intentionally left at this point, to allow full map movement), which moves us away from the direction we're facing.
Try it out and see what you think; it's definitely different than most other quad-directional maze-generators which I've seen and played around with in the past.
I got stuck the very first run, except for the backing up through walls with the down key I'd have been doomed.
I like it, definitely a different look than what I'm going for but it does tackle some of the same issues.
|