RUN すると上の表示になります。
よく見ると下中央付近に色が変わっているところがあります。
カーソルキーで移動し、スペースキーで持つ・離すを切り替えます。
(代わりにジョイスティック1を使用できます)
離している時は黄色表示、持っている時は赤表示です。
持っている状態(赤色表示)で移動してパーツを移動できます。
これでパーツを移動していきながら、
中央上にある大きなパーツ(娘)を中央下まで移動させていきます。
ヒントとして、経過の画像をいくつか入れています。
YouTube 動画はクリアまでの手順を行ってます。ご注意下さい。
IchigoJam BASIC 版 もあります。
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 430
410 C=1-C
420 PUT SPRITE X+Y*4,,15
430 IF STRIG(0)+STRIG(1)<0 GOTO 430
440 IF MX=X AND MY=Y GOTO 350
450 PUT SPRITE X+Y*4,,15
460 IF STICK(0)+STICK(1)>0 GOTO 460
470 IF C=0 THEN X=MX:Y=MY:GOTO 350
480 P=P(X+Y*4)
490 IF P=16 GOTO 350
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
すべてスプライト表示にしています。16✕16 の拡大表示が 22 あります!
最初の表示段階で座標は固定で、移動はパターン番号の変更で行っています。
MSX1 では横に 4 つまで表示できるので、ギリギリ表示でき、
縦の数は制限がない、という事でこのように表示していますが、
カーソル表示のために別途スプライトを表示させる事ができないので、
色の変化によってわかるようにしました。
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)
パターン番号が不揃いですが、
0~3、4~7、8~11、12~15 の4ブロックを分割で割り当てていて、
場所に存在するパターン番号によって、
ブロックの形状と位置が計算で求められる仕組みになっています。
シンプルなブロックなので、DATA に入れず、
CHR$ と STRING$ で直接 SPRITE$ へ入れています。
難易度の高いパズルなので、どうしてもクリアできない場合は
770~810 の DATA を変える事で、ブロックを変更し、難易度をやさしくできます。
770 DATA 8,12,13, 8
780 DATA 10,14,15,10
790 DATA 0, 0, 0, 0
800 DATA 0, 4, 5, 0
810 DATA 0,16,16, 0
770 DATA 8,12,13, 8
780 DATA 10,14,15,10
790 DATA 8, 0, 0, 8
800 DATA 10, 0, 0,10
810 DATA 0,16,16, 0
770 DATA 8,12,13, 8
780 DATA 10,14,15,10
790 DATA 4, 5, 4, 5
800 DATA 0, 0, 0, 0
810 DATA 0,16,16, 0
DATA の並びでそのままスプライト表示されています。
ブロックの形状とパターン番号の対応は次のとおりです。
必ずブロックの形状に合わせてパターン番号を指定して下さい。