home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 058.lha / A-Maze < prev    next >
Encoding:
Text File  |  1986-11-20  |  5.3 KB  |  306 lines

  1. '  Amiga Maze
  2. '  By: DM Brown
  3. '  Date: 21 April 1987
  4.  
  5. CLEAR ,45000&
  6. DEFINT a-z
  7.  
  8. MAXSIZE&=150000&  ' maximum maze array size
  9. level=2           ' initial level
  10. delay=5           ' delay for level 3 map display
  11. scrlen=16         ' screen length for help display
  12. penalty=20        ' penalty points
  13.  
  14. FOR i=1 TO 3
  15.   READ mname$,nitems
  16.   MENU i,0,1,mname$
  17.   FOR j=1 TO nitems
  18.     READ mname$
  19.     MENU i,j,1,mname$
  20.   NEXT j,i
  21. DATA main,2,Restart,Quit
  22. DATA Help,2,Help,Map
  23. DATA Levels,3,"   1 Continuous Map","   2 Temporary Map","   3 Timed Map"
  24. MENU 2,2,0
  25. MENU 3,level,2
  26. MENU 4,0,0,""
  27. ON MENU GOSUB rdmenu
  28. MENU ON
  29.     
  30. SCREEN 1,640,200,2,2
  31. WINDOW 2,,(95,20)-(565,112),16,1
  32. LOCATE 3,12:PRINT "Welcome to:";
  33. LOCATE 6,23:COLOR 3,0:PRINT "Amiga Maze";:COLOR 1,0
  34. LOCATE 9,12:PRINT "By DM Brown"
  35. LOCATE 12,5
  36. PRINT "-- press any key to continue --";
  37. wt$=""
  38. WHILE wt$=""
  39.   wt$=INKEY$
  40. WEND
  41.  
  42. MENU 2,2,1
  43. WINDOW 2,,(95,20)-(315,112),16,1
  44. WINDOW 3,,(325,20)-(565,180),16,1
  45. WINDOW 5,,(95,142)-(225,156),16,1
  46. COLOR 0,1:PRINT "Score:           ":COLOR 1,0
  47. WINDOW 4,,(175,15)-(465,22),0,1
  48. start:
  49. INPUT " Enter horizontal dimension: ", x
  50. INPUT " Enter vertical dimension:   ", y
  51. IF x=0 THEN GOTO f
  52. IF (x MOD 2) THEN x=x+1
  53. IF (y MOD 2) THEN y=y+1
  54. IF ((x*y) > MAXSIZE&) OR (x<6) OR (y<6) THEN PRINT " Dimensions out of range.":GOTO start
  55.  
  56. CLS:PRINT "            Setting up"
  57. DIM a(x,y)
  58.  
  59. FOR i=0 TO x:a(i,0)=-1:a(i,y)=-1:NEXT i
  60. FOR i=1 TO y-1:a(0,i)=-1:a(x,i)=-1:NEXT i
  61.  
  62. d(1,1)=1:d(1,2)=0    'East
  63. d(2,1)=0:d(2,2)=1    'South
  64. d(3,1)=-1:d(3,2)=0    'West
  65. d(4,1)=0:d(4,2)=-1    'North
  66.  
  67. cx=2:cy=2
  68. a(cx,cy)=5
  69. setend&=2*(x-2)*(y-2)/12
  70. count&=0
  71. fini=0
  72. RANDOMIZE TIMER
  73.  
  74. WHILE NOT fini
  75.   dir=INT(RND*4)+1
  76.   i=0:fail=-1
  77.   WHILE i<4
  78.     i=i+1
  79.     cnx=cx+2*d(dir,1):cny=cy+2*d(dir,2)
  80.     IF a(cnx,cny) THEN
  81.       dir=dir+1:IF dir > 4 THEN dir=1
  82.     ELSE
  83.       i=4:fail=0
  84.       a(cnx,cny)=dir
  85.       count&=count&+1
  86.       a(cx+d(dir,1),cy+d(dir,2))=-1
  87.       cx=cnx:cy=cny
  88.     END IF
  89.   WEND
  90.     
  91.   IF fail THEN
  92.     dir=a(cx,cy)
  93.     IF (NOT endset) AND (count& >= setend&) THEN
  94.       endset=-1
  95.       a(cx,cy)=6
  96.     ELSE
  97.       a(cx,cy)=-1
  98.     END IF
  99.     IF dir=5 THEN fini=-1
  100.     cx=cx-2*d(dir,1):cy=cy-2*d(dir,2)
  101.   END IF  
  102. WEND
  103.  
  104. WINDOW CLOSE 4
  105.  
  106. cx=2:cy=2
  107. WINDOW 2,,(95,20)-(315,112),16,1
  108. GOSUB show
  109.  
  110. found = 0
  111. WHILE NOT found
  112.   in$=""
  113.   WHILE in$=""
  114.     in$=INKEY$
  115.   WEND
  116.   IF in$=CHR$(28) THEN IF a(cx,cy-1) THEN cy=cy-1:score=score+1
  117.   IF in$=CHR$(29) THEN IF a(cx,cy+1) THEN cy=cy+1:score=score+1
  118.   IF in$=CHR$(31) THEN IF a(cx-1,cy) THEN cx=cx-1:score=score+1
  119.   IF in$=CHR$(30) THEN IF a(cx+1,cy) THEN cx=cx+1:score=score+1
  120.   GOSUB show
  121.   GOSUB showscore
  122.   IF a(cx,cy)=6 THEN found=-1
  123. WEND
  124.  
  125. WINDOW 6,,(95,142)-(565,180),0,1
  126. LOCATE 2,21:PRINT "Congratulations!"
  127. LOCATE 4,12:PRINT "You found the end in";score;"moves."
  128. WHILE 1:WEND
  129.  
  130. f:
  131. SCREEN CLOSE 1
  132. MENU RESET
  133. SYSTEM
  134. END
  135.  
  136. showlarge:
  137. WINDOW OUTPUT 3
  138. CLS
  139. px=15:py=11
  140. tx=12:ty=10
  141. IF (cx-tx) < 0 THEN tx=cx
  142. IF (cy-ty) < 0 THEN ty=cy
  143. FOR j = -ty TO 10
  144.   IF (cy+j) <= y THEN
  145.     LOCATE py+j,px-tx
  146.     FOR i=-tx TO 12
  147.       IF (cx+i) <= x THEN
  148.         IF a(cx+i,cy+j) THEN COLOR 1,0 ELSE COLOR 0,1
  149.         IF a(cx+i,cy+j)=6 THEN COLOR 0,2
  150.         PRINT " ";
  151.       END IF
  152.     NEXT i
  153.   END IF
  154. NEXT j
  155. COLOR 0,3
  156. LOCATE 11,15
  157. PRINT " ";
  158. COLOR 1,0
  159. WINDOW OUTPUT 2
  160. RETURN
  161.  
  162. show:
  163. WINDOW 2
  164. CLS
  165. px=14:py=7
  166. IF a(cx,cy-1) THEN
  167.   FOR i=2 TO 6
  168.     IF a(cx,cy-i) THEN
  169.       LOCATE py-i,px-1
  170.       FOR j=-1 TO 1
  171.         IF a(cx+j,cy-i) THEN COLOR 0,1 ELSE COLOR 1,0
  172.         IF a(cx+j,cy-i)=6 THEN COLOR 0,2
  173.         PRINT " ";
  174.       NEXT j
  175.       COLOR 1,0
  176.     ELSE
  177.       i=6
  178.     END IF
  179.   NEXT i
  180. END IF
  181. xmin=1:xmax=1
  182. FOR i=1 TO 6
  183.   IF a(cx-i,cy) THEN xmin=i ELSE i=6
  184. NEXT i
  185. FOR i=1 TO 6
  186.   IF a(cx+i,cy) THEN xmax=i ELSE i=6
  187. NEXT i
  188. FOR i=-1 TO 1
  189.   LOCATE py+i,px-xmin
  190.   FOR j=-xmin TO xmax
  191.     IF a(cx+j,cy+i) THEN COLOR 0,1 ELSE COLOR 1,0
  192.     IF a(cx+j,cy+i)=6 THEN COLOR 0,2
  193.     PRINT " ";
  194.   NEXT j
  195.   COLOR 1,0
  196. NEXT i
  197. IF a(cx,cy+1) THEN
  198.   FOR i=2 TO 6
  199.     IF a(cx,cy+i) THEN
  200.       LOCATE py+i,px-1
  201.       FOR j=-1 TO 1
  202.         IF a(cx+j,cy+i) THEN COLOR 0,1 ELSE COLOR 1,0
  203.         IF a(cx+j,cy+i)=6 THEN COLOR 0,2
  204.         PRINT " ";
  205.       NEXT j
  206.       COLOR 1,0
  207.     ELSE
  208.       i=6
  209.     END IF
  210.   NEXT i
  211. END IF
  212. COLOR 0,3
  213. LOCATE py,px
  214. PRINT " ";
  215. COLOR 1,0
  216. RETURN
  217.  
  218. showscore:
  219. WINDOW OUTPUT 5
  220. LOCATE 3,7
  221. PRINT score;
  222. WINDOW OUTPUT 2
  223. RETURN
  224.  
  225. rdmenu:
  226. nmenu=MENU(0)
  227. smenu=MENU(1)
  228. ON nmenu GOSUB mmain, mhelp, mlevel
  229. RETURN
  230.  
  231. mmain:
  232. IF smenu=1 THEN RUN ELSE GOTO f
  233.  
  234. mhelp:
  235. IF smenu=1 THEN
  236.   WINDOW 7,,(0,20)-(620,150),0,1
  237.   ON ERROR GOTO dskerr
  238.   OPEN "Maze.hlp" FOR INPUT AS 1
  239.   i=0
  240.   WHILE NOT EOF(1)
  241.     LINE INPUT #1,in$
  242.     PRINT in$
  243.     i=i+1
  244.     IF i=scrlen THEN
  245.       i=0
  246.       CALL pause
  247.       CLS
  248.     END IF
  249.   WEND
  250.   pause
  251. endhlp:
  252.   CLOSE 1
  253.   WINDOW CLOSE 7
  254. ELSE
  255.   GOSUB showlarge
  256.   score=score+penalty
  257.   GOSUB showscore
  258.   IF level = 2 THEN
  259.     in$=""
  260.     WHILE in$=""
  261.       in$=INKEY$
  262.     WEND
  263.   ELSEIF level = 3 THEN
  264.     dl&=INT(TIMER)
  265.     WHILE (TIMER < dl&+delay):WEND
  266.   END IF
  267.   IF level <> 1 THEN
  268.     WINDOW OUTPUT 3
  269.     CLS
  270.     WINDOW OUTPUT 2
  271.   END IF
  272. END IF
  273. RETURN
  274.  
  275. mlevel:
  276. MENU 3,level,1
  277. level=smenu
  278. IF level <> 1 THEN
  279.   WINDOW OUTPUT 3
  280.   CLS
  281.   WINDOW OUTPUT 2
  282. END IF
  283. MENU 3,level,2
  284. RETURN
  285.  
  286. dskerr:
  287. WINDOW 7
  288. LOCATE 8,23
  289. IF ERR = 53 THEN
  290.   PRINT "The file Maze.hlp was not found"
  291. ELSE
  292.   PRINT "A disk error has occurred."
  293. END IF
  294. pause
  295. RESUME endhlp
  296.  
  297. SUB pause STATIC
  298. LOCATE 17,5
  299. PRINT "-- press any key to continue --";
  300. in$=""
  301. WHILE in$=""
  302.   in$=INKEY$
  303. WEND
  304. END SUB
  305.  
  306.