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