# Damian Walker

Personal Web Pages

# Progress on Wumpus!

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!