home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1986-08-10 | 6.0 KB | 194 lines |
- 10 ' F R O G . B A S 8/10/86 11:21 PM
- 20 '
- 30 ' HELP THE FROGGY generates random mazes for a child to solve
- 40 ' by guiding a frog to the lily pad at the end of the maze.
- 50 ' The size of the maze may be set to a 5x5, 6x6, or 7x7 maze by changing
- 60 ' the value for the variable SIZE in line 120 below.
- 70 '
- 80 ' Converted for IBM-PC Screen 1.
- 90 '
- 100 ' ** Algorithm for generic maze generator by Dan Rollins, 04/25/83
- 110 ' ** Rest of program by Rob Robinson 12/28/85
- 120 '
- 130 ' Initialize all variables.
- 140 '
- 150 DEFINT A-R,T-Z
- 160 SCREEN 1 : COLOR 1,0 : CLS
- 170 LOCATE 2,13 : PRINT "HELP THE FROGGY"
- 180 LOCATE 24,1 : PRINT " copyright 1985, Computing Specialties";
- 190 '
- 200 '
- 210 ' Poke subroutine ALOAD into memory.
- 220 '
- 230 DEF SEG : ALOAD!= 48000
- 240 FOR IB=0 TO 95 : READ BYTE : POKE ALOAD!+IB,BYTE : NEXT IB
- 250 DATA &H55, &H8B, &HEC, &H8B, &H5E, &H0A, &H8A, &H0F, &HB5, &H00, &H8B, &H77
- 260 DATA &H01, &H8B, &H5E, &H08, &H8B, &H07, &H8E, &HC0, &HBF, &H00, &H00, &HA4
- 270 DATA &HE2, &HFD, &HB0, &H00, &HAA, &H1E, &H06, &H1F, &H07, &HB0, &H00, &HB4
- 280 DATA &H3D, &HBA, &H00, &H00, &HCD, &H21, &H72, &H24, &H8B, &HD8, &HB9, &H07
- 290 DATA &H00, &HBA, &H00, &H00, &HB4, &H3F, &HCD, &H21, &H3B, &HC1, &H74, &H05
- 300 DATA &HB8, &H0D, &H00, &H75, &H0F, &HBE, &H05, &H00, &H8B, &H0C, &HB4, &H3F
- 310 DATA &HBA, &H00, &H00, &HCD, &H21, &HB8, &H00, &H00, &H8B, &H7E, &H06, &H26
- 320 DATA &H89, &H05, &HB4, &H3E, &HCD, &H21, &H06, &H1F, &H5D, &HCA, &H06, &H00
- 330 '
- 340 ' Load the title picture onto the screen.
- 350 '
- 360 SEG2%=&HB800 : BERR%=0 : FILE$="FROG1.PIC" : CALL ALOAD!(FILE$,SEG2%,BERR%)
- 370 SIZE=7
- 380 DIM T(5),MZ(100,100)
- 390 DIM YD(3),XD(3) : YD(0)=-1 : XD(1)=1 : YD(2)=1 : XD(3)=-1
- 400 DIM PWR2(3) : PWR2(0)=1 : PWR2(1)=2 : PWR2(2)=4 : PWR2(3)=8
- 410 RANDOMIZE TIMER
- 420 DIM FROGGY(250),PAD(250)
- 430 '
- 440 ' Load the title picture onto the screen and fill the graphics arrays.
- 450 '
- 460 LOCATE 25,7
- 470 GET (41,20)-(71,36),FROGGY
- 480 GET (236,150)-(285,165),PAD
- 490 '
- 500 ' Generate a random maze.
- 510 '
- 520 H=SIZE-1 : V=SIZE-1 : TH=H*30+3 : TV=V*20+30
- 530 X=INT(RND*H) : Y=INT(RND*V)
- 540 GOSUB 710
- 550 MZ(0,0)=MZ(0,0)+1
- 560 '
- 570 ' Display the maze on the screen.
- 580 '
- 590 GOSUB 940
- 600 '
- 610 ' Solve the maze.
- 620 '
- 630 GOSUB 1130
- 640 '
- 650 ' Go back for another maze.
- 660 '
- 670 GOTO 420
- 680 '
- 690 ' Subroutine to generate a randome maze.
- 700 '
- 710 FOR J=0 TO H : FOR K=0 TO V : MZ(J,K)=0 : NEXT : NEXT
- 720 LS=1
- 730 RC=0 : TR=(H+1)*(V+1)-1
- 740 Q=0 : IF RC=TR THEN RETURN
- 750 IF PLAY(0)<4 THEN GOSUB 1820
- 760 IF Y>0 THEN IF MZ(X,Y-1)=0 THEN Q=Q+1 : T(Q)=0
- 770 IF X<H THEN IF MZ(X+1,Y)=0 THEN Q=Q+1 : T(Q)=1
- 780 IF Y<V THEN IF MZ(X,Y+1)=0 THEN Q=Q+1 : T(Q)=2
- 790 IF X>0 THEN IF MZ(X-1,Y)=0 THEN Q=Q+1 : T(Q)=3
- 800 IF Q=0 GOTO 880
- 810 D=INT(RND*Q)+1 : DIR=T(D)
- 820 MZ(X,Y)=MZ(X,Y)+PWR2(DIR)
- 830 Y=Y+YD(DIR) : X=X+XD(DIR)
- 840 ND=DIR-2 : IF ND<0 THEN ND=4+ND
- 850 MZ(X,Y)=MZ(X,Y)+PWR2(ND)
- 860 RC=RC+1
- 870 GOTO 740
- 880 Y=Y+1 : IF Y>V THEN Y=0 : X=X+1 : IF X>H THEN X=0
- 890 IF MZ(X,Y)=0 THEN 880
- 900 GOTO 740
- 910 '
- 920 ' Subroutine to display the maze on the screen.
- 930 '
- 940 CLS : LOCATE 25,7
- 950 PRINT "H E L P T H E F R O G G Y";
- 960 DX=30 : DY=20 : PX=DX : PY=DY : CL=3
- 970 FOR Y=0 TO V
- 980 FOR X=0 TO H
- 990 IF INT(MZ(X,Y)/2)=MZ(X,Y)/2 THEN LINE (PX,PY)-(PX+DX,PY),CL : PX=PX+DX : GOTO 1010
- 1000 PX=PX+DX
- 1010 NEXT X : PX=DX
- 1020 FOR X=0 TO H
- 1030 IF MZ(X,Y)>7 THEN PX=PX+DX : GOTO 1050
- 1040 LINE(PX,PY)-(PX,PY+DY),CL : PX=PX+DX
- 1050 NEXT X : LINE(PX,PY)-(PX,PY+DY),CL : PX=DX : PY=PY+DY
- 1060 NEXT Y
- 1070 FOR X=0 TO H-1
- 1080 LINE (PX,PY)-(PX+DX,PY),CL : PX=PX+DX
- 1090 NEXT X
- 1100 RETURN
- 1110 '
- 1120 ' Subroutine to solve the maze.
- 1130 ' Set up variables for playing
- 1140 '
- 1150 PX=DX+1 : PY=DY+1 : MOVES=0
- 1160 BLANK=0 : RED=2 : BLUE=1
- 1170 NUL$=CHR$(0) : UP$=NUL$+CHR$(72) : DN$=NUL$+CHR$(80)
- 1180 RT$=NUL$+CHR$(77) : LT$=NUL$+CHR$(75) : STIME$=TIME$
- 1190 PUT (PX*(V+1)-8,PY*(V+2)+8),PAD,PSET
- 1200 PUT (PX,PY),FROGGY,XOR
- 1210 C$=INKEY$ : IF C$=CHR$(27) THEN RUN"menu"
- 1220 IF C$<>"" THEN 1210
- 1230 '
- 1240 ' Wait until a key is pressed, then compute the direction desired
- 1250 '
- 1260 C$=INKEY$ : IF C$="" THEN 1260
- 1270 DX=0 : DY=0 : TX=0 : TY=0
- 1280 IF C$=CHR$(27) THEN RUN "menu"
- 1290 IF C$=UP$ AND PY>21 THEN DY=-20 : TY=-1
- 1300 IF C$=DN$ AND PY<TV THEN DY=20 : TY=+19
- 1310 IF C$=RT$ AND PX<TH THEN DX=30 : TX=+29
- 1320 IF C$=LT$ AND PX>31 THEN DX=-30 : TX=-1
- 1330 IF DX=0 AND DY=0 THEN 1260
- 1340 '
- 1350 ' Check to see if a maze wall is blocking the desired path.
- 1360 '
- 1370 S=POINT (PX+TX,PY+TY)
- 1380 IF S<>BLANK AND S<>RED AND S<>BLUE THEN 1260
- 1390 '
- 1400 ' Move the froggy to the new spot.
- 1410 '
- 1420 S=POINT(PX+DX+15,PY+DY+10)
- 1430 PUT (PX,PY),FROGGY,XOR
- 1440 SOUND 37,4 :SOUND 88,2
- 1450 '
- 1460 ' If the frog moved backwards, erase the red line.
- 1470 ' If it moved forward, plot a red line showing the path.
- 1480 '
- 1490 IF S=RED THEN LINE (PX+15,PY+10)-(PX+DX+15,PY+DY+10),BLANK ELSE LINE (PX+15,PY+10)-(PX+DX+15,PY+DY+10),RED
- 1500 '
- 1510 ' Update the coordinates and the number of moves.
- 1520 '
- 1530 PX=PX+DX : PY=PY+DY : MOVES=MOVES+1
- 1540 LOCATE 24,1 : PRINT MOVES;" moves";
- 1550 '
- 1560 ' If the frog isn't on the pad yet, go back for another move.
- 1570 '
- 1580 IF PX>TH-30 AND PY>TV THEN 1630 ELSE 1200
- 1590 '
- 1600 ' The frog is on the pad, give him a fly to catch and eat.
- 1610 ' then go back for another game with a new maze.
- 1620 '
- 1630 PUT (PX,PY),FROGGY,PSET : LOCATE 1,1
- 1640 FL=PX+50 : FR=PX+75 : FT=PY : FB=PY+15 : FX=FR : FY=FB
- 1650 FOR I=1 TO 50
- 1660 PSET (FX,FY),0 : FX=INT(RND*6-3)+FX : FY=INT(RND*6-3)+FY
- 1670 PSET (FX,FY),3
- 1680 SOUND 37+RND*25,0.25
- 1685 FOR J=1 TO 10 : NEXT J
- 1690 NEXT I
- 1700 LINE (PX+28,PY+6)-(FX,FY),RED
- 1710 SOUND 1050,0.5
- 1720 LINE (PX+28,PY+6)-(FX,FY),0
- 1730 FOR I=1 TO 25 : SOUND 97,0.02
- 1740 LINE (PX+23,PY+6)-(PX+28,PY+6),1 : LINE (PX+23,PY+6)-(PX+28,PY+6),0
- 1750 FOR J=1 TO 100 : NEXT J
- 1760 NEXT I
- 1770 PSET (PX+23,PY+6),1 : PSET (PX+24,PY+5),0
- 1780 T$=INKEY$ : IF T$="" THEN 1810
- 1790 IF T$=CHR$(27) THEN RUN"MENU"
- 1800 GOTO 1780
- 1810 GOTO 520
- 1820 '
- 1830 ' SUBROUTINE TO PLAY "FROGGY WENT A COURTIN"
- 1840 '
- 1850 ON LS GOTO 1860,1880,1900
- 1860 PLAY "MBMST200O1C4F8F8F8F8F8F8A4 G4 D4MLC4F2F4C4F2F4P4"
- 1870 GOTO 1910
- 1880 PLAY "MSA8>C8C8C8C8C8D4C4<A4 F4"
- 1890 GOTO 1910
- 1900 PLAY " MST200G4F4F4MLF8G8MSA4F4D4MLC4F2F4C4F4F2"
- 1910 LS=LS+1 : IF LS=4 THEN LS=1
- 1920 RETURN
-