OTHER CONTRIBUTIONS: MAZE GENERATOR

Generation of random mazes via backtracking. This program is a port of the example written in XC=BASIC 3.1 by JJ Flash, with the addition of a "mouse" that moves inside the maze in search of the "cheese".

source compile sandbox issues? back to examples

SOURCE CODE ()

    DEFINE DEFAULT TYPE SIGNED WORD

    VAR finalScrPosition AS WORD

    CONST wall = 95 : CONST space = 32 : CONST mouse = 81

    VAR nextDirection AS BYTE: VAR firstnextDirection AS BYTE

    DIM dirArray(4) = #{ 2, -80, -2, 80 }

    PRINT "press a key (i need randomness)"
    WAIT KEY

    CLS BLACK
    INK WHITE

    RANDOMIZE TIMER

    restart:
    FOR i = 0 TO 999: POKE Txa+i, wall: NEXT
    FOR i = 0 TO 39: POKE Txa+i, space: NEXT
    FOR i = 0 TO 39: POKE Txa+984+i,space: NEXT

    screenPosition = Txa+79
    FOR i = 1 TO 23
        POKE screenPosition, space
        screenPosition = screenPosition + 40
    NEXT

    steps = 0 : maxSteps = 0

    screenPosition = Txa + 81 + (80 * RND(9)) + 2 * RND(9)

    POKE screenPosition, 4 : ' "D"

digAnotherLocation:
        nextDirection = RND(3) : firstnextDirection = nextDirection
        IF steps > maxSteps THEN : maxSteps = steps: finalScrPosition = newScreenPosition : ENDIF

tryDiggingAgain:
        newScreenPosition = screenPosition + dirArray(nextDirection)
        IF PEEK(newScreenPosition) = wall THEN
            POKE newScreenPosition, nextDirection
            POKE screenPosition + ( dirArray(nextDirection)\2 ), space
            screenPosition = newScreenPosition
            steps = steps + 1
            GOTO digAnotherLocation
        ENDIF

        nextDirection = (nextDirection + 1) AND 3
        IF nextDirection <> firstnextDirection THEN : GOTO tryDiggingAgain : ENDIF
        
        nextDirection = PEEK(screenPosition) : POKE screenPosition, space
        steps = steps - 1
        IF nextDirection < 4 THEN
            screenPosition = screenPosition - dirArray(nextDirection)
            GOTO digAnotherLocation
        ENDIF
        
        POKE screenPosition, 1 : POKE finalScrPosition, 2
        HOME : PRINT "max steps: " ; maxSteps ; " - final loc: " ; finalScrPosition
        
        POKE screenPosition, mouse : nextDirection = 2
mouseLabel:
        WAIT VBL
        newScreenPosition = screenPosition + (dirArray(nextDirection)\2)
        IF newScreenPosition = finalScrPosition THEN : GOTO restart : ENDIF
        IF PEEK(newScreenPosition) = space THEN
            POKE newScreenPosition, mouse : POKE screenPosition, space
            screenPosition = newScreenPosition
            nextDirection = (nextDirection - 2) AND 3
        ENDIF
        nextDirection = (nextDirection - 1) AND 3
        GOTO mouseLabel

How to compile and run the example

The instructions here refer to compiling the example from the command line. For Microsoft Windows users we suggest using UGBASIC-IDE, which allows you to download and compile each single example with just one click.



Are instructions for your specific home computer / console missing? First of all, check if your computer is supported by clicking here. If so, since ugBASIC is a language which does not provide abstractions, it is possible that this example will not work on your target. If you think this is an issue, please click here.

Commodore 128 (CPU 8502)

In order to compile the example, type this command on the command line:

Linux

ugbc.c128 -O prg -o contrib_mazegen.prg contrib_mazegen.bas

Windows

ugbc.c128.exe -O prg -o contrib_mazegen.prg contrib_mazegen.bas

For Microsoft Windows users we suggest using UGBASIC-IDE, which allows you to download and compile this example with just one click.

Any problem?

If you have found a problem trying to run this example, if you think there is a bug or, more simply, you would like it to be improved, open an issue for this example on GitHub.
Thank you!

open an issue BACK TO EXAMPLES