DECLARE SUB Auto () DECLARE SUB showsense () DECLARE SUB rot (ii%) DECLARE FUNCTION sense% (i%) DECLARE SUB advance (i%) DECLARE SUB Driveit () DECLARE SUB getname () DECLARE SUB blob (i%, j%) DECLARE SUB showmaze () DECLARE SUB Buildmaze () DECLARE SUB Readmaze () DECLARE SUB tile (i%, j%) DEFINT I-N DIM SHARED maze(17, 17) DIM SHARED mazename AS STRING SCREEN 12 WINDOW (-5, -2)-(23, 20) DIM SHARED theta, ss, cc, sb, cb, xb, yb, dd theta = 3.1416 / 40 dd = .02 ss = SIN(theta) cc = COS(theta) sb = 1 cb = 0 xb = 1.5 yb = 1.5 DIM SHARED xs(2), ys(2) FOR i = 0 TO 2 READ xs(i), ys(i) NEXT DATA 0,.5, -.51,.4, .51,.4 DIM SHARED cu$, cd$, cb$, cf$, cr$ cu$ = CHR$(0) + "H" cb$ = CHR$(0) + "K" cd$ = CHR$(0) + "P" cf$ = CHR$(0) + "M" cr$ = CHR$(13) CLS DO LOCATE 1, 1 PRINT "Build, Read maze from disk, Drive bilby, Auto, Quit " a$ = INPUT$(1) SELECT CASE a$ CASE "b", "B" Buildmaze ' EXIT DO CASE "r", "R" Readmaze showmaze ' EXIT DO CASE "d", "D" CLS Driveit CASE "q", "Q" EXIT DO CASE "a", "A" CLS Auto END SELECT LOOP showmaze 'Buildmaze SUB advance (i) xb = xb + dd * cb * i yb = yb + dd * sb * i END SUB SUB Auto DIM edge AS INTEGER, f edge = 0 CLS PRINT "You should write your own strategy here!" PRINT "Press b to run blind. Press to stop." a$ = INPUT$(1) IF a$ <> "b" THEN showmaze DO advance 1 showsense IF sense(0) = 0 THEN IF (edge AND 1) THEN FOR i = 1 TO 20 rot 1 showsense NEXT ELSE FOR i = 1 TO 20 rot -1 showsense NEXT END IF edge = 0 ELSE IF sense(1) = 0 THEN edge = edge OR 1 rot 1 ELSEIF sense(2) = 0 THEN edge = edge OR 2 rot -1 END IF END IF LOOP UNTIL INKEY$ = " " END SUB SUB blob (i, j) LINE (i + .25, j + .25)-STEP(.5, .5), 12, BF END SUB SUB Buildmaze CLS PRINT "Cursor to move, to toggle, to finish" showmaze i = 1 j = 1 blob 1, j DO a$ = INKEY$ IF a$ <> "" THEN tile i, j SELECT CASE a$ CASE cu$ j = j - (j < 16) CASE cd$ j = j + (j > 1) CASE cb$ i = i + (i > 1) CASE cf$ i = i - (i < 16) CASE " " maze(i, j) = 1 - maze(i, j) END SELECT tile i, j blob i, j END IF LOOP UNTIL a$ = cr$ LOCATE 28, 1 PRINT "Save, No save (s/n)"; a$ = INPUT$(1) LOCATE 28, 1 PRINT " "; IF a$ = "n" THEN EXIT SUB getname OPEN mazename FOR OUTPUT AS 1 FOR j = 16 TO 1 STEP -1 FOR i = 1 TO 16 PRINT #1, MID$("X ", maze(i, j) + 1, 1); NEXT PRINT #1, NEXT CLOSE 1 END SUB SUB Driveit PRINT "Press b to run blind. Press to stop." a$ = INPUT$(1) IF a$ <> "b" THEN showmaze DO a$ = INKEY$ IF a$ <> "" THEN SELECT CASE a$ CASE cu$ advance 1 CASE cd$ advance -1 CASE cb$ rot -1 CASE cf$ rot 1 END SELECT showsense END IF LOOP UNTIL a$ = " " END SUB SUB getname DO CLS SHELL "dir *.bil /p" PRINT "Present filename is: "; mazename INPUT "Filename (without .bil)(return if no change)"; a$ IF a$ <> "" THEN IF INSTR(a$, ".") + INSTR(a$, " ") = 0 THEN mazename = a$ + ".bil" END IF END IF LOOP UNTIL mazename <> "" END SUB SUB Readmaze getname OPEN mazename FOR INPUT AS 1 FOR j = 16 TO 1 STEP -1 LINE INPUT #1, a$ FOR i = 1 TO 16 IF MID$(a$, i, 1) = "X" THEN maze(i, j) = 0 ELSE maze(i, j) = 1 NEXT NEXT CLOSE 1 CLS END SUB SUB rot (ii) ssr = ss * ii cbn = cb * cc + sb * ssr sb = sb * cc - cb * ssr cb = cbn FOR i = 0 TO 2 xs = xs(i) * cc + ys(i) * ssr ys(i) = ys(i) * cc - xs(i) * ssr xs(i) = xs NEXT END SUB FUNCTION sense% (i) sense = maze(INT(xb + xs(i)), INT(yb + ys(i))) END FUNCTION SUB showmaze FOR i = 1 TO 16 FOR j = 1 TO 16 tile i, j NEXT NEXT END SUB SUB showsense FOR i = 0 TO 2 PSET (xb + xs(i), yb + ys(i)), 2 * sense(i) + 10 NEXT END SUB SUB tile (i, j) LINE (i, j)-STEP(1, 1), maze(i, j) * 15, BF LINE (i, j)-STEP(1, 1), 9, B END SUB