请选择 进入手机版 | 继续访问电脑版

登录  | 立即注册

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

查看: 1508|回复: 1

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

[复制链接]

444

主题

509

帖子

2051

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2051

荣誉管理论坛元老

发表于 2021-7-1 08:45:44 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import"3 E5 ^( H1 v- O  t
  2. import "android.app.*"
    & f6 Q8 k$ J4 T# I- b7 M$ P
  3. import "android.os.*"
    $ a& C: {( p+ ?
  4. import "android.util.*"
    " o; s8 [! j/ j
  5. import "android.view.*"0 D3 J! g. Q2 w" f
  6. import "android.content.*"8 ]3 E  p" @9 n) O* m- V3 c3 s5 R
  7. import "android.graphics.*"" L7 u( o' {" F0 o
  8. activity.setTitle('Androlua迷宫生成')
    ! A! h, d. ~- ~+ X3 C. P; Q
  9. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题- a( L9 X; }& a
  10. --迷宫生成算法:https://github.com/joewing/maze4 @4 E7 P) X  l
  11. --修改成Androlua:落叶似秋" X$ ^: n, i+ T) S

  12. 3 d" ^2 ]4 d% C& M/ E7 {0 N1 I
  13. --初始化迷宫
    % x6 N2 ~: }  E3 J' G
  14. function init_maze(width, height)
    7 O4 \5 F. q0 L  D$ H
  15.   local result = {}+ s3 ^7 w. K4 U2 p* M  b
  16.   for y = 0, height - 1 do
    0 H! z* K) M4 d' P( }& N) E
  17.     for x = 0, width - 1 do
    / e4 w: M) u% ^. d9 w" Q
  18.       result[y * width + x] = 1
    3 ]4 `/ h. Z0 B5 p3 ~# W
  19.     end, L& |; X, e9 {. f2 p/ Y
  20.     result[y * width + 0] = 0
    - y1 Z" k, n3 ~6 H
  21.     result[y * width + width - 1] = 02 c6 C4 Q' l8 o7 r4 o5 e1 ^
  22.   end
    $ M+ e8 M  ~& N& P
  23.   for x = 0, width - 1 do
    % {- {6 F- a, |; u9 N7 y, X0 _6 V- h
  24.     result[0 * width + x] = 03 ~7 z9 ^( q  J1 N9 u3 |) H7 P
  25.     result[(height - 1) * width + x] = 0/ I9 G! H: S) c- u  `
  26.   end7 a. T( [6 Z$ ~5 c; l$ w
  27.   return result
    * Z. Z# n6 H; T1 D
  28. end
    7 m: c' ^7 H& i. J$ X3 `

  29. ; K7 h: B( y8 w  ~' c' J7 F5 |
  30. -- 画迷宫
    - X: m/ `- z- [) F+ u
  31. function draw_maze(canvas,maze, width, height)  P% V' L3 Y7 I! h% V
  32. ) L& T  k0 U" \: @
  33.   local x1,y1,rectW,rectH=0,0,10,10
    # S, _. `" s" G1 ^) H3 _" x5 C
  34.   local paint=Paint()( {* f# q# W; V, P3 o7 g. A' D3 p5 k
  35.   paint.setColor(Color.BLACK)2 o( c( j' S! ]/ |1 W) M
  36. 9 ]% S% |! F0 L) `( U& J( u
  37.   for y = 0, height - 1 do4 ~; s. I* r7 `9 Q; ~
  38.     for x = 0, width - 1 do
    6 |! Y; R" ?8 V- i& q7 N% \4 v
  39.       if maze[y * width + x] == 0 then
    . A& l- `# t5 U0 X
  40. 2 @' v; ^6 Y; P" u
  41.         x1=x1+rectW
    : E. z; n: l# t" Q, ^# `* T; J
  42.        else
    + }* o& A( A/ L7 q) R/ p2 n3 H( w
  43.         --画矩形- \# j+ d- t! [
  44.         canvas.drawRect(x1,y1,x1+rectW,y1+rectH,paint)8 _- d$ R& `# t. ]  a
  45.         x1=x1+rectW3 a8 ~* A6 l. T! @4 d
  46.       end
    ) \. c7 c! z! e+ z) n. d
  47.     end- Q. |5 G1 @. L1 d5 u" I4 D
  48.     y1=y1+rectH
    # E; F& h: K, z) |
  49.     x1=0
    3 D" {* w4 X: J. c+ u  ~
  50.   end: A! j$ G4 Q# D8 v4 a- j# J! ~5 ~. \
  51. end4 f) P$ B* m' `: d0 y- S
  52. 7 x% i/ Y9 [6 N$ d  t9 a
  53. -- 从x,y打通路1 G0 ~2 i. X% z( Y8 ^1 R
  54. function carve_maze(maze, width, height, x, y)# Y7 C- D+ u" U0 v2 D
  55.   local r = math.random(0, 3)$ r8 Y, Q9 r( [: u
  56.   maze[y * width + x] = 0
    - A8 `* y+ g( h$ M' G5 N" T7 u% h
  57.   for i = 0, 3 do
    & [8 p& y( C4 |6 J. |- W
  58.     local d = (i + r) % 4
    . h* k" I( n- N7 R
  59.     local dx = 0: _! ~' p1 H: k3 A% [- u, s
  60.     local dy = 0; A7 B8 |8 m: C- Q8 W5 t3 D) ]
  61.     if d == 0 then3 k- p  Z3 P$ ~& q9 o
  62.       dx = 14 f# a  c* L1 O& t: U& e# ]
  63.      elseif d == 1 then+ b0 x5 I6 ?* s9 O( |3 c3 ?# @
  64.       dx = -1
    & V4 k4 v! s& l% c: D) X" M$ G
  65.      elseif d == 2 then
    - i8 R- i: Z) y$ ]: }
  66.       dy = 1
    2 Y" C$ E3 m9 O
  67.      else
    8 g0 y" I" I$ ]8 e/ T' L* @( u
  68.       dy = -1
    / R: _7 e7 C% S: `* w; r
  69.     end7 Y+ R5 X4 @' {, U0 Z4 G8 U: S
  70.     local nx = x + dx
    4 n$ g+ O9 i, s" j2 O
  71.     local ny = y + dy& e, @% S# H0 L' ]
  72.     local nx2 = nx + dx
    # J+ Q; ?9 M8 q* T, B4 V
  73.     local ny2 = ny + dy, G% G% a/ O6 K. k/ n) s* `9 H+ X
  74.     if maze[ny * width + nx] == 1 then6 D( {5 C9 ^6 G2 E9 f
  75.       if maze[ny2 * width + nx2] == 1 then; i( q# c$ u2 q# e
  76.         maze[ny * width + nx] = 0
    ' F5 u8 K$ P! e  t
  77.         carve_maze(maze, width, height, nx2, ny2)  W9 y4 {# [  w; R
  78.       end
    6 X0 U2 m  a$ `; N
  79.     end/ C3 i5 J- e2 U) _1 h
  80.   end
      V& y: u" ]. v! l1 T( f/ ]- o) o
  81. end
    6 @3 v2 ^( N( ~# ]/ Z; z
  82. 8 B; m: }4 R1 v1 ~1 x. M5 A* y
  83. --以下为Android绘图相关
    ; Q3 N& t6 I; D1 r
  84. local surface = SurfaceView(activity)) i% e0 i0 H$ E# D: l1 v
  85. * Z  ]! M( g& R& |: |" Z% k
  86. local callback=SurfaceHolder_Callback{
    8 ^" V. Z$ l2 _, i3 u# ?
  87.   surfaceChanged=function(holder,format,width,height)5 v! S: H: G; Z0 W, j3 C  o; u( j9 |
  88.   end,
    + y/ r' ~% p1 |6 I7 Q3 G
  89.   surfaceCreated=function(holder)
    8 t$ e* R& d9 e

  90. ( a; I* [6 p+ s: Z. q- M- g( K
  91.     --local width=surface.getWidth()-1! U9 _0 Q3 _# e7 g3 R
  92.     -- local height=surface.getHeight()-1  t& w4 Z7 I5 M% p: [. g
  93.     -- 迷宫的高宽,都必须为奇数* m; }3 o  h+ A) S  g
  94.     local width = 716 D* \% a; `% v6 O
  95.     local height = 71
    * E! D( Z1 |  Z0 B5 c" \9 A
  96. / W$ ^( L' m5 N& N3 x- v2 F

  97. ; d1 n0 \8 t. z* }
  98.     local maze = init_maze(width, height)3 c; w# @' {) V
  99.     carve_maze(maze, width, height, 2, 2)$ B4 z. c3 v2 ~, o$ \
  100.     maze[width + 2] = 0' M5 @2 E9 @* b, a
  101.     maze[(height - 2) * width + width - 3] = 08 ~6 N9 L9 Y$ g0 }1 o
  102. - O; K7 n/ ?9 w" p1 {
  103. 5 }7 W4 S1 p% j7 r! t6 T. y
  104.     canvas=sfh.lockCanvas()3 w( \5 J* v  N- L+ H
  105.     canvas.drawColor(Color.WHITE)
    ' n, t+ S6 {9 r& \& P4 R
  106.     draw_maze(canvas,maze,width,height)) i& i' i3 W2 l) v9 b1 N9 S4 _( C' h0 |

  107. / C. N4 ], Y- O9 _8 z
  108.     if canvas~=nil then
    : {# k) B9 z' U9 z2 b2 `
  109.       sfh.unlockCanvasAndPost(canvas)& a7 k, L" J8 X2 D& e
  110.     end
    " p$ C8 M6 X) F- b, e  p' _
  111.   end,
    # o! e" Y# F) K5 ?
  112.   surfaceDestroyed=function(holder)$ |4 S8 O; u2 W* x/ X, G" i
  113.   end( B# @/ l) ]8 P4 G6 _/ F; x
  114. }
    ! e4 T( a+ L2 i' o% `$ a
  115. sfh=surface.getHolder()0 q4 n% G* v. ]0 z# e/ f
  116. sfh.addCallback(callback)8 X  `2 {/ [+ ~4 o5 u( G
  117. activity.setContentView(surface)
    ! ^& W) Z  M! g, d2 `3 X
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-3-28 18:14 , Processed in 0.070687 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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