Retrocomputing

Hunt the Wumpus

From More BASIC Computer Games, 1979 by David H. Ahl Wumpus 1.

BASIC09 edition

PROCEDURE wumpus
     REM *** HUNT THE WUMPUS ***
     DIM legal:BOOLEAN
     DIM lt,j,k:INTEGER
     DIM path(5):INTEGER
     DIM feature(6),origsetup(6):INTEGER
     DIM cave(20,3):INTEGER

     INPUT "INSTRUCTIONS (Y-N)? ", i$
     IF i$="Y" OR i$="y" THEN
         GOSUB 375
     ENDIF

80   REM *** SET UP CAVE (DODECAHEDRAL NODE LIST) ***
     FOR j=1 TO 20
         FOR k=1 TO 3
             READ cave(j,k)
         NEXT k
     NEXT j
     DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6
     DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11
     DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16
     DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19

     GOSUB 320
230  LOOP
       REM *** SET NO. OF ARROWS ***
       LET a=5
       LET lt=feature(1)
       REM *** RUN THE GAME ***
       PRINT "HUNT THE WUMPUS"
       REM *** HAZARD WARNING AND LOCATION ***
255    GOSUB 585
       REM *** MOVE OR SHOOT ***
       GOSUB 670
       ON o GOTO 280,300
       REM *** SHOOT ***
280    GOSUB 715
       IF duel=0 THEN 255
       GOTO 310
       REM *** MOVE ***
300    GOSUB 975
       IF duel=0 THEN 255

310    IF duel > 0 THEN
         REM *** WIN ***
         PRINT "HEE HEE HEE - THE WUMPUS'LL GET YOU NEXT TIME!!"
       ELSE
         REM *** LOSE ***
         PRINT "HA HA HA - YOU LOSE!"
       ENDIF
       FOR j=1 TO 6
         LET feature(j)=origsetup(j)
       NEXT j
       INPUT "SAME SETUP (Y-N)? ", i$
       IF i$<>"Y" AND i$<>"y" THEN
         GOSUB 320
       ENDIF
     ENDLOOP

320  REM *** LOCATE L ARRAY ITEMS ***
     REM *** 1-YOU, 2-WUMPUS, 3&4-PITS, 5&6-BATS ***

     FOR j=1 TO 6
         LET feature(j)=INT(20*RND(1))+1
         LET origsetup(j)=feature(j)
     NEXT j

     REM *** CHECK FOR CROSSOVERS (IE feature(1)=feature(2), ETC) ***
     FOR j=1 TO 6
         FOR k=1 TO 6
             IF j=k THEN 330
             IF feature(j)=feature(k) THEN 320
330      NEXT k
     NEXT j
     RETURN

375  REM *** INSTRUCTIONS ***
     PRINT "WELCOME TO 'HUNT THE WUMPUS'"
     PRINT "  THE WUMPUS LIVES IN A CAVE OF 20 ROOMS. EACH ROOM"
     PRINT "HAS 3 TUNNELS LEADING TO OTHER ROOMS. (LOOK AT A"
     PRINT "DODECAHEDRON TO SEE HOW THIS WORKS-IF YOU DON'T KNOW"
     PRINT "WHAT A DODECAHEDRON IS, ASK SOMEONE)"
     PRINT
     PRINT "     HAZARDS:"
     PRINT " BOTTOMLESS PITS - TWO ROOMS HAVE BOTTOMLESS PITS IN THEM"
     PRINT "     IF YOU GO THERE, YOU FALL INTO THE PIT (& LOSE!)"
     PRINT " SUPER BATS - TWO OTHER ROOMS HAVE SUPER BATS. IF YOU"
     PRINT "     GO THERE, A BAT GRABS YOU AND TAKES YOU TO SOME OTHER"
     PRINT "     ROOM AT RANDOM. (WHICH MAY BE TROUBLESOME)"
     INPUT "HIT RETURN TO CONTINUE", a$
     PRINT "     WUMPUS:"
     PRINT " THE WUMPUS IS NOT BOTHERED BY HAZARDS (HE HAS SUCKER"
     PRINT " FEET AND IS TOO BIG FOR A BAT TO LIFT).  USUALLY"
     PRINT " HE IS ASLEEP.  TWO THINGS WAKE HIM UP: YOU SHOOTING AN"
     PRINT " ARROW OR YOU ENTERING HIS ROOM."
     PRINT "     IF THE WUMPUS WAKES HE MOVES (P=.75) ONE ROOM"
     PRINT " OR STAYS STILL (P=.25).  AFTER THAT, IF HE IS WHERE YOU"
     PRINT " ARE, HE EATS YOU UP AND YOU LOSE!"
     PRINT
     PRINT "     YOU:"
     PRINT " EACH TURN YOU MAY MOVE OR SHOOT A CROOKED ARROW"
     PRINT "   MOVING:  YOU CAN MOVE ONE ROOM (THRU ONE TUNNEL)"
     PRINT "   ARROWS:  YOU HAVE 5 ARROWS.  YOU LOSE WHEN YOU RUN OUT"
     PRINT "   EACH ARROW CAN GO FROM 1 TO 5 ROOMS. YOU AIM BY TELLING"
     PRINT "   THE COMPUTER THE ROOM#S YOU WANT THE ARROW TO GO TO."
     PRINT "   IF THE ARROW CAN'T GO THAT WAY (IF NO TUNNEL) IT MOVES"
     PRINT "   AT RANDOM TO THE NEXT ROOM."
     PRINT "     IF THE ARROW HITS THE WUMPUS, YOU WIN."
     PRINT "     IF THE ARROW HITS YOU, YOU LOSE."
     INPUT "HIT RETURN TO CONTINUE",a$
     PRINT "    WARNINGS:"
     PRINT "     WHEN YOU ARE ONE ROOM AWAY FROM A WUMPUS OR HAZARD,"
     PRINT "     THE COMPUTER SAYS:"
     PRINT " WUMPUS:  'I SMELL A WUMPUS'"
     PRINT " BAT   :  'BATS NEARBY'"
     PRINT " PIT   :  'I FEEL A DRAFT'"
     PRINT
     RETURN

585  REM *** PRINT LOCATION & HAZARD WARNINGS ***
     PRINT
     FOR j=2 TO 6
         FOR k=1 TO 3
             IF cave(feature(1),k)<>feature(j) THEN 600
             ON j-1 GOSUB 615,625,625,635,635
600      NEXT k
     NEXT j
     PRINT "YOU ARE IN ROOM "; feature(1)
     PRINT "TUNNELS LEAD TO "; cave(lt,1); " "; cave(lt,2); " "; cave(lt,3)
     PRINT
     RETURN

615  PRINT "I SMELL A WUMPUS!"
     RETURN

625  PRINT "I FEEL A DRAFT"
     RETURN

635  PRINT "BATS NEARBY!"
     RETURN

670  REM *** CHOOSE OPTION ***
     LOOP
       INPUT "SHOOT OR MOVE (S-M)? ", i$
       EXITIF i$="S" OR i$="s" THEN
         LET o=1
       ENDEXIT
       EXITIF i$="M" OR i$="m" THEN
         LET o=2
       ENDEXIT
     ENDLOOP
     RETURN

715  REM *** ARROW ROUTINE ***
     LET duel=0
     REM *** PATH OF ARROW ***
     REPEAT
         INPUT "NO. OF ROOMS (1-5)? ", j9
     UNTIL j9 > 0 AND j9 < 6
     FOR k=1 TO j9
         760 INPUT "ROOM # ", path(k)
         IF k<=2 THEN 790
         IF path(k) <> path(k-2) THEN 790
         PRINT "ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM"
         GOTO 760
790  NEXT k
     REM *** SHOOT ARROW ***
     LET lt=feature(1)
     FOR k=1 TO j9
         FOR k1=1 TO 3
             IF cave(lt,k1)=path(k) THEN 895
         NEXT k1
         REM *** NO TUNNEL FOR ARROW ***
         LET lt=cave(lt,INT(3*RND(1))+1)
         GOTO 900
840  NEXT k

     PRINT "MISSED"
     LET lt=feature(1)
     REM *** MOVE WUMPUS ***
     GOSUB 940
     REM *** AMMO CHECK ***
     LET a=a-1
     IF a > 0 THEN
         RETURN
     ENDIF
     LET duel= -1
     RETURN

     REM *** SEE IF ARROW IS AT feature(1) OR AT feature(2)
895  LET lt=path(k)
900  IF lt=feature(2) THEN
         PRINT "AHA! YOU GOT THE WUMPUS!"
         LET duel = 1
         RETURN
     ENDIF
     IF lt<>feature(1) THEN 840
     PRINT "OUCH! ARROW GOT YOU!"
     LET duel= -1
     RETURN

940  REM *** MOVE WUMPUS ROUTINE ***
     LET k=INT(4*RND(1))+1
     IF k<>4 THEN
       LET feature(2)=cave(feature(2),k)
     ENDIF
     IF feature(2) = lt THEN
         PRINT "TSK TSK TSK - WUMPUS GOT YOU!"
         LET duel= -1
     ENDIF
     RETURN

975  REM *** MOVE ROUTINE ***
     LET duel=0
     REPEAT
       REPEAT
         INPUT "WHERE TO? ", lt
       UNTIL lt >= 1 AND lt <= 20
       LET legal=FALSE
       FOR k=1 TO 3
         REM *** CHECK IF LEGAL MOVE ***
         IF cave(feature(1),k)=lt THEN
           LET legal=TRUE
         ENDIF
       NEXT k
       IF lt=feature(1) THEN
         LET legal=TRUE
       ENDIF
       IF legal=FALSE THEN
         PRINT "NOT POSSIBLE -";
       ENDIF
     UNTIL legal

     REM *** CHECK FOR HAZARDS ***
1045 LET feature(1)=lt
     REM *** WUMPUS ***
     IF lt = feature(2) THEN
       PRINT "... OOPS! BUMPED A WUMPUS!"
       REM *** MOVE WUMPUS ***
       GOSUB 940
       IF duel<>0 THEN
         RETURN
       ENDIF
     ENDIF
     REM *** PIT ***
     IF lt=feature(3) OR lt=feature(4) THEN
       PRINT "YYYYIIIIEEEE . . . FELL IN PIT"
       LET duel= -1
       RETURN
     ENDIF

     REM *** BATS ***
     IF lt=feature(5) OR lt=feature(6) THEN
       PRINT "ZAP--SUPER BAT SNATCH! ELSEWHEREVILLE FOR YOU!"
       LET lt=INT(20*RND(1))+1
       GOTO 1045
     ENDIF
     RETURN

     END