Maze generation: Difference between revisions
Content added Content deleted
Line 1,786: | Line 1,786: | ||
=={{header|Commodore BASIC}}== |
=={{header|Commodore BASIC}}== |
||
Written in Commodore BASIC V2 and tested on Commodore 64 and Commodore 128 hardware. (It will also run on the unexpanded Commodore VIC-20 if you reduce the maze size to 8x8.) Due to stack size limitations in the operating systems, this example eschews recursive subroutine calls and it implements its own stack for variables. Recursion is accomplished, after a fashion, with branching within the main "build" routine. |
|||
<lang BASIC> |
|||
⚫ | |||
<lang BASIC>100 MS=10:REM MAZE SIZE |
|||
110 DIM S(MS+1,MS+1):REM SOUTH WALLS |
|||
120 DIM W(MS+1,MS+1):REM WEST WALLS |
|||
130 DIM V(MS+1,MS+1):REM VISITED CELLS |
|||
140 PRINT "INITIALIZING..." |
|||
150 GOSUB 260:REM INITIALIZE MAZE |
|||
160 PRINT "BUILDING..." |
|||
170 DIM PC(MS*MS+1):DIM PR(MS*MS+1):REM STACK |
|||
180 REM PICK RANDOM STARTING CELL |
|||
190 X = RND(-TI) |
|||
200 C=(INT(RND(1)*MS)+1) |
|||
210 R=(INT(RND(1)*MS)+1) |
|||
220 GOSUB 400:REM BUILD MAZE |
|||
230 GOSUB 540:REM DRAW MAZE |
|||
240 END |
|||
250 REM -----INITIALIZE MAZE----- |
|||
260 REM SET WALLS ON AND VISITED CELLS OFF |
|||
270 T=MS+1 |
|||
280 FOR C=0 TO T:FOR R=0 TO T: |
|||
290 S(C,R)=1:W(C,R)=1:V(C,R)=0 |
|||
300 NEXT R:NEXT C |
|||
310 REM SET BORDER CELLS TO VISITED |
|||
320 FOR C=0 TO T |
|||
330 V(C,0)=1:V(C,T)=1 |
|||
340 NEXT C |
|||
350 FOR R=0 TO T |
|||
360 V(0,R)=1:V(T,R)=1 |
|||
370 NEXT R |
|||
380 RETURN |
|||
390 REM -----BUILD MAZE----- |
|||
400 U=U+1:PC(U)=C:PR(U)=R:REM PUSH |
|||
410 V(C,R)=1 |
|||
420 IF V(C,R+1)=1 AND V(C+1,R)=1 AND V(C,R-1)=1 AND V(C-1,R)=1 THEN GOTO 5 |
|||
00 |
|||
430 Z=INT(RND(1)*4) |
|||
440 IF Z=0 AND V(C,R+1)=0 THEN S(C,R)=0:R=R+1:GOTO 400 |
|||
450 IF Z=1 AND V(C+1,R)=0 THEN W(C+1,R)=0:C=C+1:GOTO 400 |
|||
460 IF Z=2 AND V(C,R-1)=0 THEN S(C,R-1)=0:R=R-1:GOTO 400 |
|||
470 IF Z=3 AND V(C-1,R)=0 THEN W(C,R)=0:C=C-1:GOTO 400 |
|||
480 GOTO 430 |
|||
490 GOTO 420 |
|||
500 C=PC(U):R=PR(U):U=U-1:REM POP |
|||
510 IF U > 0 THEN GOTO 420 |
|||
520 RETURN |
|||
530 REM -----DRAW MAZE----- |
|||
540 REM OPEN 4,4:CMD 4:REM SEND OUTPUT TO PRINTER |
|||
550 PRINT "+--+--+--+--+--+--+--+--+--+--+" |
|||
560 FOR R = 1 TO MS |
|||
570 FOR C = 1 TO MS+1 |
|||
580 IF W(C,R)=0 THEN PRINT " "; |
|||
590 IF W(C,R)=1 THEN PRINT ": "; |
|||
600 NEXT C |
|||
610 PRINT |
|||
620 FOR C = 1 TO MS |
|||
630 IF S(C,R)=0 THEN PRINT "+ "; |
|||
640 IF S(C,R)=1 THEN PRINT "+--"; |
|||
650 NEXT C |
|||
660 PRINT "+" |
|||
670 NEXT R |
|||
680 REM PRINT#4:CLOSE 4:REM CLOSE PRINTER DEVICE |
|||
⚫ | |||
{{out|Output example (for 10x10 maze)}} |
|||
<pre>+--+--+--+--+--+--+--+--+--+--+ |
|||
: : : : |
|||
+ + + + +--+ +--+--+--+ + |
|||
: : : : : : : |
|||
+ + + +--+ +--+ + + +--+ |
|||
: : : : : : : : |
|||
+ +--+--+ + + +--+ +--+ + |
|||
: : : : : : : |
|||
+--+ + +--+--+ + +--+--+ + |
|||
: : : : : : : |
|||
+ + + + +--+--+ + +--+--+ |
|||
: : : : : : : |
|||
+ +--+ +--+--+ + + + + + |
|||
: : : : : : : |
|||
+ +--+ + +--+--+ +--+--+ + |
|||
: : : : : : : |
|||
+ + +--+ + +--+--+--+ + + |
|||
: : : : : : : : |
|||
+ +--+ + + + + +--+ + + |
|||
: : : : : |
|||
+--+--+--+--+--+--+--+--+--+--+</pre> |
|||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |