home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Phoenix CD 2.0
/
Phoenix_CD.cdr
/
16c
/
slither.zip
/
SLITHER.BAS
next >
Wrap
BASIC Source File
|
1986-04-27
|
17KB
|
382 lines
10 ' Slither
20 ' Written by Brian Bakken
30 ' on November 30, 1985
40 ' this program, in its original state, was the game SNAKE
50 ' it has been greatly enhanced and now runs under the name SLITHER
60 ' for lack of a better name.
70 '
80 ' the program now will allow user to move in all directions and there is
90 ' no 'walls' to run into, so, your only enemy is yourself!!
100 ' There are many more options to chose from now, including screen color,
110 ' speed and growth rates, target freguency and duration, and the special
120 ' trace screen which leaves your trail black on a colored screen
130 '
140 ' The compiled version (under the same name) runs considerably faster,
150 ' (of course) and therefore, is much more dangerous
160 ' Used the IBM 2.0 Basic Compiler
170 '
180 '
190 '
200 KEY OFF : COLOR 15,0,0 : SCREEN 0,0,0 : WIDTH 80 : CLS : COLOR 0,15
210 LOCATE 6,15 : PRINT CHR$(218);STRING$(48,196);CHR$(191);
220 LOCATE 15,15 : PRINT CHR$(192);STRING$(48,196);CHR$(217);
230 FOR T% = 7 TO 14
240 LOCATE T%,15 : PRINT CHR$(179); : LOCATE T%,64 : PRINT CHR$(179);
250 NEXT
260 COLOR 15,0,0
270 LOCATE 8,34 : PRINT "S L I T H E R"
280 LOCATE 9,35 : PRINT "Version 1.0"
290 LOCATE 11,29 : PRINT "Written by Brian Bakken"
300 LOCATE 12,32 : PRINT "November 30, 1985"
310 LOCATE 20,16
320 PRINT "This game has been placed into the Public Domain"
330 LOCATE 21,17
340 PRINT "and shall not be sold by anyone for any reason"
350 LOCATE 23,28
360 PRINT "In other words, its FREE!"
370 LOCATE 14,31 : PRINT "<SPACE> to continue" : LOCATE 25,79
380 A$ = "" : WHILE A$ <> " " : A$ = INKEY$ : WEND : CLS : LOCATE 10,1
390 INPUT "instructions (Y or N) ";A$ : CLS
400 IF A$ = "N" OR A$ = "n" THEN LOCATE 10,1 : GOTO 670
410 PRINT "The goal of the game is to increase your score while not";
420 PRINT " biting your tail."
430 PRINT "Use the arrows on numeric pad to change the direction of the snake
440 PRINT "Run over the targets (numbers) before they desappear for points."
450 PRINT "There is no boundary, the screen will wrap from top to bottom";
460 PRINT " and side to side"
470 PRINT "The Tracer Screen Mode will leave a black path on a colored screen ";
480 PRINT " as the"
490 PRINT " snake travels around. Can be somewhat confusing at first"
500 PRINT
510 PRINT "The various sounds you will here are";:FOR T=1 TO 2000 : NEXT
520 SOUND 4000,1 : PRINT TAB(40);"when a target appears":FOR T = 1 TO 3000:NEXT
530 SOUND 100,1 : PRINT TAB(40);"when a target disappears"
540 PRINT TAB(36);"and "; : FOR T = 1 TO 3000 : NEXT
550 FOR T%=1 TO 3:SOUND 4000,.1:SOUND 3000,.1:SOUND 2000,.1:SOUND 1000,.1:NEXT
560 PRINT "when a target is scored":FOR T = 1 TO 1000:NEXT
570 PRINT : PRINT "Good luck on you mission."
580 PRINT " If you are using an AT or some other 'turboized' machine, Good riddence!!"
590 PRINT
600 PRINT "The speed will increase as the game progresses."
610 PRINT "The growth rate governs the number of moves between ";
620 PRINT "growths of one character"
630 PRINT " a growth rate of 1 would make the snake seem";
640 PRINT " to stretch continuously"
650 PRINT "The lower the growth rate, the faster the speed increases"
660 PRINT : PRINT
670 DEFINT A-Z
680 DIM BOARD%(24,80)
690 'ON ERROR GOTO 2810
700 INPUT "Use default settings (Y, N, S to set, E to examine) ";D$
710 IF D$ = "Y" OR D$ = "y" THEN GOTO 3190 'use the default settings
720 IF D$ = "S" OR D$ = "s" THEN GOTO 3390 'set and use the default settings
730 IF D$ = "E" OR D$ = "e" THEN GOTO 3580 'set and use the default settings
740 '
750 INPUT "Starting speed (1 = fast 1000 = slow)";W$
760 IF VAL(W$)<1 OR VAL(W$)>1000 THEN GOSUB 3050:GOTO 750
770 W = VAL(W$)
780 '
790 INPUT "Maximum speed (1 to 1000) <CR> for none ";S$
800 IF VAL(S$)<0 OR VAL(S$)>1000 THEN GOSUB 3050:GOTO 790
810 MAXSPEED = VAL(S$) * 10
820 '
830 INPUT "Growth rate (1 = fast 1000 = slow)";G$
840 IF VAL(G$)<1 OR VAL(G$)>1000 THEN GOSUB 3050:GOTO 830 ELSE GROWTH = VAL(G$)
850 WAITIME = W * 10 : WAITRATE = W
860 '
870 INPUT "Maximum length of snake (1 to 1920) <CR> for none ";M$
880 IF VAL(M$)<0 OR VAL(M$)>1920 THEN GOSUB 3050:GOTO 870
890 MAXLENGTH% = VAL(M$)
900 '
910 INPUT "Target frequency (1 = immediate 50 = never)";E$
920 IF VAL(E$)<1 OR VAL(E$)>50 THEN GOSUB 3050:GOTO 910 ELSE TON% = VAL(E$)*2
930 IF VAL(E$) = 50 THEN L$ = "0" : TOFF% = 100 : GOTO 970
940 '
950 INPUT "Target duration on (0 = until scored 1-10 = random)";L$
960 IF VAL(L$)<0 OR VAL(L$)>10 THEN GOSUB 3050:GOTO 950 ELSE TOFF%=100-VAL(L$)
970 PRINT
980 '
990 INPUT "Screen color <RETURN> to use present color (0 - 15)";SC$
1000 IF SC$ = "" THEN 1050
1010 IF VAL(SC$)<0 OR VAL(SC$)>15 THEN GOSUB 3050:GOTO 970 ELSE ACOLOR%=VAL(SC$)
1020 COLOR 15,ACOLOR%,ACOLOR% :PRINT TAB(15);STRING$(50,"*");CHR$(1);SPACE$(13);
1030 PRINT TAB(15);CHR$(1);STRING$(50,"*");SPACE$(13);
1040 GOTO 970
1050 IF ACOLOR% = 0 THEN TRACER% = 0 : GOTO 1140 ELSE PRINT
1060 INPUT "Use the tracer screen mode (Y or N)";T$
1070 IF T$="Y" OR T$="y" THEN T$="Y" : TRACER%=0 : ELSE T$="N" : TRACER%=ACOLOR%
1080 IF SETTING% THEN RETURN
1090 PRINT : PRINT "press any key to start game";
1100 A$ = "" : WHILE A$ = "" : A$ = INKEY$ : WEND
1110 '
1120 ' start the show
1130 '
1140 COLOR 15,ACOLOR%,ACOLOR% :CLS:COLOR 0,15 : LOCATE 25,1:PRINT SPACE$(80);
1150 LOCATE 25,1 : PRINT " score : 0"; : LOCATE 25,22 : PRINT "length : 3";
1160 LOCATE 25,42 : PRINT "speed : ";USING "####";WAITIME/10;
1170 LOCATE 25,57 : PRINT "ESC to Exit, P to Pause";
1180 COLOR 15,TRACER%,TRACER% : LOCATE 1,1
1190 RANDOMIZE(VAL(RIGHT$(TIME$,2)))
1200 CHEAD$ = CHR$(1) 'character for the head
1210 SCORE = 0 'current score
1220 TARGET = 0 'target value
1230 SLEN% = 4 'snake length
1240 MOVE% = 1 'current direction
1250 YHEAD% = RND * 22 + 1 : XHEAD% = RND * 75 + 4 'starting positons
1260 YTAIL% = YHEAD : XTAIL% = XHEAD% - 3 'starting positons
1270 LOCATE YHEAD%,XTAIL% : PRINT "***";CHEAD$
1280 FOR TT% = XTAIL% TO XHEAD% : BOARD%(YHEAD%,TT%) = 1 : NEXT
1290 BOARD%(YHEAD%,XHEAD%) = 9
1300 '
1310 FOR GROW = 1 TO GROWTH
1320 FOR W = 1 TO WAITIME: NEXT W 'wait for them to catch up
1330 OLDXH% = XHEAD% : OLDYH% = YHEAD% 'save the old values
1340 OLDXT% = XTAIL% : OLDYT% = YTAIL%
1350 ST$ = INKEY$ 'see if there's a key stroke
1360 IF ST$ = "" THEN 1480 'continue in same direction
1370 IF ASC(ST$) = 80 OR ASC(ST$) = 112 THEN GOSUB 2830 : GOTO 1350 'pause
1380 IF ASC(ST$) = 27 THEN 2770 'exit on escape
1390 IF ASC(ST$) = 0 THEN ST% = ASC(RIGHT$(ST$,1)) ELSE ST% = ASC(ST$)
1400 IF ST% = 77 OR ST% = 54 THEN MOVE% = 1 : GOTO 1480 'right
1410 IF ST% = 81 OR ST% = 51 THEN MOVE% = 2 : GOTO 1480 'down and right
1420 IF ST% = 80 OR ST% = 50 THEN MOVE% = 3 : GOTO 1480 'down
1430 IF ST% = 79 OR ST% = 49 THEN MOVE% = 4 : GOTO 1480 'down and left
1440 IF ST% = 75 OR ST% = 52 THEN MOVE% = 5 : GOTO 1480 'left
1450 IF ST% = 71 OR ST% = 55 THEN MOVE% = 6 : GOTO 1480 'up and left
1460 IF ST% = 72 OR ST% = 56 THEN MOVE% = 7 : GOTO 1480 'up
1470 IF ST% = 73 OR ST% = 57 THEN MOVE% = 8 'up and right
1480 BOARD%(YHEAD%,XHEAD%) = MOVE% 'store next move
1490 ON MOVE% GOSUB 2000,2050,2100,2150,2200,2250,2300,2350 'move the head
1500 BOARD%(YHEAD%,XHEAD%) = 9 'SHOW WE ARE IN TRANSIT BUT STILL HERE
1510 SAVTAIL% = BOARD%(YTAIL%,XTAIL%) 'save the tail
1520 IF YTAIL%=24 AND XTAIL%=80 THEN ELSE LOCATE YTAIL%,XTAIL% : PRINT " ";
1530 BOARD%(YTAIL%,XTAIL%) = 0 'free up space on board
1540 ON SAVTAIL% GOSUB 2040,2090,2140,2190,2240,2290,2340,2390 'move the tail
1550 IF TARGET AND XHEAD%=XTARGET% AND YHEAD%=YTARGET% THEN GOSUB 1820'SCORE!
1560 IF TARGET THEN IF RND * 100 >TOFF% THEN GOSUB 1760 'turn off target
1570 IF TARGET=0 THEN IF RND*100 > TON% THEN GOSUB 1900 'turn on target
1580 NEXT GROW
1590 '
1600 'after the appropriate number of moves, add to the length of snake
1610 IF SLEN% = MAXLENGTH% AND MAXLENGHT% THEN 1680 'hit the max
1620 IF OLDYT%=24 AND OLDXT%=80 THEN ELSE LOCATE OLDYT%,OLDXT% : PRINT "*";
1630 YTAIL% = OLDYT% : XTAIL% = OLDXT% : BOARD%(YTAIL%,XTAIL%) = SAVTAIL%
1640 SLEN% = SLEN% + 1 'add to length
1650 COLOR 0,15 : LOCATE 25,30 : PRINT SLEN%;
1660 IF SLEN% = MAXLENGTH% THEN LOCATE 25,18 : PRINT "MAX";
1670 COLOR 15,TRACER%,TRACER%
1680 IF WAITIME <= MAXSPEED THEN 1310
1690 WAITIME = WAITIME - WAITRATE
1700 COLOR 0,15
1710 LOCATE 25,50 : PRINT USING "####";(WAITIME / 10) * (ABS(WAITIME > 0));
1720 IF WAITIME <= MAXSPEED THEN LOCATE 25,38 : PRINT "MAX";
1730 COLOR 15,TRACER%,TRACER%
1740 GOTO 1310
1750 '
1760 ' test target turn off
1770 '
1780 TARGET = 0
1790 SOUND 100,1
1800 LOCATE YTARGET%,XTARGET% : PRINT " ";
1810 RETURN
1820 '
1830 ' score a hit
1840 '
1850 FOR T%=1 TO 3:SOUND 4000,.1:SOUND 3000,.1:SOUND 2000,.1:SOUND 1000,.1:NEXT
1860 SCORE = SCORE + TARGET : TARGET = 0
1870 COLOR 0,15 : LOCATE 25,9 : PRINT SCORE; : COLOR 15,TRACER%,TRACER%
1880 RETURN
1890 '
1900 ' set up a target
1910 TRY = 0
1920 IF TRY% = 15 THEN RETURN 'if snake gets long enough, we could have
1930 XTARGET% = RND*79 + 1 'trouble finding a place for a target
1940 YTARGET% = RND*23 + 1
1950 IF BOARD%(YTARGET%,XTARGET%) OR (YTARGET%=24 AND XTARGET%=80) THEN TRY% = TRY% + 1 : GOTO 1920
1960 TARGET = RND * 8 + 1
1970 LOCATE YTARGET%,XTARGET%
1980 PRINT USING "#";TARGET; : SOUND 4000,1
1990 RETURN
2000 '
2010 ' MOVE RIGHT AND CHECK THE POSITION
2020 '
2030 GOSUB 2480 : GOTO 2890 'HEAD
2040 GOSUB 2490 : RETURN 'TAIL
2050 '
2060 ' MOVE TO LOWER RIGHT AND CHECK THE POSITION
2070 '
2080 GOSUB 2480 : GOSUB 2500 : GOTO 2890 'HEAD
2090 GOSUB 2490 : GOSUB 2510 : RETURN 'TAIL
2100 '
2110 ' MOVE DOWN AND CHECK THE POSITION
2120 '
2130 GOSUB 2500 : GOTO 2890 'HEAD
2140 GOSUB 2510 : RETURN 'TAIL
2150 '
2160 ' MOVE TO LOWER LEFT AND CHECK THE POSITION
2170 '
2180 GOSUB 2500 : GOSUB 2460 : GOTO 2890 'HEAD
2190 GOSUB 2510 : GOSUB 2470 : RETURN 'TAIL
2200 '
2210 ' MOVE LEFT AND CHECK THE POSITION
2220 '
2230 GOSUB 2460 : GOTO 2890 'HEAD
2240 GOSUB 2470 : RETURN 'TAIL
2250 '
2260 ' MOVE TO UPPER LEFT AND CHECK THE POSITION
2270 '
2280 GOSUB 2460 : GOSUB 2440 : GOTO 2890 'HEAD
2290 GOSUB 2470 : GOSUB 2450 : RETURN 'TAIL
2300 '
2310 ' MOVE UP AND CHECK THE POSTION
2320 '
2330 GOSUB 2440 : GOTO 2890 'HEAD
2340 GOSUB 2450 : RETURN 'TAIL
2350 '
2360 ' MOVE TO UPPER RIGHT AND CHECK THE POSITION
2370 '
2380 GOSUB 2440 : GOSUB 2480 : GOTO 2890 'HEAD
2390 GOSUB 2450 : GOSUB 2490 : RETURN 'TAIL
2400 '
2410 '
2420 ' CHANGE THE HEAD AND TAIL POSITIONS FOR THE CORRECT MOVES
2430 '
2440 YHEAD% = (YHEAD% - 1) + (ABS(YHEAD% = 1) * 24) : RETURN 'GO UP HEAD
2450 YTAIL% = (YTAIL% - 1) + (ABS(YTAIL% = 1) * 24) : RETURN 'GO UP TAIL
2460 XHEAD% = (XHEAD% - 1) + (ABS(XHEAD% = 1) * 80) : RETURN 'GO LEFT HEAD
2470 XTAIL% = (XTAIL% - 1) + (ABS(XTAIL% = 1) * 80) : RETURN 'GO LEFT TAIL
2480 XHEAD% = (XHEAD% + 1) - (ABS(XHEAD% = 80) * 80): RETURN 'GO RIGHT HEAD
2490 XTAIL% = (XTAIL% + 1) - (ABS(XTAIL% = 80) * 80): RETURN 'GO RIGHT TAIL
2500 YHEAD% = (YHEAD% + 1) - (ABS(YHEAD% = 24) * 24): RETURN 'GO DOWN HEAD
2510 YTAIL% = (YTAIL% + 1) - (ABS(YTAIL% = 24) * 24): RETURN 'GO DOWN TAIL
2520 '
2530 '
2540 ' THEY WERE KILLED SO TELL THEM AND RESTART IF THEY WANT TO GO AGAIN
2550 '
2560 LOCATE 1,1
2570 PRINT "DEAD SNAKE! Play Again (Y or N) ";
2580 INPUT ASK$
2590 COLOR 15,ACOLOR%,ACOLOR% : CLS
2600 IF ASK$ = "N" OR ASK$ = "n" THEN 3100
2610 PRINT : PRINT "resetting playing field"
2620 FOR T% = 1 TO 80 'reset the board to all zeros
2630 PRINT ".";
2640 FOR TT% = 1 TO 24
2650 BOARD(TT%,T%) = 0
2660 NEXT TT%
2670 NEXT T%
2680 GOSUB 3670 'display the present options
2690 INPUT "Use these options for next play (Y or N) ";ASK2$
2700 IF ASK2$ = "N" OR ASK2$ = "n" THEN PRINT : PRINT : GOTO 690
2710 WAITIME = VAL(W$) * 10 : WAITRATE = VAL(W$) : PRINT
2720 GOTO 1140
2730 '
2740 '
2750 ' THEY USED THE ESCAPE KEY, SO HANDLE IT
2760 '
2770 LOCATE 1,1 : PRINT "what's the matter, couldn't take the pressure??"
2780 PRINT : INPUT "Try again (Y or N) ";ASK$ : GOTO 2590
2790 '
2800 '
2810 ' THEY USED THE PAUSE KEY, SO HANDLE IT
2820 '
2830 COLOR 0,15 : LOCATE 25,57 : PRINT "Any key to continue ";
2840 A$ = "" : WHILE A$ = "" : A$ = INKEY$ : WEND
2850 LOCATE 25,57 : PRINT "ESC to Exit, P to Pause"; : COLOR 15,TRACER%,TRACER%
2860 RETURN
2870 '
2880 '
2890 ' CHECK TO SEE IF THE DIRECTION THAT THEY WANT IS VALID
2900 '
2910 IF BOARD%(YHEAD%,XHEAD%) THEN 2560
2920 IF OLDYH%=24 AND OLDXH%=80 THEN ELSE LOCATE OLDYH%,OLDXH%:PRINT "*";
2930 IF YHEAD%=24 AND XHEAD%=80 THEN ELSE LOCATE YHEAD%,XHEAD%:PRINT CHEAD$;
2940 RETURN
2950 '
2960 '
2970 ' ERROR, ERROR!! THIS GIVES IT SOMEPLACE TO GO, NOTHING FANCY
2980 '
2990 PRINT "error ";ERR;" in line ";ERL
3000 END
3010 '
3020 '
3030 ' PRODUCE AN ERROR SOUND
3040 '
3050 SOUND 3000,1 : SOUND 1000,1 : RETURN
3060 '
3070 '
3080 ' END THE GAME IN A POLITE SORT OF MANNER
3090 '
3100 CLS
3110 LOCATE 12,18
3120 PRINT "Thank you for playing, hope you enjoyed it!"
3130 LOCATE 20,1
3140 END
3150 '
3160 '
3170 ' USE THE DEFAULT SETTINGS
3180 '
3190 IF DEFAULT% THEN 3270 'if we already have the defaults
3200 PRINT : PRINT "Getting Info...."; : PRINT : GOSUB 3510 : GET #1,1
3210 IF LEFT$(WD$,1) = CHR$(0) THEN PRINT : PRINT "No default settings have been entered, please set them up" : PRINT : CLOSE : GOTO 3390
3220 W$ = MID$(STR$(CVI(WD$)),2) : S$ = MID$(STR$(CVI(SD$)),2)
3230 G$ = MID$(STR$(CVI(GD$)),2) : M$ = MID$(STR$(CVI(MD$)),2)
3240 E$ = MID$(STR$(CVI(ED$)),2) : L$ = MID$(STR$(CVI(LD$)),2)
3250 SCR$ = STR$(CVI(SCD$)) : TR$ = STR$(CVI(TD$))
3260 CLOSE #1
3270 WAITIME = VAL(W$) * 10 : WAITRATE = VAL(W$) : PRINT
3280 W = VAL(W$) : S = VAL(S$) : GROWTH = VAL(G$) : MAX% = VAL(M$)
3290 TON% = VAL(E$) * 2
3300 IF TON% = 0 THEN TOFF% = 0 : L$ = "" ELSE TOFF% = 100 - VAL(L$)
3310 ACOLOR% = VAL(SCR$)
3320 IF VAL(TR$)=1 OR ACOLOR%=0 THEN TRACER%=0:T$="Y" ELSE TRACER%=ACOLOR%:T$="N"
3330 DEFAULT% = 1
3340 IF SETTING% = 2 THEN RETURN ELSE GOTO 1090
3350 '
3360 '
3370 ' SET THEN USE THE DEFAULT SETTINGS
3380 '
3390 SETTING% = 1 : DEFAULT% = 0 : GOSUB 750
3400 PRINT : PRINT "Updating info file..." : PRINT : GOSUB 3510
3410 LSET WD$=MKI$(VAL(W$)) : LSET SD$=MKI$(VAL(S$)) : LSET GD$=MKI$(VAL(G$))
3420 LSET MD$=MKI$(VAL(M$)) : LSET ED$=MKI$(VAL(E$)) : LSET LD$=MKI$(VAL(L$))
3430 LSET SCD$ = MKI$(ACOLOR%)
3440 IF T$ = "Y" THEN LSET TD$ = MKI$(1) ELSE LSET TD$ = MKI$(0)
3450 PUT #1,1 : CLOSE
3460 SETTING% = 0 : DEFAULT% = 1 : GOTO 1090
3470 '
3480 '
3490 ' GET THE DEFAULT SETTINGS
3500 '
3510 OPEN "SLITHER.DAT" AS 1 LEN = 16
3520 FIELD #1,2 AS WD$,2 AS SD$,2 AS GD$,2 AS MD$,2 AS ED$,2 AS LD$,2 AS SCD$, 2 AS TD$
3530 RETURN
3540 '
3550 '
3560 ' DISPLAY THE DEFAULT OPTIONS
3570 '
3580 IF DEFAULT% THEN 3600
3590 SETTING% = 2 : GOSUB 3200 : SETTING% = 0
3600 PRINT : PRINT "The default settings are now :" : GOSUB 3670
3610 PRINT : PRINT : PRINT
3620 GOTO 700
3630 '
3640 '
3650 ' DISPLAY THE OPTIONS THAT WE HAVE
3660 '
3670 PRINT : PRINT
3680 PRINT "Starting Speed ";W$ 'see if they want the same options
3690 PRINT "Maximum Speed ";S$
3700 PRINT "Growth Rate ";G$
3710 PRINT "Maximum Size ";
3720 IF VAL(M$) = 0 THEN PRINT "None" : PRINT ELSE PRINT M$
3730 PRINT "Target Frequency ";
3740 IF VAL(E$) = 50 THEN PRINT "No Targets" : PRINT : GOTO 2710 ELSE PRINT E$
3750 PRINT "Target duration ";
3760 IF TOFF% = 0 THEN PRINT "on until scored" ELSE PRINT L$
3770 PRINT "Screen color is ";ACOLOR%
3780 PRINT "Trace Screen is ";
3790 IF T$ = "Y" THEN PRINT "on" ELSE PRINT "off"
3800 PRINT : PRINT
3810 RETURN