' ****** START INCLUDE PUTSTRING(x%, y%, s$) ******
SUB PUTSTRING(x%, y%, s$)
FOR c = 1 TO LEN(s$)
sc$ = MID$(s$, c, 1)
this$ = _GETCHR$(ASC(sc$))
FOR yi = 0 TO 7
FOR xi = 0 TO 7
x_pset% = x% + xi + (c-1)*8 : y_pset% = y% + yi
IF MID$(this$, (xi + yi*8) + 1, 1) = "X" AND BETWEEN(x_pset%, 0, _WIDTH-1) AND BETWEEN(y_pset%, 0, _HEIGHT-1) THEN PSET (x_pset%, y_pset%)
NEXT xi
NEXT yi
NEXT c
END SUB
' ****** END INCLUDE PUTSTRING(x%, y%, s$) ******
'📚📚📚📚
' This BASIC Anywhere Machine program by Charlie Veniot
' This program exported from BASIC Anywhere Machine (Version [5.2.3].[2023.07.15.14.59]) on 2023.07.15 at 17.03
'🟠🟠🟠🟠 -— Declarations -—
CONST Go⬅ = 0, Go➡ = 1, Go⬆ = 2, Go⬇ = 3
Side📐 = 4 ' Puzzle side length in number of tiles
ts = 56 ' tile side length in pixels
DECLARE FUNCTION IsPuzzleComplete%()
'🟠🟠🟠🟠 -— Main Program -—
_ALERT("Solve the puzzle.\n\n" + _
"Every tile is labelled with the X,Y position indicating where the tile belongs.\n\n" + _
"Only coloured tiles adjacent to the black tile (labelled 1,1) can move.\n\n" + _
"Click on such a tile, and it will switch positions with the black tile.\n\n" + _
"The puzzle will be solved when each tile is in its correct X,Y position.\n\n" + _
"Click OK to view the tiles in their correct positions, then click on the screen to shuffle the pieces and play.")
🎉NewGame:
temp$ = _PROMPT("How big of a square puzzle? Enter the length of one side (3 to 8).", "4")
IF temp$ = "" THEN SCREEN 0 : PRINT "Have a great day!" : END
Side📐 = VAL( temp$ )
IF NOT BETWEEN(Side📐, 2, 8) THEN Side📐 = 4
SCREEN _NEWIMAGE(Side📐 * ts, Side📐 * ts, 14)
GOSUB ⚙InitTheBoard
_ALERT("Take a look at the completed puzzle. Click on the screen when you are ready to shuffle the puzzle board.")
SLEEP
x = 0 : y = 0 : i = 0
GOSUB 🧩ScrambleTheBoard
_DISPLAY
_ALERT("Okay, done shuffling the puzzle board. Have fun !")
🏁Loopstart:
IF _MOUSEBUTTON THEN
xpos = INT( _MOUSEX / ts ) : ypos = INT( _MOUSEY / ts )
WHILE _MOUSEBUTTON : WEND
IF POINT(xpos*ts,ypos*ts) <> 0 THEN
IF xpos > 0 AND POINT([(xpos-1)*ts], [ypos*ts]) = 0 _
THEN GOSUB ⬅Scroll : GOTO ✅IsPuzzleComplete
IF xpos < (Side📐-1) AND POINT([(xpos+1)*ts], [ypos*ts]) = 0 _
THEN GOSUB ➡Scroll : GOTO ✅IsPuzzleComplete
IF ypos > 0 AND POINT([xpos*ts], [(ypos-1)*ts]) = 0 _
THEN GOSUB ⬆Scroll : GOTO ✅IsPuzzleComplete
IF ypos < (Side📐-1) AND POINT([xpos*ts], [(ypos+1)*ts]) = 0 _
THEN GOSUB ⬇Scroll
✅IsPuzzleComplete:
_DISPLAY
IF IsPuzzleComplete%() _
THEN _ALERT("Woohoo !! you've solved the puzzle !! Let's setup the next game.") : GOTO 🎉NewGame
END IF
END IF
GOTO 🏁Loopstart
END
'🟠🟠🟠🟠 -— Functions -—
FUNCTION IsPuzzleComplete%()
temp% = TRUE
c = 0 : x = 0
DO : y = 0
DO
IF POINT(x*ts, y*ts) <> c THEN temp% = FALSE
c = c + 1
y = y + 1
LOOP UNTIL y = Side📐 OR temp% = FALSE
x = x + 1
LOOP UNTIL x = Side📐 OR temp% = FALSE
IsPuzzleComplete% = temp%
END FUNCTION
'🟠🟠🟠🟠 -— Subroutines -—
⚙InitTheBoard:
c = 0
FOR x = 0 TO (Side📐-1)
FOR y = 0 TO (Side📐-1)
LINE (x*ts,y*ts) - (x*ts+ts-1, y*ts+ts-1), c, BF
LINE (x*ts+8,y*ts+32) - (x*ts+46, y*ts+46), 0, BF
PUTSTRING( [ x*ts+8 ], [ y*ts+35 ], [ STR$(x+1) + "," + REPLACE$(STR$(y+1)," ","") ] )
c = c + 1
NEXT y
NEXT x
_DISPLAY
RETURN
🧩ScrambleTheBoard:
LastGo = 99
another_move:
Go🎲 = int(rnd * 4)
IF [ Go🎲 = Go⬅ AND LastGo = Go➡ ] OR [ Go🎲 = Go➡ AND LastGo = Go⬅ ] _
OR [ Go🎲 = Go⬆ AND LastGo = Go⬇ ] OR [ Go🎲 = Go⬇ AND LastGo = Go⬆ ] _
OR [ x = 0 AND Go🎲 = Go⬅ ] _
OR [ x = (Side📐-1) AND Go🎲 = Go➡ ] _
OR [ y = 0 AND Go🎲 = Go⬆ ] _
OR [ y = (Side📐-1) AND Go🎲 = Go⬇ ] _
THEN GOTO another_move
GOSUB 🔄DoSwitch
LastGo = Go🎲
i = i + 1
IF i < [ (Side📐^2) * 10 ] THEN GOTO another_move
IF IsPuzzleComplete%() THEN i = 0 : GOTO another_move
RETURN
🔄DoSwitch:
SELECT CASE Go🎲
CASE Go⬅
SCROLL ([(x-1)*ts],[y*ts]) - ([x*ts+ts-1],[y*ts+ts-1]), ts, 0, TRUE
x = x - 1
CASE Go➡
SCROLL ([x*ts],[y*ts]) - ([(x+1)*ts+ts-1],[y*ts+ts-1]), ts, 0, TRUE
x = x + 1
CASE Go⬆
SCROLL ([x*ts],[(y-1)*ts]) - ([x*ts+ts-1],[y*ts+ts-1]), 0, -ts, TRUE
y = y - 1
CASE Go⬇
SCROLL ([x*ts],[y*ts]) - ([x*ts+ts-1],[(y+1)*ts+ts-1]), 0, ts, TRUE
y = y + 1
END SELECT
_DISPLAY
RETURN
⬅Scroll:
FOR I = 1 TO ts STEP 4
SCROLL ( [(xpos-1)*ts] , [ ypos*ts ]) _
- ( [(xpos-1)*ts+ts*2-1],[ ypos*ts+ts-1 ] ), -4, 0, TRUE
_DISPLAY
NEXT I
RETURN
➡Scroll:
FOR I = 1 TO ts STEP 4
SCROLL ( [(xpos)*ts], [ ypos*ts ]) _
- ( [(xpos)*ts+ts*2-1], [ ypos*ts+ts-1 ] ), 4, 0, TRUE
_DISPLAY
NEXT I
RETURN
⬆Scroll:
FOR I = 1 TO ts STEP 4
SCROLL ( [xpos*ts] , [ (ypos-1)*ts ]) _
- ( [xpos*ts+ts-1],[ (ypos-1)*ts+ts*2-1 ] ), 0, -4, TRUE
_DISPLAY
NEXT I
RETURN
⬇Scroll:
FOR I = 1 TO ts STEP 4
SCROLL ( [ xpos*ts ] , [ (ypos)*ts ]) _
- ( [xpos*ts+ts-1],[ (ypos)*ts+ts*2-1 ] ), 0, 4, TRUE
_DISPLAY
NEXT I
RETURN
'🟠🟠🟠🟠 -— END OF FILE -—