Import mojo Class maze Field sw:Int,sh:Int Field mw:Int,mh:Int Field tmw:Int,tmh:Int Field tw:Float,th:Float Field mazex:Stack<Int> = New Stack<Int> Field mazey:Stack<Int> = New Stack<Int> Field tilemap:Int[][] Field map:Int[][] Field map2:Int[][][] Method New(sw:Int,sh:Int,mw:Int,mh:Int) Self.sw = sw Self.sh = sh Self.mw = mw Self.mh = mh tmw = (mw*2)+1 tmh = (mh*2)+1 tw = Float(sw)/((Float(tmw))) th = Float(sh)/((Float(tmh))) map2 = New Int[mw][][] map = New Int[mw][] tilemap = New Int[tmw][] For Local i = 0 Until mw map[i] = New Int[mh] map2[i] = New Int[mh][] For Local z = 0 Until mh map2[i][z] = New Int[4] Next Next For Local i = 0 Until tmw tilemap[i] = New Int[tmh] Next makemaze() End Method Method makemaze() Local ax:Int[] = [0,1,0,-1] Local ay:Int[] = [-1,0,1,0] mazex.Push(Rnd(mw)) mazey.Push(Rnd(mh)) While mazex.IsEmpty = False Local x:Int=mazex.Top Local y:Int=mazey.Top Local d:Int[] = New Int[4] Local deadend:Bool=True For Local i:=0 Until ax.Length Local x2:Int=x+ax[i] Local y2:Int=y+ay[i] If x2>=0 And x2<mw And y2>=0 And y2<mh If map[x2][y2] = 0 d[i] = 1 deadend=False End If End If Next If deadend = False Local eloop:Bool=False While eloop = False Local r:Int=Rnd(0,4) If d[r] = 1 Then eloop = True Local nx:Int=x+ax[r] Local ny:Int=y+ay[r] map2[x][y][r] = 1 mazex.Push(nx) mazey.Push(ny) map[x][y] = 1 map[nx][ny] = 1 End If Wend Else ' if nothing happened than backtrace mazex.Pop() mazey.Pop() End If Wend ' convert the map into a tilemap For Local y:=0 Until mh For Local x:=0 Until mw Local x2:Int=x*2 Local y2:Int=y*2 If map[x][y] = 1 Then tilemap[x2+1][y2+1] = 1 If map2[x][y][0] = 1 Then tilemap[x2+1][y2] = 1 If map2[x][y][1] = 1 Then tilemap[x2+2][y2+1] = 1 If map2[x][y][2] = 1 Then tilemap[x2+1][y2+2] = 1 If map2[x][y][3] = 1 Then tilemap[x2][y2+1] = 1 Next Next End Method Method draw() Cls 0,0,0 SetColor 200,100,0 For Local y:Float=0 Until tmh Step 1 For Local x:Float=0 Until tmw Step 1 Local x2:Float=(x*tw) Local y2:Float=(y*th) If tilemap[x][y] = 1 Then DrawRect(x2,y2,tw,th) End If Next Next End Method End Class Global mymaze:maze Class MyGame Extends App Field cnt:Int=500 Method New() End Method Method OnRender() cnt+=1 ' If cnt>300 Or (KeyDown(KEY_SPACE) And cnt>20) Or (MouseDown(MOUSE_LEFT) And cnt>20 )Then cnt=0 Seed = Millisecs() Local s:Int=Rnd(10,64) mymaze = New maze(DeviceWidth,DeviceHeight,s,s) End If ' mymaze.draw() ' SetColor 255,255,255 DrawText("Press space or tap for new maze",0,0) End Method End Class Function Main() New MyGame() End Function
Artificial intelligence/templates/examples/rts/rpg/strategy ect. in MonkeyX/CerberusX language. You can download the free version of MonkeyX from itch.io or Cerberus-x.com The Flash applets will stop working in around 2020.
Thursday, December 15, 2016
Monkey-X - Example - Recursive Backtracking 2d Maze - code example
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.