C64_Chaze_In_The_Maze-xcBASIC3/MazeGenerator/MazeGenerator.bas

107 lines
3.0 KiB
QBasic

'MEMCPY 2, $C000, $8D
Const HIGHEST_Y = 24 : Const HIGHEST_X = 39
Const SCREEN_ADDR = 1024
Const WALL = 160 : Const SPACE = 32 : Const MOUSE = 81
Dim ScreenPosition as WORD fast : Dim NEWScreenPosition as WORD fast
Dim NextDirection as BYTE fast: Dim FirstNextDirection as BYTE fast
Dim Steps as WORD fast: Dim MaxSteps as WORD fast
Dim FinalScrPosition as WORD fast
Dim scrAddrCache(25) as WORD @loc_scrAddrCache
loc_scrAddrCache:
DATA AS WORD 1024, 1064, 1104, 1144, 1184, 1224, 1264, 1304, 1344, 1384
DATA AS WORD 1424, 1464, 1504, 1544, 1584, 1624, 1664, 1704, 1744, 1784
DATA AS WORD 1824, 1864, 1904, 1944, 1984
Dim DirArray(4) as INT @loc_DirArray
loc_DirArray:
DATA AS INT 2, -80, -2, 80
function random as byte (a as byte, b as byte) static
poke $2A7, a
poke $2A8, b
asm
lda #$ff
sta $d40e
sta $d40f
lda #$80
sta $d412
rand:
lda $d41b
cmp $2A8
bcs rand
adc $2A7
sta $2A9
end asm
random = peek($2A9)
end function
print "press a key (i need randomness)"
poke 198, 0: wait 198, 1
poke 53280,0 : poke 53281,0
restart:
memset SCREEN_ADDR, 1000, WALL
memset SCREEN_ADDR, 40, SPACE
memset scrAddrCache(24), 40, SPACE
FOR RowIndex As BYTE = 1 to 23
'No SPACEing at the column 0!
Poke scrAddrCache(RowIndex) + HIGHEST_X, SPACE
Next RowIndex
Steps = 0 : MaxSteps = 0 : FinalScrPosition = 0
'REM ScreenPosition = SCREEN_ADDR + 81 + 80 * CINT(10 * RND() ) + 2 * CINT(10 * RND() )
ScreenPosition = SCREEN_ADDR + 81 + (80 * cint(Random (0, 10))) + 2 * Random (0, 10) 'CINT *** VERY IMPORTANT ***
poke ScreenPosition, 4 ' "D"
DigAnotherLocation:
NextDirection = Random (0, 4) : FirstNextDirection = NextDirection
if Steps > MaxSteps then MaxSteps = Steps: FinalScrPosition = NEWScreenPosition
TryDiggingAgain:
NEWScreenPosition = ScreenPosition + DirArray(NextDirection)
If Peek(NEWScreenPosition) = WALL Then
Poke NEWScreenPosition, NextDirection
Poke ScreenPosition + SHR(DirArray(NextDirection), 1), SPACE
ScreenPosition = NEWScreenPosition
Steps = Steps + 1
Goto DigAnotherLocation
End If
NextDirection = (NextDirection + 1) AND 3 'Keep NextDirection between 0 and 3
If NextDirection <> FirstNextDirection then Goto TryDiggingAgain
NextDirection = Peek(ScreenPosition) : Poke ScreenPosition, SPACE
Steps = Steps - 1
If NextDirection < 4 then
ScreenPosition = ScreenPosition - DirArray(NextDirection) 'Backtrack!
Goto DigAnotherLocation
end If
Poke ScreenPosition, 1 : Poke FinalScrPosition, 2
Print "{HOME} max steps: " ; MaxSteps ; " - final loc: " ; FinalScrPosition
' ****MOUSE****
Poke ScreenPosition, MOUSE : NextDirection = 2
Mouse:
wait $d011, 128 : wait $d011, 128, 128 : wait $d011, 128
NEWScreenPosition = ScreenPosition + SHR(DirArray(NextDirection), 1)
if NEWScreenPosition = FinalScrPosition then goto restart
If Peek(NEWScreenPosition) = SPACE then
Poke NEWScreenPosition, MOUSE : Poke ScreenPosition, SPACE
ScreenPosition = NEWScreenPosition
NextDirection = (NextDirection - 2) AND 3
End If
NextDirection = (NextDirection - 1) AND 3
goto Mouse
'MEMCPY $C000, 2, $8D