Damian Walker

Personal Web Pages

Progress on Wumpus!

Hunt the Wumpus program listing

Saturday, 10th August 2019

Over the past few days I've managed to complete my Hunt the Wumpus implementation in Tiny BASIC. Programming in Tiny BASIC for me is like running a marathon or completing a gruelling assault course for more sporty types - painful, but satisfying and in a strange way enjoyable.

I started out by assuming optional line numbers, and those not limited to a maximum of 255. I'd also included comments and blank lines for readability. After that I manually "renumbered" the program so that the lines all had numbers starting at 1, adjusting the GOTO/GOSUB statements accordingly. That was one of the more tedious parts of the exercise, but resulted in a program that should run on the most basic (ha ha) version of Tiny BASIC - though maybe in the tiny memory of the machines it was designed for.

Here's the more readable copy of the source code:

    REM
    REM ** Hunt the Wumpus Game
    REM ** A Test Program for Tiny BASIC
    REM

    REM -- Variable List
    REM
    REM A - Bat 1 position
    REM B - Bat 2 position
    REM C - Player position
    REM D - Destination to move or shoot
    REM E - exit 1
    REM F - exit 2
    REM G - exit 3
    REM H - Hole 1 (bottomless pit) position
    REM I - Hole 2 (bottomless pit) position
    REM M - menu option for move or shoot
    REM N - range for arrow shot
    REM P - parameter to the "exits" routine
    REM R - random number
    REM S - random number generator seed
    REM W - Wumpus position

    REM -- Begin the Program
100 PRINT "Think of a number"
    INPUT S
200 GOSUB 750
    LET A=1+(R-(R/20*20))
205 GOSUB 750
    LET B=1+(R-(R/20*20))
    IF B=A THEN GOTO 205
    GOSUB 750
    LET H=1+(R-(R/20*20))
210 GOSUB 750
    LET I=1+(R-(R/20*20))
    IF I=H THEN GOTO 210
    GOSUB 750
    LET W=1+(R-(R/20*20))
220 GOSUB 750
    LET C=1+(R-(R/20*20))
    IF C<>A THEN IF C<>B THEN IF C<>H THEN IF C<>I THEN IF C<>W THEN GOTO 230
    GOTO 220
230 PRINT "You enter the caves to Hunt the Wumpus!"

    REM -- Main Game Loop
500 PRINT "You are in room ",C
    LET P=C
    GOSUB 900
    PRINT "Exits are ",E,",",F,",",G
    GOSUB 600
510 PRINT "1:Move or 2:Shoot?"
    INPUT M
    IF M<1 THEN GOTO 510
    IF M>2 THEN GOTO 510
    IF M=1 THEN GOSUB 700
    IF M=2 THEN GOSUB 800
    GOTO 500

    REM -- Subroutine to check for hazards

    REM Has the player fallen in a pit?
600 IF D<>H THEN IF D<>I THEN GOTO 610
    PRINT "You fall down a bottomless hole into the abyss!"
    END

    REM Has the player startled the wumpus?
610 IF D<>W THEN GOTO 620
    PRINT "You stumble upon the wumpus!"
    GOSUB 670
    PRINT "The wumpus runs away!"

    REM Has the player encountered a bat?
620 IF D<>A THEN IF D<>B THEN GOTO 630
    PRINT "A bat swoops down and picks you up..."
    GOSUB 680
    PRINT "...and drops you down."

    REM Is there a pit nearby?
630 IF E<>H THEN IF F<>H THEN IF G<>H THEN IF E<>I THEN IF F<>I THEN IF G<>I THEN GOTO 640
    PRINT "You feel a cold wind blowing from a nearby cavern."

    REM Is the wumpus nearby?
640 IF E<>W THEN IF F<>W THEN IF G<>W THEN GOTO 650
    PRINT "You smell something terrible nearby."

    REM Is there a bat nearby?
650 IF E<>A THEN IF F<>A THEN IF G<>A THEN IF E<>B THEN IF F<>B THEN IF G<>B THEN GOTO 660
    PRINT "You hear a loud squeaking and a flapping of wings."
660 RETURN

    REM Relocate the Wumpus
670 GOSUB 750
    LET R=R-(R/4*4)
    IF R=1 THEN LET W=E
    IF R=2 THEN LET W=F
    IF R=3 THEN LET W=G
    IF W<>C THEN RETURN
    PRINT "The wumpus eats you!"
    END

    REM Relocate bat and player
680 GOSUB 750
    LET R=R-(R/4*4)
    IF R=0 THEN RETURN
    LET P=C
    GOSUB 900
    IF R=1 THEN LET D=E
    IF R=2 THEN LET D=F
    IF R=3 THEN LET D=G
    PRINT "...moves you to ",D,"..."
    IF A=C THEN LET A=D
    IF B=C THEN LET B=D
    LET C=D
    GOTO 680

    REM -- Subroutine to move
700 PRINT "Where?"
    INPUT D
    IF D<>E THEN IF D<>F THEN IF D<>G THEN GOTO 700
    PRINT "You move to room ",D
    LET C=D
    RETURN

    REM -- Random number generator
750 LET S=(42*S+127)-((42*S+127)/126*126)
    LET R=S
    RETURN

    REM -- Subroutine to shoot
800 PRINT "Shoot how far (1-5)?"
    INPUT N
    IF N<1 THEN GOTO 800
    IF N>5 THEN GOTO 800
805 LET P=C
810 GOSUB 900
    PRINT "You can shoot into rooms ",E,",",F,",",G 
815 PRINT "Shoot where?"
    INPUT P
    IF P<>E THEN IF P<>F THEN IF P<>G THEN GOTO 815
    IF P=W THEN GOTO 830
    LET N=N-1
    IF N>1 THEN GOTO 810
    PRINT "The arrow startles the wumpus."
    LET P=W
    GOSUB 900
    GOSUB 670
    RETURN
830 PRINT "You hit the wumpus!"
    END

    REM -- Subroutine to set the exits
    REM Input: P - current position
    REM Outputs: E, F, G (exits)
900 IF P>=1 THEN IF P<=20 THEN GOTO 900+4*P
    PRINT "Illegal position ",P
    END
904 LET E=2
    LET F=5
    LET G=8
    RETURN
908 LET E=1
    LET F=3
    LET G=10
    RETURN
912 LET E=2
    LET F=4
    LET G=12
    RETURN
916 LET E=3
    LET F=5
    LET G=14
    RETURN
920 LET E=1
    LET F=4
    LET G=6
    RETURN
924 LET E=5
    LET F=7
    LET G=15
    RETURN
928 LET E=6
    LET F=8
    LET G=17
    RETURN
932 LET E=1
    LET F=7
    LET G=11
    RETURN
936 LET E=10
    LET F=11
    LET G=12
    RETURN
940 LET E=2
    LET F=9
    LET G=11
    RETURN
944 LET E=8
    LET F=10
    LET G=20
    RETURN
948 LET E=3
    LET F=9
    LET G=13
    RETURN
952 LET E=12
    LET F=14
    LET G=18
    RETURN
956 LET E=4
    LET F=13
    LET G=15
    RETURN
960 LET E=6
    LET F=14
    LET G=16
    RETURN
964 LET E=15
    LET F=17
    LET G=18
    RETURN
968 LET E=7
    LET F=16
    LET G=20
    RETURN
972 LET E=13
    LET F=16
    LET G=19
    RETURN
976 LET E=9
    LET F=18
    LET G=20
    RETURN
980 LET E=11
    LET F=17
    LET G=19
    RETURN

An extract from the renumbered 1970s style listing is pictured. I'll spare you the entire listing, for the time being. Now I just have to implement the interpreter so I can test the game!