Hunt the Wumpus

Authors

Publication

Pub Details

Date

Pages

This is a game I re-wrote from a BASIC listing for the members of the Sinclair chapter of the Motorola MicroColor Computer club back in 1981. The purpose was to show them how smooth a Screen could look on the X81. Also, this program had the HELP in the program were it should be rather than in a manual set of instructions lost somewhere in the past!

When programming it is important to get as much important information on the screen as possible with good organization as possible, that is why 80 column displays are preferable to 40 column displays. Up until this time I had noted that programmers often gave little or no thought to how a screen display would look or act.

This program seems to do partial screen clears and writes, this is not the case! Note how a total screen re-write can be transparent to the user and how eye pleasing it can be.

The original program written for an Apple computer was pure Screen boredom, so I added a little visual gratification when the player wins.

Also, as the ZХ81 has a membrane keyboard, why wear out the keyboard using the ENTER key all the time? The program uses the screen counter as a means of determining whether the person inputting numbers means to enter a 1, 2 or a teen number or a 20.

This game was translated to the TS2068 using FirstLoader from Syntax Magazine. The program is part of the LogiCall Ensemble, So entering ‘Q’ at the ‘SHOOT or MOVE’ prompt will return you to LogiCall.

Remember, never use the ENTER key!

Source Code

    5 POKE 23658,8:INK 9:PAPER 1:BORDER 1:
   10 RANDOMIZE :LET Z$="                                " 
   20 GO SUB 6000
   30 PRINT AT 7,12;"WELCOME"; AT 11,3;"DO YOU NEED INSTRUCTIONS?"; AT 14,14;
   40 PAUSE 0
   50 LET I$= INKEY$
   60 IF I$="Y" THEN PRINT "YES"
   70 IF I$="N" THEN PRINT "NO"
   72 IF I$="M" THEN PRINT "MAY BE"
   73 IF I$="C" THEN PRINT "COULD BE"
   74 IF I$="J" THEN PRINT "JUST COULD BE"
   75 IF I$="R" THEN PRINT "REALLY"
   76 IF I$="W" THEN PRINT "WHY NOT "
   77 IF I$="Q" THEN PRINT "QUITE"
   78 IF I$="S" THEN PRINT "SURE"
   80 IF I$="L" THEN PRINT "LUV TO SEE THEM"
  100 IF I$<"C" OR I$>"Y" THEN PRINT "I GUESS"
  110 REM SET UP CAVE(DODECAHEDRON NODE LIST)
  112 DIM S(20,3)
  114 DIM P(5)
  116 RESTORE 
  120 FOR J=1 TO 20:FOR K=1 TO 3:READ S(J,K):NEXT K:NEXT J
  122 DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6
  124 DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11
  126 DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16
  128 DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19
  130 DEF FN A(X)= INT (RND*20)+1
  140 DEF FN B(X)= INT (RND*3)+1
  142 DEF FN C(X)= INT (RND*4)+1
  148 REM LOCATE L ARRAY ITEMS
  150 REM -1-YOU,2-WUMPUS,3&4-PITS,5&6-BATS
  152 DIM L(6)
  154 DIM M(6)
  160 FOR J=1 TO 6
  170 LET L(J)= FN A(0)
  180 LET M(J)=L(J)
  190 REM PRINT L(J);
  200 NEXT J
  210 REM CHECK FOR CROSSOVERS(I.E., L(1)=L(2)),ETC
  220 FOR J=1 TO 6
  300 FOR K=J TO 6
  310 IF J=K THEN GO TO 330
  320 IF L(J)=L(K) THEN GO TO 160
  330 NEXT K
  340 NEXT J
  345 IF I$ <>"N" THEN GO SUB 1000
  350 REM -SET NUMBER ARROWS
  360 LET A=5
  365 LET L=L(1)
  370 REM -RUN THE GAME
  380 REM -HAZARD WARNINGS AND LOCATIONS
  390 GO SUB 2000
  400 REM MOVE OR SHOOT
  410 GO SUB 2500
  420 IF O=1 THEN GO TO 440
  422 IF O=2 THEN GO TO 480
  424 IF O=3 THEN GO TO 9998
  430 REM -SHOOT
  440 GO SUB 3000
  445 GO SUB 6006
  450 IF F=0 THEN GO TO 410
  460 GO TO 500
  470 REM -MOVE
  480 GO SUB 4000
  490 IF F=0 THEN GO TO 390
  500 IF F>0 THEN GO TO 550
  510 REM -LOSE
  520 PRINT AT 14,4;" HA, HA, HA...YOU LOSE!"
  530 GO TO 560
  540 REM -WIN
  550 LET W$="▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞        T H E   W U M P U S   W I L L   G E T C H A   N E X T   T I M E ! !           ▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞"
  552 PRINT AT 9,1;"▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞▞"; AT 16,10;"SAME SET UP?";
  554 FOR I=1 TO 120:PRINT AT 11,8;W$(I TO I+15):PAUSE 6:IF INKEY$ <>"" THEN GO TO 600
  556 NEXT I
  558 GO TO 554
  560 FOR J=1 TO 6
  570 LET L(J)=M(J)
  580 NEXT J
  590 PRINT AT 16,10;"SAME SET UP?";
  600 LET I$= INKEY$
  640 IF I$="N" THEN GO TO 160
  650 IF I$="Y" THEN GO TO 360
  660 GO TO 590
 1000 REM INSTRUCTIONS
 1010 CLS :PRINT AT 0,4;"WELCOME TO HUNT THE WUMPUS"; AT 3,0;
 1020 PRINT " THE WUMPUS LIVES IN A CAVE OF  20 ROOMS, A DODECAHEDRON. IF YOUDON,T KNOW WHAT A DODECAHEDRON  IS, ASK SOMEONE."; AT 8,0
 1070 PRINT "   HAZARDS:"
 1075 PRINT 
 1080 PRINT " THE BOTTOMLESS PIT --  2 ROOMS HAVE BOTTOMLESS PITS IN THEM. IFYOU GO THERE YOU FALL AND LOSE."
 1090 PRINT 
 1100 PRINT " SUPERBATS ------------ 2 OTHER ROOMS HAVE SUPERBATS. IF YOU GO THERE, A BAT GRABS YOU AND TAKESYOU TO ANOTHER ROOM AT RANDOM   WHICH MIGHT PROVE TROUBLESOME."
 1110 GO SUB 4400
 1140 PRINT " WUMPUS:"
 1150 PRINT '" THE WUMPUS IS NOT BOTHERED BY  THE HAZARDS. HE HAS SUCKERS ON  HIS FEET AND IS MUCH TOO BIG FORA SUPERBAT TO LIFT. USUALLY, HE IS ASLEEP. 2 THINGS WAKE HIM UP:"
 1160 PRINT ''"     YOUR ENTERING HIS ROOM"'',"OR"''"     YOUR SHOOTING AN ARROW."
 1180 PRINT 
 1190 PRINT '" IF THE WUMPUS WAKES, HE EITHER MOVES ONE ROOM OR STAYS PUT--THEFIRST TIME. AFTER THAT, IF YOU  BUG HIM, HE EATS YOU UP AND YOU LOSE."
 1200 GO SUB 4400
 1230 PRINT "YOU:"
 1250 PRINT '"  EACH TURN YOU MAY SHOOT A      CROOKED ARROW."
 1260 PRINT '"ARROWS:"''"  YOU HAVE 5 ARROWS.  YOU LOSE   WHEN YOU RUN OUT.   EACH ARROW  CAN GO FROM 1 TO 5 ROOMS.  YOU  AIM BY TELLING THE COMPUTER     THE ROOM NUMBER OR NUMBERS YOU";
 1270 PRINT "  WANT THE ARROW TO GO.  IF THE   ARROW CAN NOT GO THAT WAY       (I.E., NO TUNNEL), IT MOVES AT  RANDOM TO THE NEXT ROOM."
 1280 PRINT '" IF THE ARROW HITS THE WUMPUS,  YOU WIN!"
 1285 PRINT 
 1290 PRINT "IF THE ARROW HITS YOU, YOU LOSE."
 1300 GO SUB 4400
 1310 PRINT " WARNINGS:"
 1320 PRINT 
 1330 PRINT " WHEN YOUR 1 ROOM AWAY FROM THE WUMPUS OR HAZARD, THE COMPUTER  SAYS:"
 1340 PRINT ''"WUMPUS----I SMELL A WUMPUS."
 1350 PRINT 
 1380 PRINT '"SUPERBAT--LOOK OUT, BATS NEARBY."
 1385 PRINT 
 1390 PRINT '"PIT----EEK!!!!!  I FEEL A DRAFT."
 1400 GO SUB 4400
 1410 RETURN 
 2000 REM LOCATION AND HAZARD WARNINGS
 2005 GO SUB 6000
 2010 PRINT AT 0,0
 2020 FOR J=2 TO 6
 2030 FOR K=1 TO 3
 2040 IF S(L(1),K) <>L(J) THEN GO TO 2110
 2050 IF (J-1)=1 THEN GO TO 2060
 2051 IF (J-1)=2 THEN GO TO 2080
 2052 IF (J-1)=3 THEN GO TO 2080
 2053 IF (J-1)=4 THEN GO TO 2100
 2054 IF (J-1)=5 THEN GO TO 2100
 2060 PRINT AT 1,7;"I SMELL A  WUMPUS"
 2070 GO TO 2110
 2080 PRINT AT 2,5;"EEK!!!! I FEEL A DRAFT"
 2090 GO TO 2110
 2100 PRINT AT 3,5;"LOOK OUT.. BATS NEARBY"
 2110 NEXT K
 2120 NEXT J
 2130 PRINT AT 8,8;"YOU ARE IN ROOM ";L(1)
 2140 PRINT AT 10,3;"TUNNELS LEAD TO ";S(L,1);", ";S(L,2);", ";S(L,3)
 2160 RETURN 
 2500 REM -CHOOSE OPTIONS
 2510 PRINT AT 12,7;"SHOOT OR MOVE ? "; AT 6,12;"        "; AT 12,7;
 2520 PAUSE 0:LET I$= INKEY$
 2525 IF I$="S" THEN PRINT "SHOOT           "
 2530 IF I$="M" THEN PRINT "         MOVE  "
 2535 IF I$="Q" THEN PRINT "         QUIT  "
 2540 IF I$ <>"S" THEN GO TO 2560
 2550 LET O=1:RETURN 
 2560 IF I$ <>"M" THEN GO TO 2580
 2570 LET O=2:RETURN 
 2580 IF I$ <>"Q" THEN GO TO 2520
 2590 LET O=3:RETURN 
 3000 REM ARROWS ROUTINE
 3010 LET F=0
 3020 REM ARROWS PATH
 3040 PRINT AT 14,2;"NUMBER OF ROOMS(1 TO 5)?"; AT 14,17;
 3041 IF INKEY$ <>"" THEN GO TO 3041
 3042 IF INKEY$="" THEN GO TO 3042
 3043 LET I$= INKEY$
 3044 IF I$<"1" OR I$>"5" THEN GO TO 3040
 3050 LET J9= VAL I$
 3060 PRINT " ";J9;"       "
 3070 FOR K=1 TO J9
 3080 PRINT AT 14+K,6;"ROOM NUMBER ? "; AT 14+K,18;
 3085 GO SUB 4500
 3090 LET P(K)=L
 3095 PRINT P(K); AT 14+K,18;
 3096 GO SUB 4570
 3097 LET P(K)=L
 3098 PRINT P(K)
 3099 IF L<1 OR L>20 THEN GO TO 3080
 3100 NEXT K
 3110 REM SHOOT ARROW
 3120 LET A=A-1
 3130 LET L=L(1)
 3140 FOR K=1 TO J9
 3150 FOR Z=1 TO 3
 3160 IF S(L,Z)=P(K) THEN GO TO 3295
 3170 NEXT Z
 3180 REM -NO TUNNEL FOR ARROW
 3190 LET L=S(L, FN B(1))
 3200 GO TO 3300
 3210 NEXT K
 3220 PRINT AT 6,12;"MISSED..":PAUSE 100
 3230 REM -MOVE WUMPUS
 3240 GO SUB 3370
 3250 REM AMMO CHECK
 3260 IF A>0 THEN GO TO 3280
 3270 LET F=-1
 3280 RETURN 
 3290 REM SEE IF ARROW IS AT L(1) OR L(2)
 3295 LET L=P(K)
 3300 IF L <>L(2) THEN GO TO 3340
 3310 GO SUB 6000:PRINT AT 8,6;"YOU GOT THE WUMPUS!!!!"
 3320 LET F=1
 3330 RETURN 
 3340 IF L <>L(1) THEN GO TO 3210
 3350 PRINT AT 12,6;"OUCH!!!  ARROW GOT YOU":PAUSE 200
 3360 GO TO 3270
 3370 REM MOVE WUMPUS ROUTINE
 3380 LET K= FN C(0)
 3390 IF K=4 THEN GO TO 3440
 3400 LET L(2)=S(L(2),K)
 3410 IF L(2) <>L THEN GO TO 3440
 3420 PRINT AT 12,0;"TSK, TSK, ....WUMPUS GOTCHA!!!!!"
 3430 LET F=-1
 3440 RETURN 
 4000 REM MOVE ROUTINE
 4010 LET F=0
 4020 PRINT AT 14,2;"     WHERE TO ?         "; AT 15,2;"                 "; AT 14,16;
 4025 GO SUB 4500
 4030 PRINT L; AT 14,16;
 4035 GO SUB 4570
 4040 PRINT L
 4045 IF L<1 OR L>20 THEN GO TO 4020
 4050 FOR K=1 TO 3
 4060 REM CHECK IF LEGAL MOVE
 4070 IF S(L(1),K)=L THEN GO TO 4130
 4080 NEXT K
 4090 IF L=L(1) THEN GO TO 4130
 4100 PRINT AT 14,19;"TURKEY,"; AT 16,6;"THATS NOT POSSIBLE!!!!!";:PAUSE 200
 4108 GO SUB 6006
 4109 PRINT AT 16,6;"                     █▝ ";
 4110 GO TO 4020
 4120 REM CHECK FOR HAZARDS
 4130 LET L(1)=L
 4140 REM -WUMPUS
 4150 IF L <>L(2) THEN GO TO 4220
 4160 PRINT AT 12,1;"....OOPS!! BUMPED THE WUMPUS!!":PAUSE 200
 4170 REM MOVE WUMPUS
 4180 GO SUB 3380
 4190 IF F=0 THEN GO TO 4220
 4200 RETURN 
 4210 REM -PIT
 4220 IF L <>L(3) AND L <>L(4) THEN GO TO 4270
 4225 GO SUB 6000
 4230 PRINT AT 11,0;" YYYIIIIEEEEEEEE                     ...FELL INTO THE PIT!!!!!!!":PAUSE 200
 4240 LET F=-1
 4250 RETURN 
 4260 REM -BATS
 4270 IF L <>L(5) AND L <>L(6) THEN GO TO 4310
 4275 GO SUB 6000
 4280 PRINT AT 11,6;"ZAP--SUPERBAT SNATCH!!      ....ELSEWHERE-VILLE FOR YOU.":PAUSE 200
 4290 LET  L= FN A(1)
 4300 GO TO 4130
 4310 RETURN 
 4400 POKE 23659,0
 4410 PRINT AT 22,0;"WHEN YOU HAVE READ THIS AND WANT TO READ ON, HIT ANY KEY";
 4415 POKE 23659,2
 4420 IF INKEY$="" THEN GO TO 4420
 4440 CLS 
 4450 RETURN 
 4500 REM INPUT COLLECTOR
 4520 IF INKEY$ <>"" THEN GO TO 4520
 4530 LET L$= INKEY$:IF L$="" THEN GO TO 4530
 4540 IF L$<"0" OR L$>"9" THEN GO TO 4510
 4550 LET L= VAL L$
 4560 RETURN 
 4570 IF INKEY$ <>"" THEN GO TO 4570
 4580 IF L>2 THEN RETURN 
 4590 POKE 23672,0:POKE 23673,0
 4600 IF PEEK 23673>0 THEN RETURN 
 4610 LET M$= INKEY$
 4620 IF M$="" THEN GO TO 4600
 4630 IF PEEK 23560=191 THEN RETURN 
 4640 IF M$<"0" OR M$>"9" THEN GO TO 4570
 4650 LET M= VAL M$
 4660 LET L=L*10+M
 4670 RETURN 
 5000 STOP 
 6000 PRINT AT 0,0;"█  █ █ █ █▗ █ ███  ███ █  █ █████  █ █ █ ██▗█  █    █  █  █ █   █  █ █ █ █▘██  █    █  ████ █   █  █ █ █ █ ▘█  █    █  █  █ █   ████ █ █ █          █  █  █ █████  █ █▖█ ▀             █  █ █   █  █ ██▝                  █ █   █  █ █▝                   ▀ █   █  █                        ▀█▄ █                             ▀█";
 6005 PRINT AT 10,0;Z$;Z$;Z$;Z$
 6006 POKE 23659,0
 6010 PRINT AT 14,0;"█                            ▖███                          ▖█▜ ██   █                      █▝  ██   █ █                  █ █    █ ▗ █ █  █            █  █ █    █ █ █ █  █ █▗    ▖███ █  █ ██████▖█▗█ █  █ █▟ ▖█ █▝ █ █  █     ██▙ ▟█ █  █ █▛▖██ ███▝ █  █ █   ██▝ ▘█ █  █ █▘█▝█ █    █  █ █   ██   █ ████ █ ▝ █ █    ████ █████"
 6015 POKE 23659,2
 6020 RETURN 
 9992 SAVE "WUMPUS" LINE 10