;Copyright (c) 2005-2005 紳師(Shinshi) All Rights Reserved. ;================================================================================================== ; ▼迷路の大きさや細かさなどの設定 ;================================================================================================== ;#include "hspdx.as" #const global roadw 7 ;迷路の道幅、奇数、BLOCK - 1より小さく #const global block 10 ;ますのサイズ #const global wallw (block - roadw) / 2 ;壁の厚みの半分 #const global mazex 640 / block ;迷路の横幅、BLOCK単位で #const global mazey 480 / block ;迷路の高さ、BLOCK単位で #const global waitc 1 ;ウェイトカウント(MS) #const global nil 0 #const global true 1 #const global false -1 randomize screen , mazex * block, mazey * block, 0 title "迷生1.0" ;================================================================================================== ; ▼これから行う処理のための変数の初期化 ;================================================================================================== *start wr = rnd(85) : wg = rnd(85) : wb = rnd(85) ;壁の色 rr = wr + 170 : rg = wg + 170 : rb = wb + 170 ;道の色 ar = wr + 85 : ag = wg + 85 : ab = wb + 85 ;答えの色 ;es_timer time1 color wr, wg, wb : boxf 0, 0, mazex * block, mazey * block color rr, rg, rb dim conp, mazex * mazey * 4, 2 : dim culti, mazex, mazey dim dircan, 4 : dim walk, mazex * mazey, 2 dim xs, 4 : dim ys, 4 : xs = 0, 1, 0, -1 : ys = -1, 0, 1, 0 dim xa0, 5 : dim ya0, 5 : dim xa1, 5 : dim ya1, 5 ;================================================================================================== ; ▼迷路を描画する処理 ;================================================================================================== dir = 4 : ci = 0 : x = mazex / 2 : y = mazey / 2 *label1 await waitc culti(x, y) = true bx = block * x : by = block * y xp = bx + wallw : yp = by + wallw : xm = bx - wallw : ym = by - wallw xa0 = xp, xm, xp, xp, xp : ya0 = yp, yp, ym, yp, yp xp += roadw : yp += roadw : xm = xp + (wallw * 2) : ym = yp + (wallw * 2) xa1 = xp, xp, xp, xm, xp : ya1 = ym, yp, yp, yp, yp boxf xa0(dir), ya0(dir), xa1(dir), ya1(dir) if mazex - 1 - x : xp = x + 1 : else : xp = x if x : xm = x - 1 : else : xm = x if mazey - 1 - y : yp = y + 1 : else : yp = y if y : ym = y - 1 : else : ym = y xa0 = x, xp, x, xm : ya0 = ym, y, yp, y di = 0 repeat 4, rnd(4) i = cnt \ 4 if culti(xa0(i), ya0(i)) = nil { conp(ci, 0) = xa0(i) : conp(ci, 1) = ya0(i) : ci + dircan(di) = i : di + } loop if di { dir = dircan(rnd(di)) x += xs(dir) : y += ys(dir) goto *label1 } *label2 if ci = 0 : goto *label3 ci - : x = conp(ci, 0) : y = conp(ci, 1) if culti(x, y) : goto *label2 if mazex - 1 - x : xp = x + 1 : else : xp = x if x : xm = x - 1 : else : xm = x if mazey - 1 - y : yp = y + 1 : else : yp = y if y : ym = y - 1 : else : ym = y xa0 = x, xm, x, xp : ya0 = yp, y, ym, y di = 0 repeat 4 i = cnt if culti(xa0(i), ya0(i)) = true : dircan(di) = i : di + loop dir = dircan(rnd(di)) : goto *label1 *label3 bx = block * mazex : by = block * mazey boxf wallw, 0, wallw + roadw, wallw boxf bx - wallw - roadw - 1, by - wallw, bx - wallw - 1, by ;es_timer time2 ;================================================================================================== ; ▼迷路を解析し、正解ルートを表示する処理 ;================================================================================================== x = mazex - 1 : y = mazey - 1 : dir = 0 : wi = 0 *labelA await bx = block * x : by = block * y if wi > 1 { if walk(wi - 2, 0) = x and walk(wi - 2, 1) = y : wi - : else { walk(wi, 0) = x : walk(wi, 1) = y : wi + } } else : walk(wi, 0) = x : walk(wi, 1) = y : wi + xa0 = bx + (block / 2), bx + block - 1, bx + (block / 2), bx ya0 = by, by + (block / 2), by + block - 1, by + (block / 2) repeat 4, 2 i = (cnt + dir) \ 4 : pget xa0(i), ya0(i) if ginfo_r ! wr or ginfo_g ! wg or ginfo_b ! wb : ndir = i loop dir = ndir if x + y = 0 : goto *labelB x += xs(dir) : y += ys(dir) goto *labelA *labelB ;es_timer time3 color ar, ag, ab repeat wi await waitc i = cnt x = walk(i, 0) : y = walk(i, 1) bx = block * x : by = block * y if i = 0 : boxf bx + wallw, by + wallw, bx + wallw + roadw, by + wallw + roadw : continue bi = i - 1 if y < walk(bi, 1) { boxf bx + wallw, by + wallw, bx + wallw + roadw, by + wallw + roadw + (wallw * 2) } if x > walk(bi, 0) { boxf bx - wallw, by + wallw, bx + wallw + roadw, by + wallw + roadw } if y > walk(bi, 1) { boxf bx + wallw, by - wallw, bx + wallw + roadw, by + wallw + roadw } if x < walk(bi, 0) { boxf bx + wallw, by + wallw, bx + wallw + roadw + (wallw * 2), by + wallw + roadw } loop ;================================================================================================== ; ▼一定時間待って、最初に戻す処理 ;================================================================================================== ;title "迷路描画時間 " + str(time2 - time1) + "ms 迷路解析時間 " + str(time3 - time2) + "ms" await 1000 goto *start