|
- require "import"
& B) V' `- h7 n7 l& g" G. d - import "android.app.*"
4 T, [" y! z0 b3 l% t3 w - import "android.os.*"
: b" O s4 U5 A - import "android.util.*"5 e* z" x* J8 L' r# D5 n7 T9 u# f3 y
- import "android.view.*"
0 R) x" s: ? g4 H+ N) t W - import "android.content.*"
" s. l8 Z: T. m f2 B! J" { - import "android.graphics.*"$ [1 m5 X# X& H% w
- activity.setTitle('Androlua迷宫生成')/ O; M+ ]5 U+ ] X& ?0 O2 M+ \
- activity.setTheme(android.R.style.Theme_DeviceDefault_Light)--设置md主题
0 p5 o. u: l7 k) s - --迷宫生成算法:https://github.com/joewing/maze) ^6 ^3 W* f0 `8 y% X3 [' y4 t$ P
- --修改成Androlua:落叶似秋
5 H }1 R0 |, V) z
. p/ a6 H6 w; Z h1 H: [5 d- q- --初始化迷宫+ y1 [! {) _* J8 J' h7 w
- function init_maze(width, height)$ Y x. u: Y4 w
- local result = {}
# R+ S, }5 o8 r5 A( x- ^6 w - for y = 0, height - 1 do
* ?4 h9 j, L5 t; i& \ - for x = 0, width - 1 do3 a: m1 R& V# t5 x
- result[y * width + x] = 1
5 N, u$ ^$ x1 }# I - end
& p4 H4 W( K) F' K/ q* a, X k - result[y * width + 0] = 05 D0 m( L" N1 B3 v% C
- result[y * width + width - 1] = 0
/ I* T) Z! n6 v, X; \: b) } - end: [( ]0 _4 f \9 t. k
- for x = 0, width - 1 do8 k+ k' V8 _7 s& `% x
- result[0 * width + x] = 0
- E9 z" p8 ^: v3 [6 {7 m' H - result[(height - 1) * width + x] = 02 K* e4 m5 f- q" k
- end
1 E: o; U/ F: D$ y" W: [ r- |( Q - return result, T) C$ \: W; S3 U( ~) i
- end
Q# v6 \6 `* ?1 T - : O, x h: U7 R0 Q1 F9 S
- -- 画迷宫! L. L% ?8 e. p h- C1 K0 O w
- function draw_maze(canvas,maze, width, height)! R, ?7 }' B' y C
- % G9 u% ?( b7 X9 s3 |1 U4 z( \: J& X/ i
- local x1,y1,rectW,rectH=0,0,10,107 D9 h* u% |# w$ h: Z# h
- local paint=Paint()( o1 V0 M. {- ~8 W* Y2 T8 {
- paint.setColor(Color.BLACK). B8 E1 h, X) C, Y6 p
2 }2 Q1 U8 e( s/ }. n' L- for y = 0, height - 1 do
7 \ R! O/ q5 F: \; y& F, r+ v - for x = 0, width - 1 do
/ C. x0 P1 o. I w - if maze[y * width + x] == 0 then4 M$ \# m: w) U0 n1 p4 j
- 5 D! M+ x" c) b8 u% O! d" g
- x1=x1+rectW2 s* S( m n j( ~/ w$ p" Q
- else
; \- @, }3 n3 q5 R6 ~ - --画矩形
5 }- H6 v; ~' I- Y7 f - canvas.drawRect(x1,y1,x1+rectW,y1+rectH,paint)
7 Y; C+ C0 K) e0 l% _, s - x1=x1+rectW& f& w# a* r. K! o/ C
- end; d9 E9 b3 L4 _: F
- end1 m0 W5 H8 t! a0 [4 u- I
- y1=y1+rectH. p" a! M: C* J
- x1=04 N. e& ?& r i) U, S: b
- end* K& ?% z/ Z1 P% k* o4 }
- end1 P5 b2 b9 s- o' z+ p$ C) \
: [8 ?9 [4 X: K. }- -- 从x,y打通路
. A& t+ t+ `- j' B B/ f8 V) a - function carve_maze(maze, width, height, x, y)
5 f9 Q; y7 a% G4 J9 v- B - local r = math.random(0, 3)7 x# i R, D1 W e5 a
- maze[y * width + x] = 03 P S2 o& }$ s0 A
- for i = 0, 3 do
}5 }: N8 s* v - local d = (i + r) % 4: u* R4 s; N8 e
- local dx = 0- D" K5 ]8 E; D# T5 y" D
- local dy = 0
+ x, Y/ M8 ]% n/ }& |# `' m - if d == 0 then
5 d6 z, y9 ^5 p0 N - dx = 1
6 ]9 r4 [, q4 u+ m- s! c - elseif d == 1 then- L2 n# D8 r) ~$ ^# |/ J" h. P
- dx = -1. M: v! |1 J5 t1 J6 L
- elseif d == 2 then& W/ M* l. r# l9 l. K! f
- dy = 1
# C* k- D# t1 m: D& L0 Y) c - else8 V- S3 J7 O& p0 C$ j# G) @3 W
- dy = -13 j e. _2 J0 v" y& s( ^
- end. q3 T+ C/ ~! h1 u) z R! f
- local nx = x + dx
3 x% i$ I& b" M- o: I+ n. T - local ny = y + dy
3 Y$ M: C8 `+ ~& j a6 D i6 s% C - local nx2 = nx + dx) z6 H# Z3 u3 D2 ^
- local ny2 = ny + dy
! u) b8 n' B+ q! w' c9 p - if maze[ny * width + nx] == 1 then6 ?/ q: `5 M. ]7 I: R q
- if maze[ny2 * width + nx2] == 1 then( @5 b" z# m$ D9 C5 j# r
- maze[ny * width + nx] = 0/ b4 U7 U7 O w C
- carve_maze(maze, width, height, nx2, ny2)' X9 ?. S4 }" m' s- X
- end
6 N2 m/ t! h# O, h& j - end+ B% U- q( J# H% K8 i# _
- end
1 a/ L2 V+ \, R/ O2 z2 X a; d% V - end
! C8 {5 e9 k. i: e; ~
9 q3 o( |1 [5 i/ Z( G- --以下为Android绘图相关+ K9 N1 x- o! N$ G
- local surface = SurfaceView(activity). l; B0 h' E! O0 j0 V6 A: V
+ z# p+ Z; t) e. }0 J2 v* I3 D* N- local callback=SurfaceHolder_Callback{- d; a4 }9 _- Y4 m* W
- surfaceChanged=function(holder,format,width,height)
# o! V# O; M# p7 ~ - end,
; k: P1 b5 u$ ?3 e - surfaceCreated=function(holder)4 ]' ^8 S' C* e: y ]# @/ ?! V Y, n
- 3 G0 b# g- h+ w
- --local width=surface.getWidth()-1
5 g& z6 @0 \0 w5 \6 v2 B - -- local height=surface.getHeight()-1
7 D2 u/ {. K, D) ?) B3 w! R/ T! p - -- 迷宫的高宽,都必须为奇数
% H4 D1 t. t& X - local width = 71
$ u# \+ ?0 ~& }8 [) {7 _ - local height = 71& m- p- C* C. o0 x1 D' g
: T5 j9 h/ s7 C- l% q3 b9 }9 Z
" v/ C' c, Y9 A) X7 g- local maze = init_maze(width, height)
) F' k) ]# ?5 Y+ E' Y7 G6 J: x - carve_maze(maze, width, height, 2, 2)
0 L# z# v D- T" y* l P4 @3 M# \% [7 s$ o - maze[width + 2] = 0* X% l) ~4 k! L# e/ |7 ]9 n' b1 C
- maze[(height - 2) * width + width - 3] = 0
% i D3 c [( l- n" n8 l - # D0 a2 F7 F6 d
- n) S/ ]3 u4 j4 ~. h8 {
- canvas=sfh.lockCanvas()
& E% Z9 ?: t* i8 [ ?9 u - canvas.drawColor(Color.WHITE)
: J+ H) `8 @4 j: a, |. ~ - draw_maze(canvas,maze,width,height)
8 Y M/ P( {- v. }( e4 L
5 L, J6 |8 ~( Q/ Y$ o0 M8 {9 M- if canvas~=nil then
C/ ~4 C3 r5 r7 b* a - sfh.unlockCanvasAndPost(canvas)
6 S$ I; `2 D1 w; c: Q6 a - end( N! `$ { ^0 ]' ]$ _" t
- end,
/ V& H1 L2 g X+ ^ - surfaceDestroyed=function(holder)
2 i9 ?, @% h- c$ F - end9 A: |& c' y3 L# G( W p
- }# U- A1 \3 _- l7 A( g) G1 q" u
- sfh=surface.getHolder()
1 z6 q9 I; C! u9 o - sfh.addCallback(callback)% o- P7 h/ m0 t& w5 r! Y5 m
- activity.setContentView(surface)
$ e$ P; |2 B* O3 y
复制代码 |
|