#/*********************************************************** # maze.rb -- 迷路 #***********************************************************/ XMAX = 80 YMAX = 24 MAXSITE = (XMAX * YMAX / 4) # 最大サイト数 row = Array.new(YMAX+1).fill(0) map = []; (XMAX+1).times { map.push(row.dup) } $nsite = 0 $xx = [] $yy = [] $dx = [2, 0, -2, 0] $dy = [0, 2, 0, -2] dirtable = [ [0,1,2,3], [0,1,3,2], [0,2,1,3], [0,2,3,1], [0,3,1,2], [0,3,2,1], [1,0,2,3], [1,0,3,2], [1,2,0,3], [1,2,3,0], [1,3,0,2], [1,3,2,0], [2,0,1,3], [2,0,3,1], [2,1,0,3], [2,1,3,0], [2,3,0,1], [2,3,1,0], [3,0,1,2], [3,0,2,1], [3,1,0,2], [3,1,2,0], [3,2,0,1], [3,2,1,0] ] def add(i, j) # サイトに加える $xx[$nsite] = i; $yy[$nsite] = j; $nsite += 1 end def select # サイトを乱数で選ぶ if ($nsite == 0); return 0, 0, 0; end # サイトが尽きた $nsite -= 1; r = ($nsite * rand()).to_i i = $xx[r]; $xx[r] = $xx[$nsite] j = $yy[r]; $yy[r] = $yy[$nsite] return 1, i, j # 成功 end srand(Time.new.to_i); # 時刻で乱数を初期化 for i in 0..XMAX for j in 0..YMAX; map[i][j] = 1; end end for i in 3..(XMAX-3) for j in 3..(YMAX-3); map[i][j] = 0; end end map[2][3] = 0; map[XMAX - 2][YMAX - 3] = 0 4.step(XMAX-4, 2) do |i| add(i, 2); add(i, YMAX - 2) end 4.step((YMAX - 4), 2) do |j| add(2, j); add(XMAX - 2, j) end while (((flag, i, j = select()) != []) && flag == 1) # サイトを選ぶ while (true) # そこから延ばしていく tt = dirtable[(24 * rand()).to_i] d = 3; while(d >= 0) t = tt[d]; i1 = i + $dx[t]; j1 = j + $dy[t] if (map[i1][j1] == 0); break; end d -= 1 end if (d < 0); break; end map[(i + i1) / 2][(j + j1) / 2] = 1 i = i1; j = j1; map[i][j] = 1; add(i, j) end end for j in 2..(YMAX-2) for i in 2..(XMAX-2) if (map[i][j] == 1); putc(?X); else; putc(?\s); end end putc(?\n) end exit 0