From e2ef600dd222264a5c5606e7bb1a9dbe699aa386 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Sat, 24 Jan 2026 13:24:04 -0800 Subject: [PATCH] Add visibility algorithm to solving --- images/apple/MAZERUNR.po | Bin 143360 -> 143360 bytes src/makefile | 7 ++- src/mkrel | 1 + src/samplesrc/maze.pla | 97 +++++++++++++++++++++++++++++++++++---- 4 files changed, 94 insertions(+), 11 deletions(-) diff --git a/images/apple/MAZERUNR.po b/images/apple/MAZERUNR.po index bb3ab6a61bfd7168277edb6db7d1f83e656df48e..1ef0de7512910b8dc0328ea5f4c6c2dc898ca95e 100644 GIT binary patch delta 2879 zcmb7`eQZ*2fBk=sh4jn?GThT-B|D}6wQ82hub(jrM?`HLQ& zeBzuccQ6`d`E+#*u)Yba<_35$o*RG}#@h!Mc#}nK2Cr&?JPGlvb zFc6~&e_sIM>`27?em~Rqp59oKhEL6AlQYDACbx}JYfw2cr}qcUpLJe-WucWL2W8sk z-AvAq?ijEyDW@O>W!ax#VsutA2BWsWL|@)-kwW_J0lV($w=ViG+X3r9e_3uO9my{H zasNu>f7M^cL_UIY^$m?p%`ML!9Fydar4pmK*fGo_tsc|SBYq-BAV*KXB?>wQ)*5&G zl2P2QA0Jq1l(XxxfhVO=oeh>tGkVovnY2!C#PvD-Ag=G~CkC6OrTSk6#mx(b9N|$G z%ne#r{V5%^puRhhzpx)3hwmvVsCcYHxoAPQeID7n&gg@S`LTMw5m|eFp83=(9*eQ- zfEhKE&(x5-Zlgx{|EPgGxhkqZcR}_>nR{m%CVRJM_ne6xzOUep=yP`4qT`h;j3+qX zAmQkzTd%CT-GC@cP!C7GR$D6M!Hv+1A=KVSGEC5S=J%($RrH$9UU721`E zSk7R!E3VZ$hQ%`ti^FH?yl>ROtV|K>{}c)2G|S|2b`CO^1AC^<0p?d1yPVWbE<1Hg z*wh87Z3KOC_-xcp?Go(157QyZ-FGJ)BKM=I!gRUuI|}#x&G2W1ACQ|Rqm*d!1!}7_ znOv*!Rw|ir!|MHg_r<)fH&~@485Th!-&I15uHqLD4X`;i$YiYg`2cI%Z-_zGhIwM| z#WmhSGQ&g=3BM-NXr7oP5=I=5niUegXGFL^QDw2@`lV1fvv^(<5-KDiReLXU)Qd&p zP|j{9a%Pe-bP+Xr|B*KGnV)mEKbfCJmrRXePZ$%sO?59CXU?=w^5vn_v5?ethDCbM zu-YTSY?rV((cO$4d1ODmV680H(ygJ!*=_#=_l!IdM8~; z@1mpWr)VZ!`&incR}c5D@9kqR1CD|pia-Oe!W>W<_<86!m;}?{4)Px%|1W4Mhj>m7X@xlr zya>7+c)&KW1JuLofY%9q2pr29{i#$H<|m+E1#iNC2YwuS5=R?||pQVekTY3A_QK;I^5x`{n{Z3;i)PSqivfAx*WE@&Zekv?UPBEX2#e zN>Bm52-X7+*bKa2H`t4X?Us6NpQVOBgZLnL9yxAV!G8e#GW2mvlXl8dp}mf}1IP^{ zchS2uj^?Oi9~WM%QJK;mWV~Cw&TljA~rD< z^Roh)PTrWDjMcFsGCm?%DMiDnt5@QwDL-3I_@=xb`<lDQDDyt(t~%T2hy!A{{b~KWn2IN delta 2023 zcmZ9NeN0nV7{=dod)wOzlmkM+Ewh~;fE^&Z3^l`#X=HN(GUyNq*+{Jf2~(#{W{k03 zmzm8qjLTIcTW0)&NJOJRjXL8@s;$_iP*Tu|i5Z(Q(=nHkZ1dxv?zt^YU6bE=pZ7h_ z`Rq;3-ZA6eF=NkdFe%s&*Xntr(0Wv}w}>US(-OJF627-=E;Ul4AUJ$n zi#hq6!*A`fvU+uS*UaSqm9tHP-BMb%ieNg>Wlc$RdnbpT>zajOqg~cqt?r$gPTM8Y zeGMhL{ren5wmLmkzhASyc7u-zPnkNSTU%{OcVT=@i@K+K2Go)6`Dm|qH?R(M-pRRa zP+fP@%Cgn1Xr1a;XnWN&C)YDlrBm9n_ER=b2X9Pil;(`b8YQe#RF_&SkUghK<#wB+ zgHuyGcTA+)bEt*v7HVO*vvZ;9tSlz-#kt!$?`g*713aIxco#vV-keP}_N)Ut+xe7I zxqwlZ+PQOET&Ua$pSJg`(z0|ipc9Grs8+2^CC&3+UdL)hq9#u}7qxS`wUfFTHd6T{ zeyp4_t|bN%5Soc<${xj<1*$3WAb0Du!zC;(T~%NFFo|nn71@dL4sE=PwYphz8~5&N zV!QX-NdhfxTja0&4{`RH{ z&%tM4AL<^-BJYOY3GJ4$l&$b>mQ1n>wGU9+AnBAU$)uEnw=tg;j2oEjH;{Z8oc9<= zIcrE#dJWTLGYZp?3x-TNrYCtE+yg)BNg35=$~U0{;4-*~S|4g>puYi!fP&f=sO^V# zL$~NNX>qxnx zGsvorLGR4z+UVHDD!}jT&d3>9P(fcjD#!j{vcL!riC?J zp#I>9l z;M$Ht=t?8JqXUt^YMxGbRfB=3e?6Zbm$xF(c$N{*CX-ApnGw7ejSP%v%UY&J{dna@ dDbG@wu%z!SEB>_j;rZf+?1z=U6%XIg{R>6@Z3F-S diff --git a/src/makefile b/src/makefile index 4393daa..6eafe54 100755 --- a/src/makefile +++ b/src/makefile @@ -86,6 +86,7 @@ TILETEST = rel/apple/TILETEST\#FE1000 HGRTEST = rel/apple/HGRTEST\#FE1000 GRTEST = rel/apple/GRTEST\#FE1000 DGRTEST = rel/apple/DGRTEST\#FE1000 +MAZE = rel/apple/MAZE\#FE1000 MEMMGR = rel/MEMMGR\#FE1000 MEMTEST = rel/MEMTEST\#FE1000 FIBERTEST = rel/FIBERTEST\#FE1000 @@ -129,7 +130,7 @@ $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $ $(INITSLOT) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) \ $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(TURTLE) \ $(SINCOS) $(HGRTILE) $(HGRFONT) $(HGRSPRITE) $(HGRLIB) $(TILETEST) $(HGRTEST) $(GRLIB) $(DGRLIB) $(VBLANK) \ -$(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) \ +$(GRTEST) $(DGRTEST) $(MAZE) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) \ $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) \ $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) $(PLAYPCM) $(CONIOTEST) @@ -533,6 +534,10 @@ $(HGRSPRITE): libsrc/apple/hgrsprite.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW libsrc/apple/hgrsprite.pla acme --setpc 4094 -o $(HGRSPRITE) libsrc/apple/hgrsprite.a +$(MAZE): samplesrc/maze.pla $(HGRLIB) $(HGRTILE) $(PLASM) + ./$(PLASM) -AMOW samplesrc/maze.pla + acme --setpc 4094 -o $(MAZE) samplesrc/maze.a + $(HGRTEST): samplesrc/hgrtest.pla $(HGRLIB) $(PLASM) ./$(PLASM) -AMOW samplesrc/hgrtest.pla acme --setpc 4094 -o $(HGRTEST) samplesrc/hgrtest.a diff --git a/src/mkrel b/src/mkrel index c0a6999..eb25af0 100755 --- a/src/mkrel +++ b/src/mkrel @@ -113,6 +113,7 @@ cp rel/apple/TILETEST#FE1000 prodos/demos/apple2/TILETEST.REL cp rel/apple/HGRTEST#FE1000 prodos/demos/apple2/HGRTEST.REL cp rel/apple/GRTEST#FE1000 prodos/demos/apple2/GRTEST.REL cp rel/apple/DGRTEST#FE1000 prodos/demos/apple2/DGRTEST.REL +cp rel/apple/MAZE#FE1000 prodos/demos/apple2/MAZE.REL mkdir prodos/demos/apple2/spiders cp rel/apple/SFM#FE1000 prodos/demos/apple2/spiders/SFM.REL diff --git a/src/samplesrc/maze.pla b/src/samplesrc/maze.pla index 09b63b9..0d2c023 100644 --- a/src/samplesrc/maze.pla +++ b/src/samplesrc/maze.pla @@ -16,17 +16,25 @@ const DIR_DOWN = 4 const DIR_RIGHT = 8 const CELL_TRACED = 16 const CELL_SOLVED = 32 +const CELL_VISITED = 4 +const SEEN_TOP = 8 +const SEEN_LEFT = 16 +const CELL_SEEN = 32 const MAZE_WIDTH = 39 const MAZE_HEIGHT = 23 -const PLAYER = 4*8 -const CRUMB = 5*8 +const PLAYER = 8*8 +//const CRUMB = 5*8 byte mazeTileSet = $00, $00, $00, $00, $00, $00, $00, $00 // No walls byte = $7F, $00, $00, $00, $00, $00, $00, $00 // Top wall byte = $03, $03, $03, $03, $03, $03, $03, $03 // Left wall byte = $7F, $03, $03, $03, $03, $03, $03, $03 // Top & Left walls +byte = $00, $00, $00, $00, $08, $00, $00, $00 // No walls + crumb +byte = $7F, $00, $00, $00, $08, $00, $00, $00 // Top wall + crumb +byte = $03, $03, $03, $03, $0B, $03, $03, $03 // Left wall + crumb +byte = $7F, $03, $03, $03, $0B, $03, $03, $03 // Top & Left walls + crumb byte = $00, $00, $10, $54, $54, $54, $10, $00 // Player -byte = $00, $00, $00, $00, $08, $00, $00, $00 // Bread crumb +//byte = $00, $00, $00, $00, $08, $00, $00, $00 // Bread crumb word maze[] = $0400,$0480,$0500,$0580,$0600,$0680,$0700,$0780 word = $0428,$04A8,$0528,$05A8,$0628,$06A8,$0728,$07A8 @@ -34,6 +42,7 @@ word = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0 word arg, seed, moveCnt byte entry, exit, solved +byte viewFlag = TRUE res[4] tics def cellSetFlags(x, y, flags)#0 @@ -246,6 +255,64 @@ def cellSolve(x, y)#0 heaprelease(traceStart) end +def cellVis(x, y, dir)#0 + if not (maze.[y, x] & CELL_SEEN) + if (dir & DIR_RIGHT) and (maze.[y, x] & WALL_LEFT) + cellSetFlags(x, y, SEEN_LEFT) + tileDraw(x, y, @mazeTileSet + 8 * ((maze.[y, x] & (maze.[y, x] >> 3)) & 7)) + return + fin + if (dir & DIR_DOWN) and (maze.[y, x] & WALL_TOP) + cellSetFlags(x, y, SEEN_TOP) + tileDraw(x, y, @mazeTileSet + 8 * ((maze.[y, x] & (maze.[y, x] >> 3)) & 7)) + return + fin + cellSetFlags(x, y, CELL_SEEN | SEEN_TOP | SEEN_LEFT) + tileDraw(x, y, @mazeTileSet + 8 * (maze.[y, x] & 7)) + if maze.[y, x + 1] & WALL_LEFT + if not (maze.[y, x + 1] & CELL_SEEN) + cellSetFlags(x + 1, y, SEEN_LEFT) + tileDraw(x + 1, y, @mazeTileSet + 8 * ((maze.[y, x + 1] & (maze.[y, x + 1] >> 3)) & 7)) + fin + fin + if maze.[y + 1, x] & WALL_TOP + if not (maze.[y + 1, x] & CELL_SEEN) + cellSetFlags(x, y + 1, SEEN_TOP) + tileDraw(x, y + 1, @mazeTileSet + 8 * ((maze.[y + 1, x] & (maze.[y + 1, x] >> 3)) & 7)) + fin + fin + fin +end + +def cellView(x, y)#0 + byte vis + + cellSetFlags(x, y, CELL_SEEN | SEEN_TOP | SEEN_LEFT | CELL_VISITED) + tileDraw(x, y, @mazeTileSet + 8 * (maze.[y, x] & 7)) + if viewFlag + vis = x + while not (maze.[y, vis] & WALL_LEFT) + vis-- + cellVis(vis, y, DIR_LEFT) + loop + vis = y + while not (maze.[vis, x] & WALL_TOP) + vis-- + cellVis(x, vis, DIR_UP) + loop + vis = x + repeat + vis++ + cellVis(vis, y, DIR_RIGHT) + until (vis >= MAZE_WIDTH) or (maze.[y, vis] & WALL_LEFT) + vis = y + repeat + vis++ + cellVis(x, vis, DIR_DOWN) + until maze.[vis, x] & WALL_TOP + fin +end + def mazeGen#0 byte x, y @@ -291,42 +358,43 @@ end def mazePlay byte x, y, quit, key + if viewFlag + hgrColor(0) + hgrRect(0, 0, 279, 191) + fin cellSetFlags(0, entry, WALL_LEFT) // Block off entry x = 0 y = entry zero32 while TRUE - tileXorDraw(x, y, @mazeTileSet + PLAYER) + cellView(x, y) + tileOrDraw(x, y, @mazeTileSet + PLAYER) while not conio:keypressed() addi16(1) loop + tileDraw(x, y, @mazeTileSet + 8 * (maze.[y, x] & 7)) key = toupper(conio:getkey() & $7F) - tileXorDraw(x, y, @mazeTileSet + PLAYER) when key is 'I' if !(maze.[y, x] & WALL_TOP) - tileOrDraw(x, y, @mazeTileSet + CRUMB) y-- moveCnt++ fin break is 'M' if !(maze.[y + 1, x] & WALL_TOP) - tileOrDraw(x, y, @mazeTileSet + CRUMB) y++ moveCnt++ fin break is 'J' if !(maze.[y, x] & WALL_LEFT) - tileOrDraw(x, y, @mazeTileSet + CRUMB) x-- moveCnt++ fin break is 'K' if !(maze.[y, x + 1] & WALL_LEFT) - tileOrDraw(x, y, @mazeTileSet + CRUMB) x++ moveCnt++ if x == MAZE_WIDTH; return TRUE; fin // Solved! @@ -336,6 +404,7 @@ def mazePlay return FALSE wend loop + return TRUE end def atoi(strptr)#1 @@ -362,6 +431,10 @@ def atoi(strptr)#1 end arg = argNext(argFirst) +if ^arg and ^(arg + 1) == 'V' + viewFlag = FALSE + arg = argNext(arg) +fin if ^arg *rndnum = atoi(arg) else @@ -378,6 +451,7 @@ repeat seed = *rndnum conio:textmode(40) hgrMode(hgrPage1) + hgrDrawBuf(hgrPage1) tileDrawBuf(hgrPage1) mazeInit tileFromText(0, @mazeTileSet) @@ -393,8 +467,11 @@ repeat puts("Timer = "); puti32(@tics) load32(@tics); divi16(1085); store32(@tics) puts(" ("); puti32(@tics); puts(" secs)\n") + for moveCnt = 0 to 1000 + if conio:keypressed(); getc; fin + next puts("Play again? (Y/N):") -until toupper(conio:getkey()) == 'N' +until toupper(conio:getkey()) <> 'Y' conio:textmode(0) done