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.