Skip to content

Instantly share code, notes, and snippets.

@fu-sen
Last active April 19, 2025 02:15
Show Gist options
  • Save fu-sen/201189e0c1ffb333206598ef10a9f69f to your computer and use it in GitHub Desktop.
Save fu-sen/201189e0c1ffb333206598ef10a9f69f to your computer and use it in GitHub Desktop.
' Klotski | MSX-BASIC
' Copyright (c) 2025 BALLOON | FU-SEN
' The MIT License (MIT) - https://mit.balloon.net.eu.org/#2025
100 DEFINT A-Z
110 DIM P(19)
120 SCREEN 1,3
130 KEY OFF
140 SPRITE$(0)=CHR$(0)+STRING$(14,127)+STRING$(2,0)+STRING$(14,254)
150 SPRITE$(4)=CHR$(0)+STRING$(14,127)+STRING$(2,0)+STRING$(14,255)
160 SPRITE$(5)=CHR$(0)+STRING$(14,255)+STRING$(2,0)+STRING$(14,254)
170 SPRITE$(8)=CHR$(0)+STRING$(15,127)+CHR$(0)+STRING$(15,254)
180 SPRITE$(10)=STRING$(15,127)+CHR$(0)+STRING$(15,254)
190 SPRITE$(12)=CHR$(0)+STRING$(15,127)+CHR$(0)+STRING$(15,255)
200 SPRITE$(13)=CHR$(0)+STRING$(15,255)+CHR$(0)+STRING$(15,254)
210 SPRITE$(14)=STRING$(15,127)+CHR$(0)+STRING$(15,255)
220 SPRITE$(15)=STRING$(15,255)+CHR$(0)+STRING$(15,254)
230 SPRITE$(16)=STRING$(6,0)+STRING$(4,3)+STRING$(12,0)+STRING$(4,192)
240 SPRITE$(17)=STRING$(8,255)+STRING$(8,0)+STRING$(8,255)
250 RESTORE
260 FOR I=0 TO 19
270 READ P(I)
280 PUT SPRITE I,((I MOD 4)*32+64,INT(I/4)*32+16),15,P(I)
290 NEXT I
300 PUT SPRITE 20,(96,176),14,17
310 PUT SPRITE 21,(128,176),14,17
320 X=1
330 Y=4
340 C=0
350 PUT SPRITE X+Y*4,,10-C*2
360 IF P(13)=12 THEN DEF USR=&H156:U=USR(0):END
370 S=STICK(0)+STICK(1)
380 MX=X-((X>0)*(S=7))+((X<3)*(S=3))
390 MY=Y-((Y>0)*(S=1))+((Y<4)*(S=5))
400 IF STRIG(0)+STRIG(1)=0 GOTO 440
410 IF P(X+Y*4)=16 GOTO 440
420 C=1-C
430 PUT SPRITE X+Y*4,,15
440 IF STRIG(0)+STRIG(1)<0 GOTO 440
450 IF MX=X AND MY=Y GOTO 350
460 PUT SPRITE X+Y*4,,15
470 IF STICK(0)+STICK(1)>0 GOTO 470
480 IF C=0 THEN X=MX:Y=MY:GOTO 350
490 P=P(X+Y*4)
500 A=P/4
510 B=P MOD 4
520 AX=A MOD 2
530 AY=A/2
540 BX=B MOD 2
550 BY=B/2
560 FOR YY=0 TO AY
570 FOR XX=0 TO AX
580 P((X+XX-BX)+(Y+YY-BY)*4)=16
590 PUT SPRITE (X+XX-BX)+(Y+YY-BY)*4,,15,16
600 NEXT XX
610 NEXT YY
620 O=1
630 FOR YY=0 TO AY
640 FOR XX=0 TO AX
650 IF (MX+XX-BX)+(MY+YY-BY)*4<0 OR (MX+XX-BX)+(MY+YY-BY)*4>19 THEN O=0:GOTO 670
660 IF P((MX+XX-BX)+(MY+YY-BY)*4)<16 THEN O=0
670 NEXT XX
680 NEXT YY
690 IF O=1 THEN X=MX:Y=MY
700 FOR YY=0 TO AY
710 FOR XX=0 TO AX
720 P((X+XX-BX)+(Y+YY-BY)*4)=P+(YY-BY)*2+XX-BX
730 PUT SPRITE (X+XX-BX)+(Y+YY-BY)*4,,15,P((X+XX-BX)+(Y+YY-BY)*4)
740 NEXT XX
750 NEXT YY
760 GOTO 350
770 DATA 8,12,13, 8
780 DATA 10,14,15,10
790 DATA 8, 4, 5, 8
800 DATA 10, 0, 0,10
810 DATA 0,16,16, 0
@fu-sen
Copy link
Author

fu-sen commented Jan 22, 2025

klotski

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment