107 lines
3.0 KiB
QBasic
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
|