# Damian Walker

Personal Web Pages

# And Another Tiny BASIC Game: Mugwump

Tuesday, 13th August 2019

As I said when I implemented Hunt the Hurkle, it would be trivial to convert it to play the game of Mugwump too. The only difference between the games is what gets reported when you guess the position of the creature wrongly. In Hurkle you get the direction it lies in relative to your guess; in Mugwump you get the distance.

It took about fifteen minutes to change the Hurkle code to Mugwump, and that includes the time it took to adapt my original code for earlier interpreters by inserting missing line numbers and removing comments. Here's the code in its readable form:

```    REM
REM Mugwump
REM A Demonstration Program for Tiny BASIC
REM

REM --- Variables
REM     C: column or row difference between player guess and mugwump position
REM     D: total distance between player guess and mugwump position
REM     G: mugwump column
REM     H: mugwump row
REM     M: moves taken
REM     S: random number seed
REM     X: player guess column
REM     Y: player guess row

REM --- Initialise the random number generator
PRINT "Think of a number."
INPUT S

REM --- Initialise the game
GOSUB 200
LET G=R-(R/10*10)
GOSUB 200
LET H=R-(R/10*10)
LET M=0

REM --- Input player guess
10 PRINT "Where is the mugwump? Enter column then row."
INPUT X,Y
IF X>=0 THEN IF X<=9 THEN IF Y>=0 THEN IF Y<=9 THEN GOTO 20
PRINT "That location is off the grid!"
GOTO 10

REM --- Process player guess
20 LET M=M+1
PRINT "The mugwump is..."
LET D=0
LET C=G-X
GOSUB 60
LET C=H-Y
GOSUB 60
IF D=0 THEN GOTO 40
PRINT "...",D," cells away."
IF M>10 THEN GOTO 50
PRINT "You have taken ",M," turns so far."
GOTO 10

REM --- Player has won
40 PRINT "...RIGHT HERE!"
PRINT "You took ",M," turns to find it."
END

REM --- Player has lost
50 PRINT "You have taken too long over this. You lose!"
END

REM --- Helper subroutine to calculate distance from player to mugwump
REM     Inputs: C - difference in rows or columns
REM             D - running total distance
REM     Output: D - running total distance, updated
60 IF C<0 THEN LET C=-C
LET D=D+C
RETURN

REM --- Random number generator
REM     Input:   S - current seed
REM     Outputs: S - updated seed
REM              R - generated random number
200 LET S=(42*S+127)-((42*S+127)/126*126)
LET R=S
RETURN```

One thing I have noticed is that the renumbering process can become tedious if I have to make significant revisions to the program afterwards. This looks like an excellent job for an awk script. Once I get fed up enough with manual renumbering to write that script, I'll post it here.