登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 1529|回复: 1

[lua教程] 【lua教程】生成迷宫

[复制链接]

444

主题

509

帖子

2051

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2051

荣誉管理论坛元老

发表于 2021-7-1 08:45:44 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import"- k; `5 A9 K( p* ~' \* f% x
  2. import "android.app.*"6 ]. J6 L8 O9 c$ l; M* X0 A
  3. import "android.os.*"
    ' Q6 |: R0 V0 z$ l* p; b
  4. import "android.util.*"
    $ S; m) @  r# \6 z/ g. q3 `; S
  5. import "android.view.*"# @+ K+ Q1 I8 v  Y( s
  6. import "android.content.*"
    8 N- m9 `4 G6 G! l
  7. import "android.graphics.*"
    : l, Q4 c! U1 r" N4 j& L
  8. activity.setTitle('Androlua迷宫生成')/ Z7 ^$ h% q) H. V, |3 S: c/ W' s5 k
  9. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题0 W" l  K5 n2 c6 ?
  10. --迷宫生成算法:https://github.com/joewing/maze
      U: L" }' P2 H: J
  11. --修改成Androlua:落叶似秋
    ! P9 j: D+ A# X6 i+ ]' \9 W

  12. 9 Y: e, P" T5 C0 }
  13. --初始化迷宫
    $ v' b4 h1 v; f" W
  14. function init_maze(width, height)/ X; F7 ^+ I5 C6 f  j5 Z2 K% ^
  15.   local result = {}
    , t2 ]; L$ [. U8 ^3 k/ Z4 M
  16.   for y = 0, height - 1 do
    6 Y- B7 ^$ Q' F/ W% U: t
  17.     for x = 0, width - 1 do) Q$ i+ [* a1 H) K; a7 \: ]
  18.       result[y * width + x] = 1
    0 Z- M, l3 Z/ [, y* w; z" J
  19.     end" V9 h+ d/ G  i& w' W
  20.     result[y * width + 0] = 0# X; c$ [) W4 O: a3 Q: M
  21.     result[y * width + width - 1] = 0. [: x3 E, b, ?' v
  22.   end8 H4 T! Z4 _8 u& x
  23.   for x = 0, width - 1 do: ^9 f& H+ {9 ~5 ^9 {2 B0 h
  24.     result[0 * width + x] = 0. s- R" a% N' }" ?; z
  25.     result[(height - 1) * width + x] = 0: c8 D- B' j& M  p/ h$ S; V6 O
  26.   end
    / o* H$ I, X) k! c/ P3 x3 W9 T
  27.   return result0 ~8 j6 X$ P8 l6 N. z% r4 ?
  28. end
    $ D$ v) k+ T+ W* |) d
  29. 5 j; b' a/ t, W5 k5 j" R9 N% p
  30. -- 画迷宫9 Z7 I+ ~4 s, J5 W; @: u: `% b
  31. function draw_maze(canvas,maze, width, height)
    ; y. d2 \0 M  F) f8 l
  32. 2 s: i" f1 O" g# N) ?
  33.   local x1,y1,rectW,rectH=0,0,10,10
    & k6 J/ B! Z( r( g9 L. w$ S2 G% v0 F
  34.   local paint=Paint()/ E, Q5 e' s+ x# r1 O
  35.   paint.setColor(Color.BLACK)
    % m( [4 H9 u7 T: t) ?- F8 B4 N% @

  36. / A1 \% q6 p* b
  37.   for y = 0, height - 1 do
    : b, z& z& i, V: p
  38.     for x = 0, width - 1 do
    $ j0 C3 y/ X6 L& V4 ?! K! g  E
  39.       if maze[y * width + x] == 0 then+ f! d; H- C8 z" E; L
  40. # d" j+ [. \! n' S
  41.         x1=x1+rectW
    - f9 P6 }9 K# k# r* q+ \
  42.        else& a$ l# a1 w! d7 j* L1 k7 k8 B
  43.         --画矩形. o0 A1 ?# x! J( }2 d
  44.         canvas.drawRect(x1,y1,x1+rectW,y1+rectH,paint)2 U3 r$ W, U9 P" j0 Y
  45.         x1=x1+rectW
    & p  v" j& Z) b% U* G" I" ~6 |
  46.       end. A4 x6 `$ u0 f
  47.     end
    6 J$ ^* q# a# o: b  G
  48.     y1=y1+rectH
    & x  u+ O1 k. k* ]" Z- B: t
  49.     x1=0
    3 T) L/ S1 a0 o
  50.   end
    5 _6 O' u2 N, G
  51. end9 S1 f1 A5 B" h: l7 R5 \

  52. " h0 N) i+ Q- e- e7 ?
  53. -- 从x,y打通路
    # v- Q0 D, q3 d6 t: `
  54. function carve_maze(maze, width, height, x, y)
    & C6 e$ d; m9 |8 z
  55.   local r = math.random(0, 3)0 A$ \0 T3 y! K0 s
  56.   maze[y * width + x] = 09 Y" W% J& p" S2 S4 m- y
  57.   for i = 0, 3 do
    / N, s9 e: X* B; u& ^' h. J' O. B# x
  58.     local d = (i + r) % 4& V  V0 [* d) h' z% `8 C0 @: W
  59.     local dx = 0
    & G& |5 s6 V4 ?* ?
  60.     local dy = 0
    # M* q: ^; P: n( V6 y! K
  61.     if d == 0 then
      L; Y& G2 b( E- q; @
  62.       dx = 1& ]* m) a* |2 [2 R: b$ g
  63.      elseif d == 1 then$ j' K9 Y( T  y# P2 b  S. t; m8 D
  64.       dx = -1
    * ~$ C  K  Z* r- B: w* n; `
  65.      elseif d == 2 then4 Q% w4 I: i& y" t; f
  66.       dy = 1
    # f: X, H5 d3 I7 |: F
  67.      else6 l8 s; H& y* W- H& r- i
  68.       dy = -1
    " L: B  x" T- z
  69.     end
    , F  W9 C/ y+ k. W: ]& |
  70.     local nx = x + dx; e" H4 [/ _6 _: v' w
  71.     local ny = y + dy$ _8 S' \' j7 Z! r/ y# V/ s' f
  72.     local nx2 = nx + dx
    2 b* b1 b9 _' \" O; `
  73.     local ny2 = ny + dy
    ( w, h% V: T% Z0 u; x) n8 ]
  74.     if maze[ny * width + nx] == 1 then5 I" ~! X# s) p8 M+ |; p
  75.       if maze[ny2 * width + nx2] == 1 then" A+ d/ T6 G& n* I# z/ h( @
  76.         maze[ny * width + nx] = 02 `- y3 c1 ], M& {8 B
  77.         carve_maze(maze, width, height, nx2, ny2)
    : b1 E  b( W% l" J/ p, C
  78.       end
    $ s' Z0 W/ Y. x3 x% q- Z# ?: B& m
  79.     end
    ! m, q# c6 ~  {
  80.   end6 X5 t1 A" H! I) X$ q! b- n" N$ J
  81. end
    8 L2 E7 C: w6 r5 _  t9 h

  82. ; V8 I9 s2 W4 x. g- q0 a: b
  83. --以下为Android绘图相关; |2 [3 C+ {  T- k
  84. local surface = SurfaceView(activity)3 L' r- J! V" o  Y

  85. ! D( D4 q. {; ]  s( m
  86. local callback=SurfaceHolder_Callback{* K2 Z* W8 Z6 w# o) p3 q5 ]
  87.   surfaceChanged=function(holder,format,width,height)( A; E1 L8 c7 [4 U& e
  88.   end,
    0 K" B3 B6 O0 K: O- H
  89.   surfaceCreated=function(holder)
    - \+ E; _, m  w) x8 C6 e* q# o
  90. $ l3 B0 d( n: W( Y
  91.     --local width=surface.getWidth()-1
    6 S' \! m! H% A% W' R! Y5 l7 y
  92.     -- local height=surface.getHeight()-16 {- e9 ^, @9 k) t
  93.     -- 迷宫的高宽,都必须为奇数
    ! J. x4 l3 z, J4 R
  94.     local width = 71* ]( [- h: h2 p. e
  95.     local height = 71% [0 i" d6 ]; Y! }
  96. / i) T% L+ q9 M4 V& R/ J& t
  97. ! g$ x$ M; Z& v  H6 P
  98.     local maze = init_maze(width, height)6 z' E4 H* J% k
  99.     carve_maze(maze, width, height, 2, 2)7 b# {+ k! H+ m) S. w
  100.     maze[width + 2] = 0
    7 c! j; ]; B3 r# f+ A) M+ s; [
  101.     maze[(height - 2) * width + width - 3] = 0! [0 n8 Y6 L3 w4 \; N! T
  102. * s3 v7 s% p! Q
  103. $ A" C; N4 w1 y" {. j  P+ ^
  104.     canvas=sfh.lockCanvas()7 f( v4 V, p, |& P
  105.     canvas.drawColor(Color.WHITE)" W" c5 G' ]# }( l8 O" j1 G4 b
  106.     draw_maze(canvas,maze,width,height)8 a6 F4 v, A" l& W7 R: G

  107. ! B: K6 B! x6 y  E0 ~
  108.     if canvas~=nil then. Z; V! n5 q) M/ `# x( F
  109.       sfh.unlockCanvasAndPost(canvas), u- W" e) D. {2 h- k: m! K
  110.     end0 V$ ?1 L6 D. D' [1 b( h1 j4 F
  111.   end,
    + Z  i$ I$ p3 h1 W. Z- J9 E6 `: n8 q
  112.   surfaceDestroyed=function(holder)
    ) [4 h2 h" T) Q/ Q$ Z( x! p( L
  113.   end
    3 n5 k5 F0 L7 H5 a5 G- i8 y
  114. }( ^( O! N% T7 w! H6 e8 F4 c
  115. sfh=surface.getHolder()
    - W+ f( \/ ~7 c. S
  116. sfh.addCallback(callback)
    9 v% P: B' Q/ F: W
  117. activity.setContentView(surface)
      u* y( ]# `$ g! N% q
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|星空社区 |网站地图

GMT+8, 2024-4-20 02:42 , Processed in 0.050922 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表