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

星空社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 468|回复: 0

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

[复制链接]

407

主题

472

帖子

1622

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1622

荣誉管理论坛元老

发表于 2021-7-1 08:45:44 来自手机 | 显示全部楼层 |阅读模式 来自:
  1. require "import"
    & B) V' `- h7 n7 l& g" G. d
  2. import "android.app.*"
    4 T, [" y! z0 b3 l% t3 w
  3. import "android.os.*"
    : b" O  s4 U5 A
  4. import "android.util.*"5 e* z" x* J8 L' r# D5 n7 T9 u# f3 y
  5. import "android.view.*"
    0 R) x" s: ?  g4 H+ N) t  W
  6. import "android.content.*"
    " s. l8 Z: T. m  f2 B! J" {
  7. import "android.graphics.*"$ [1 m5 X# X& H% w
  8. activity.setTitle('Androlua迷宫生成')/ O; M+ ]5 U+ ]  X& ?0 O2 M+ \
  9. activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题
    0 p5 o. u: l7 k) s
  10. --迷宫生成算法:https://github.com/joewing/maze) ^6 ^3 W* f0 `8 y% X3 [' y4 t$ P
  11. --修改成Androlua:落叶似秋
    5 H  }1 R0 |, V) z

  12. . p/ a6 H6 w; Z  h1 H: [5 d- q
  13. --初始化迷宫+ y1 [! {) _* J8 J' h7 w
  14. function init_maze(width, height)$ Y  x. u: Y4 w
  15.   local result = {}
    # R+ S, }5 o8 r5 A( x- ^6 w
  16.   for y = 0, height - 1 do
    * ?4 h9 j, L5 t; i& \
  17.     for x = 0, width - 1 do3 a: m1 R& V# t5 x
  18.       result[y * width + x] = 1
    5 N, u$ ^$ x1 }# I
  19.     end
    & p4 H4 W( K) F' K/ q* a, X  k
  20.     result[y * width + 0] = 05 D0 m( L" N1 B3 v% C
  21.     result[y * width + width - 1] = 0
    / I* T) Z! n6 v, X; \: b) }
  22.   end: [( ]0 _4 f  \9 t. k
  23.   for x = 0, width - 1 do8 k+ k' V8 _7 s& `% x
  24.     result[0 * width + x] = 0
    - E9 z" p8 ^: v3 [6 {7 m' H
  25.     result[(height - 1) * width + x] = 02 K* e4 m5 f- q" k
  26.   end
    1 E: o; U/ F: D$ y" W: [  r- |( Q
  27.   return result, T) C$ \: W; S3 U( ~) i
  28. end
      Q# v6 \6 `* ?1 T
  29. : O, x  h: U7 R0 Q1 F9 S
  30. -- 画迷宫! L. L% ?8 e. p  h- C1 K0 O  w
  31. function draw_maze(canvas,maze, width, height)! R, ?7 }' B' y  C
  32. % G9 u% ?( b7 X9 s3 |1 U4 z( \: J& X/ i
  33.   local x1,y1,rectW,rectH=0,0,10,107 D9 h* u% |# w$ h: Z# h
  34.   local paint=Paint()( o1 V0 M. {- ~8 W* Y2 T8 {
  35.   paint.setColor(Color.BLACK). B8 E1 h, X) C, Y6 p

  36. 2 }2 Q1 U8 e( s/ }. n' L
  37.   for y = 0, height - 1 do
    7 \  R! O/ q5 F: \; y& F, r+ v
  38.     for x = 0, width - 1 do
    / C. x0 P1 o. I  w
  39.       if maze[y * width + x] == 0 then4 M$ \# m: w) U0 n1 p4 j
  40. 5 D! M+ x" c) b8 u% O! d" g
  41.         x1=x1+rectW2 s* S( m  n  j( ~/ w$ p" Q
  42.        else
    ; \- @, }3 n3 q5 R6 ~
  43.         --画矩形
    5 }- H6 v; ~' I- Y7 f
  44.         canvas.drawRect(x1,y1,x1+rectW,y1+rectH,paint)
    7 Y; C+ C0 K) e0 l% _, s
  45.         x1=x1+rectW& f& w# a* r. K! o/ C
  46.       end; d9 E9 b3 L4 _: F
  47.     end1 m0 W5 H8 t! a0 [4 u- I
  48.     y1=y1+rectH. p" a! M: C* J
  49.     x1=04 N. e& ?& r  i) U, S: b
  50.   end* K& ?% z/ Z1 P% k* o4 }
  51. end1 P5 b2 b9 s- o' z+ p$ C) \

  52. : [8 ?9 [4 X: K. }
  53. -- 从x,y打通路
    . A& t+ t+ `- j' B  B/ f8 V) a
  54. function carve_maze(maze, width, height, x, y)
    5 f9 Q; y7 a% G4 J9 v- B
  55.   local r = math.random(0, 3)7 x# i  R, D1 W  e5 a
  56.   maze[y * width + x] = 03 P  S2 o& }$ s0 A
  57.   for i = 0, 3 do
      }5 }: N8 s* v
  58.     local d = (i + r) % 4: u* R4 s; N8 e
  59.     local dx = 0- D" K5 ]8 E; D# T5 y" D
  60.     local dy = 0
    + x, Y/ M8 ]% n/ }& |# `' m
  61.     if d == 0 then
    5 d6 z, y9 ^5 p0 N
  62.       dx = 1
    6 ]9 r4 [, q4 u+ m- s! c
  63.      elseif d == 1 then- L2 n# D8 r) ~$ ^# |/ J" h. P
  64.       dx = -1. M: v! |1 J5 t1 J6 L
  65.      elseif d == 2 then& W/ M* l. r# l9 l. K! f
  66.       dy = 1
    # C* k- D# t1 m: D& L0 Y) c
  67.      else8 V- S3 J7 O& p0 C$ j# G) @3 W
  68.       dy = -13 j  e. _2 J0 v" y& s( ^
  69.     end. q3 T+ C/ ~! h1 u) z  R! f
  70.     local nx = x + dx
    3 x% i$ I& b" M- o: I+ n. T
  71.     local ny = y + dy
    3 Y$ M: C8 `+ ~& j  a6 D  i6 s% C
  72.     local nx2 = nx + dx) z6 H# Z3 u3 D2 ^
  73.     local ny2 = ny + dy
    ! u) b8 n' B+ q! w' c9 p
  74.     if maze[ny * width + nx] == 1 then6 ?/ q: `5 M. ]7 I: R  q
  75.       if maze[ny2 * width + nx2] == 1 then( @5 b" z# m$ D9 C5 j# r
  76.         maze[ny * width + nx] = 0/ b4 U7 U7 O  w  C
  77.         carve_maze(maze, width, height, nx2, ny2)' X9 ?. S4 }" m' s- X
  78.       end
    6 N2 m/ t! h# O, h& j
  79.     end+ B% U- q( J# H% K8 i# _
  80.   end
    1 a/ L2 V+ \, R/ O2 z2 X  a; d% V
  81. end
    ! C8 {5 e9 k. i: e; ~

  82. 9 q3 o( |1 [5 i/ Z( G
  83. --以下为Android绘图相关+ K9 N1 x- o! N$ G
  84. local surface = SurfaceView(activity). l; B0 h' E! O0 j0 V6 A: V

  85. + z# p+ Z; t) e. }0 J2 v* I3 D* N
  86. local callback=SurfaceHolder_Callback{- d; a4 }9 _- Y4 m* W
  87.   surfaceChanged=function(holder,format,width,height)
    # o! V# O; M# p7 ~
  88.   end,
    ; k: P1 b5 u$ ?3 e
  89.   surfaceCreated=function(holder)4 ]' ^8 S' C* e: y  ]# @/ ?! V  Y, n
  90. 3 G0 b# g- h+ w
  91.     --local width=surface.getWidth()-1
    5 g& z6 @0 \0 w5 \6 v2 B
  92.     -- local height=surface.getHeight()-1
    7 D2 u/ {. K, D) ?) B3 w! R/ T! p
  93.     -- 迷宫的高宽,都必须为奇数
    % H4 D1 t. t& X
  94.     local width = 71
    $ u# \+ ?0 ~& }8 [) {7 _
  95.     local height = 71& m- p- C* C. o0 x1 D' g

  96. : T5 j9 h/ s7 C- l% q3 b9 }9 Z

  97. " v/ C' c, Y9 A) X7 g
  98.     local maze = init_maze(width, height)
    ) F' k) ]# ?5 Y+ E' Y7 G6 J: x
  99.     carve_maze(maze, width, height, 2, 2)
    0 L# z# v  D- T" y* l  P4 @3 M# \% [7 s$ o
  100.     maze[width + 2] = 0* X% l) ~4 k! L# e/ |7 ]9 n' b1 C
  101.     maze[(height - 2) * width + width - 3] = 0
    % i  D3 c  [( l- n" n8 l
  102. # D0 a2 F7 F6 d
  103.   n) S/ ]3 u4 j4 ~. h8 {
  104.     canvas=sfh.lockCanvas()
    & E% Z9 ?: t* i8 [  ?9 u
  105.     canvas.drawColor(Color.WHITE)
    : J+ H) `8 @4 j: a, |. ~
  106.     draw_maze(canvas,maze,width,height)
    8 Y  M/ P( {- v. }( e4 L

  107. 5 L, J6 |8 ~( Q/ Y$ o0 M8 {9 M
  108.     if canvas~=nil then
      C/ ~4 C3 r5 r7 b* a
  109.       sfh.unlockCanvasAndPost(canvas)
    6 S$ I; `2 D1 w; c: Q6 a
  110.     end( N! `$ {  ^0 ]' ]$ _" t
  111.   end,
    / V& H1 L2 g  X+ ^
  112.   surfaceDestroyed=function(holder)
    2 i9 ?, @% h- c$ F
  113.   end9 A: |& c' y3 L# G( W  p
  114. }# U- A1 \3 _- l7 A( g) G1 q" u
  115. sfh=surface.getHolder()
    1 z6 q9 I; C! u9 o
  116. sfh.addCallback(callback)% o- P7 h/ m0 t& w5 r! Y5 m
  117. activity.setContentView(surface)
    $ e$ P; |2 B* O3 y
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|星空社区

GMT+8, 2022-7-1 22:23 , Processed in 0.092079 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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