home *** CD-ROM | disk | FTP | other *** search
- ' Amiga Maze
- ' By: DM Brown
- ' Date: 21 April 1987
-
- CLEAR ,45000&
- DEFINT a-z
-
- MAXSIZE&=150000& ' maximum maze array size
- level=2 ' initial level
- delay=5 ' delay for level 3 map display
- scrlen=16 ' screen length for help display
- penalty=20 ' penalty points
-
- FOR i=1 TO 3
- READ mname$,nitems
- MENU i,0,1,mname$
- FOR j=1 TO nitems
- READ mname$
- MENU i,j,1,mname$
- NEXT j,i
- DATA main,2,Restart,Quit
- DATA Help,2,Help,Map
- DATA Levels,3," 1 Continuous Map"," 2 Temporary Map"," 3 Timed Map"
- MENU 2,2,0
- MENU 3,level,2
- MENU 4,0,0,""
- ON MENU GOSUB rdmenu
- MENU ON
-
- SCREEN 1,640,200,2,2
- WINDOW 2,,(95,20)-(565,112),16,1
- LOCATE 3,12:PRINT "Welcome to:";
- LOCATE 6,23:COLOR 3,0:PRINT "Amiga Maze";:COLOR 1,0
- LOCATE 9,12:PRINT "By DM Brown"
- LOCATE 12,5
- PRINT "-- press any key to continue --";
- wt$=""
- WHILE wt$=""
- wt$=INKEY$
- WEND
-
- MENU 2,2,1
- WINDOW 2,,(95,20)-(315,112),16,1
- WINDOW 3,,(325,20)-(565,180),16,1
- WINDOW 5,,(95,142)-(225,156),16,1
- COLOR 0,1:PRINT "Score: ":COLOR 1,0
- WINDOW 4,,(175,15)-(465,22),0,1
- start:
- INPUT " Enter horizontal dimension: ", x
- INPUT " Enter vertical dimension: ", y
- IF x=0 THEN GOTO f
- IF (x MOD 2) THEN x=x+1
- IF (y MOD 2) THEN y=y+1
- IF ((x*y) > MAXSIZE&) OR (x<6) OR (y<6) THEN PRINT " Dimensions out of range.":GOTO start
-
- CLS:PRINT " Setting up"
- DIM a(x,y)
-
- FOR i=0 TO x:a(i,0)=-1:a(i,y)=-1:NEXT i
- FOR i=1 TO y-1:a(0,i)=-1:a(x,i)=-1:NEXT i
-
- d(1,1)=1:d(1,2)=0 'East
- d(2,1)=0:d(2,2)=1 'South
- d(3,1)=-1:d(3,2)=0 'West
- d(4,1)=0:d(4,2)=-1 'North
-
- cx=2:cy=2
- a(cx,cy)=5
- setend&=2*(x-2)*(y-2)/12
- count&=0
- fini=0
- RANDOMIZE TIMER
-
- WHILE NOT fini
- dir=INT(RND*4)+1
- i=0:fail=-1
- WHILE i<4
- i=i+1
- cnx=cx+2*d(dir,1):cny=cy+2*d(dir,2)
- IF a(cnx,cny) THEN
- dir=dir+1:IF dir > 4 THEN dir=1
- ELSE
- i=4:fail=0
- a(cnx,cny)=dir
- count&=count&+1
- a(cx+d(dir,1),cy+d(dir,2))=-1
- cx=cnx:cy=cny
- END IF
- WEND
-
- IF fail THEN
- dir=a(cx,cy)
- IF (NOT endset) AND (count& >= setend&) THEN
- endset=-1
- a(cx,cy)=6
- ELSE
- a(cx,cy)=-1
- END IF
- IF dir=5 THEN fini=-1
- cx=cx-2*d(dir,1):cy=cy-2*d(dir,2)
- END IF
- WEND
-
- WINDOW CLOSE 4
-
- cx=2:cy=2
- WINDOW 2,,(95,20)-(315,112),16,1
- GOSUB show
-
- found = 0
- WHILE NOT found
- in$=""
- WHILE in$=""
- in$=INKEY$
- WEND
- IF in$=CHR$(28) THEN IF a(cx,cy-1) THEN cy=cy-1:score=score+1
- IF in$=CHR$(29) THEN IF a(cx,cy+1) THEN cy=cy+1:score=score+1
- IF in$=CHR$(31) THEN IF a(cx-1,cy) THEN cx=cx-1:score=score+1
- IF in$=CHR$(30) THEN IF a(cx+1,cy) THEN cx=cx+1:score=score+1
- GOSUB show
- GOSUB showscore
- IF a(cx,cy)=6 THEN found=-1
- WEND
-
- WINDOW 6,,(95,142)-(565,180),0,1
- LOCATE 2,21:PRINT "Congratulations!"
- LOCATE 4,12:PRINT "You found the end in";score;"moves."
- WHILE 1:WEND
-
- f:
- SCREEN CLOSE 1
- MENU RESET
- SYSTEM
- END
-
- showlarge:
- WINDOW OUTPUT 3
- CLS
- px=15:py=11
- tx=12:ty=10
- IF (cx-tx) < 0 THEN tx=cx
- IF (cy-ty) < 0 THEN ty=cy
- FOR j = -ty TO 10
- IF (cy+j) <= y THEN
- LOCATE py+j,px-tx
- FOR i=-tx TO 12
- IF (cx+i) <= x THEN
- IF a(cx+i,cy+j) THEN COLOR 1,0 ELSE COLOR 0,1
- IF a(cx+i,cy+j)=6 THEN COLOR 0,2
- PRINT " ";
- END IF
- NEXT i
- END IF
- NEXT j
- COLOR 0,3
- LOCATE 11,15
- PRINT " ";
- COLOR 1,0
- WINDOW OUTPUT 2
- RETURN
-
- show:
- WINDOW 2
- CLS
- px=14:py=7
- IF a(cx,cy-1) THEN
- FOR i=2 TO 6
- IF a(cx,cy-i) THEN
- LOCATE py-i,px-1
- FOR j=-1 TO 1
- IF a(cx+j,cy-i) THEN COLOR 0,1 ELSE COLOR 1,0
- IF a(cx+j,cy-i)=6 THEN COLOR 0,2
- PRINT " ";
- NEXT j
- COLOR 1,0
- ELSE
- i=6
- END IF
- NEXT i
- END IF
- xmin=1:xmax=1
- FOR i=1 TO 6
- IF a(cx-i,cy) THEN xmin=i ELSE i=6
- NEXT i
- FOR i=1 TO 6
- IF a(cx+i,cy) THEN xmax=i ELSE i=6
- NEXT i
- FOR i=-1 TO 1
- LOCATE py+i,px-xmin
- FOR j=-xmin TO xmax
- IF a(cx+j,cy+i) THEN COLOR 0,1 ELSE COLOR 1,0
- IF a(cx+j,cy+i)=6 THEN COLOR 0,2
- PRINT " ";
- NEXT j
- COLOR 1,0
- NEXT i
- IF a(cx,cy+1) THEN
- FOR i=2 TO 6
- IF a(cx,cy+i) THEN
- LOCATE py+i,px-1
- FOR j=-1 TO 1
- IF a(cx+j,cy+i) THEN COLOR 0,1 ELSE COLOR 1,0
- IF a(cx+j,cy+i)=6 THEN COLOR 0,2
- PRINT " ";
- NEXT j
- COLOR 1,0
- ELSE
- i=6
- END IF
- NEXT i
- END IF
- COLOR 0,3
- LOCATE py,px
- PRINT " ";
- COLOR 1,0
- RETURN
-
- showscore:
- WINDOW OUTPUT 5
- LOCATE 3,7
- PRINT score;
- WINDOW OUTPUT 2
- RETURN
-
- rdmenu:
- nmenu=MENU(0)
- smenu=MENU(1)
- ON nmenu GOSUB mmain, mhelp, mlevel
- RETURN
-
- mmain:
- IF smenu=1 THEN RUN ELSE GOTO f
-
- mhelp:
- IF smenu=1 THEN
- WINDOW 7,,(0,20)-(620,150),0,1
- ON ERROR GOTO dskerr
- OPEN "Maze.hlp" FOR INPUT AS 1
- i=0
- WHILE NOT EOF(1)
- LINE INPUT #1,in$
- PRINT in$
- i=i+1
- IF i=scrlen THEN
- i=0
- CALL pause
- CLS
- END IF
- WEND
- pause
- endhlp:
- CLOSE 1
- WINDOW CLOSE 7
- ELSE
- GOSUB showlarge
- score=score+penalty
- GOSUB showscore
- IF level = 2 THEN
- in$=""
- WHILE in$=""
- in$=INKEY$
- WEND
- ELSEIF level = 3 THEN
- dl&=INT(TIMER)
- WHILE (TIMER < dl&+delay):WEND
- END IF
- IF level <> 1 THEN
- WINDOW OUTPUT 3
- CLS
- WINDOW OUTPUT 2
- END IF
- END IF
- RETURN
-
- mlevel:
- MENU 3,level,1
- level=smenu
- IF level <> 1 THEN
- WINDOW OUTPUT 3
- CLS
- WINDOW OUTPUT 2
- END IF
- MENU 3,level,2
- RETURN
-
- dskerr:
- WINDOW 7
- LOCATE 8,23
- IF ERR = 53 THEN
- PRINT "The file Maze.hlp was not found"
- ELSE
- PRINT "A disk error has occurred."
- END IF
- pause
- RESUME endhlp
-
- SUB pause STATIC
- LOCATE 17,5
- PRINT "-- press any key to continue --";
- in$=""
- WHILE in$=""
- in$=INKEY$
- WEND
- END SUB
-
-