Files
basic-computer-games/00_Alternate_Languages/02_Amazing/MiniScript/amazing.ms

109 lines
2.8 KiB
Plaintext

import "listUtil"
print " "*28 + "Amazing Program"
print " "*15 + "Creative Computing Morristown, New Jersey"
print; print; print; print
while true
inp = input("What and your width and length? ")
inp = inp.replace(",", " ")
fields = inp.split
h = fields[0].val; v = fields[-1].val
if h > 1 and v > 1 then break
print "Meaningless dimensions. Try again."
end while
// order: keeps track of the order in which each cell was
// visited as we built the maze. 0 means not explored yet. Indexed in [column][row] order.
// (This is W in the original BASIC program.)
order = list.init2d(h,v, 0)
// walls: keeps track of the walls below and to the right of each cell:
// 0: walls below and to the right
// 1: wall to the right
// 2: wall below
// 3: neither wall
// (This is V in the original BASIC program.)
// Note that a wall to the right can be removed from a
// valid entry by adding 2; a wall below can be removed
// by adding 1.
walls = list.init2d(h,v, 0)
print
print
print
print
// pick an exit at the top of the maze,
// and print the maze top
x = floor(rnd * h)
for i in range(0, h-1)
if i == x then print ". ","" else print ".--",""
end for
print "."
// walk from our starting position (by the exit) around
// the maze, clearing a wall on each step
c = 1 // current step number
order[x][0] = c; c += 1
r = x; s = 0 // [r][s] is our current position in the maze
while true
// collect the set of directions we can move in
dirs = []
if r > 0 and order[r-1][s] == 0 then dirs.push "left"
if s > 0 and order[r][s-1] == 0 then dirs.push "up"
if r+1 < h and order[r+1][s] == 0 then dirs.push "right"
if s+1 < v and order[r][s+1] == 0 then dirs.push "down"
if not dirs then
//print "Uh-oh, I'm stuck at " + r + "," + s
// couldn't find any directions for this cell;
// find the next already-explored cell
while true
r += 1
if r >= h then
r = 0
s += 1
if s >= v then s = 0
end if
if order[r][s] != 0 then break
end while
continue
end if
// pick a random available direction; move there,
// clearing the wall in between and updating order
d = dirs.any
if d == "left" then
walls[r-1][s] += 2
r = r-1
else if d == "up" then
walls[r][s-1] += 1
s = s-1
else if d == "right" then
walls[r][s] += 2
r = r+1
else if d == "down" then
walls[r][s] += 1
s = s+1
end if
//print "At step " + c + ", at " + r + "," + s
order[r][s] = c
c += 1
if c > h*v then break
end while
// pick an exit at the bottom of the maze
x = floor(rnd * h)
walls[x][v-1] += 1
// print the (rest of the) maze
for j in range(0, v-1)
print "I", ""
for i in range(0, h-1)
if walls[i][j] < 2 then print " I", "" else print " ", ""
end for
print
for i in range(0, h-1)
if walls[i][j] % 2 == 0 then print ":--", "" else print ": ", ""
end for
print "."
end for