First experiments with a Maze Generator
This commit is contained in:
parent
fcd1ed5d3d
commit
3a2f8f0077
|
@ -0,0 +1,107 @@
|
|||
'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
|
||||
Poke 198, 0
|
||||
|
||||
' ****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
|
Loading…
Reference in New Issue