やり方は前述のGemma氏のサイトの解説通り。コメントは書いてないので、分からない部分があったら質問してください。以下は一例。
#define CX 64
#define CY 36
#define SX 16
#define SY 16
randomize
screen 0, 1024, 576, 0
makemap map, CX, CY, 7
redraw 0
for x, 0, length(map)
for y, 0, length2(map)
pos x*16, y*16
if map(x,y) {
box x*16, y*16, 16, 16, $000000, $404040
} else {
box x*16, y*16, 16, 16, $D0A080, $FFD0B0
}
next
next
redraw 1
stop
#module
#deffunc makemap array map, int cx, int cy, int count
dim map, cx, cy
repeat cx
map(cnt,0) = 1
map(cnt,cy-1) = 1
loop
repeat cy
map(0,cnt) = 1
map(cx-1,cnt) = 1
loop
makebrock map, 1, 1, cx-2, cy-2, count
return
#define IX 3
#define IY 3
#deffunc makebrock array map, int bx, int by, int cx, int cy, int count \
, local div, local size1, local size2, local hole
if (count+2<rnd(5)) | ((cx < IX*2+1) & (cy < IY*2+1)) : return
div = rnd(2)
if cx < IX*2+1 : div = 1
if cy < IY*2+1 : div = 0
if div = 0 {
size1 = IX+rnd(cx-IX*2)
size2 = cx-1-size1
repeat cy, by
map(bx+size1,cnt) = 1
loop
makebrock map, bx, by, size1, cy, count-1
makebrock map, bx+size1+1, by, size2, cy, count-1
repeat rnd(1+(cy-IY)/IY/2)+1
hole = by+rnd(cy)
map(bx+size1-1,hole) = 0
map(bx+size1,hole) = 0
map(bx+size1+1,hole) = 0
loop
} else {
size1 = IY+rnd(cy-IY*2)
size2 = cy-1-size1
repeat cx, bx
map(cnt,by+size1) = 1
loop
makebrock map, bx, by, cx, size1, count-1
makebrock map, bx, by+size1+1, cx, size2, count-1
repeat rnd(1+(cx-IX)/IX/2)+1
hole = bx+rnd(cx)
map(hole,by+size1-1) = 0
map(hole,by+size1) = 0
map(hole,by+size1+1) = 0
loop
}
return
#define global alargb(%1) color ((%1)&$FF0000)>>16, ((%1)&$FF00)>>8, (%1)&$FF
#deffunc box int px, int py, int sx, int sy, int oc, int ic
alargb oc
boxf px, py, px+sx-1, py+sy-1
alargb ic
boxf px+1, py+1, px+sx-2, py+sy-2
return
#global
……にしても良いサイトを教えてもらいました。wass氏には感謝です。