箱入り娘

 

RUN すると上の表示になります。

よく見ると下中央付近に色が変わっているところがあります。

カーソルキーで移動し、スペースキーで持つ・離すを切り替えます。

(代わりにジョイスティック1を使用できます)

離している時は黄色表示、持っている時は赤表示です。

持っている状態(赤色表示)で移動してパーツを移動できます。

これでパーツを移動していきながら、

中央上にある大きなパーツ(娘)を中央下まで移動させていきます。

 
ヒントとして、経過の画像をいくつか入れています。

 



 

YouTube 動画はクリアまでの手順を行ってます。ご注意下さい。

 

 

IchigoJam BASIC 版 ・ PC-G850 シリーズ版 もあります。

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

スプライトのみの表示!

すべてスプライト表示にしています。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$ へ入れています。

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

スプライトの表示は起動して 0~21 を置いています。

0~19 は DATA を READ しています。

350 PUT SPRITE X+Y*4,,10-C*2

430 PUT SPRITE X+Y*4,,15

590 PUT SPRITE (X+XX-BX)+(Y+YY-BY)*4,,15,16

730 PUT SPRITE (X+XX-BX)+(Y+YY-BY)*4,,15,P((X+XX-BX)+(Y+YY-BY)*4)

その後座標は変更せず、色とパターン番号を変更しています。

これにより BASIC でも大きな表示でも素早く切り替えられるようにしています。


キーバッファのクリア

360 IF P(13)=12 THEN DEF USR=&H156:U=USR(0):END

終了前にいきなり USR がでてきていますが、

&H156 番地のコールにより、キーバッファをクリアします。

1000 DEF USR=&H156:U=USR(0)

(ここでの 1000 は箱入り娘とは関係ありません)

これは次に同等です。INKEY$ を用いる事でキーバッファをなくします。

1000 IF INKEY$<>"" GOTO 1000

STICK(0)・STRIG(0) を用いているので、
カーソルキー(矢印キー)とスペースキーを使用できますが、

これはキーバッファを見ていないので、貯まっていき、

プログラム終了時にキーバッファの内容が出力されます。

カーソルが変な場所に移動したりしている原因がこれです。

上記を実行してキーバッファをクリアする事で、

終了時 OK の下にカーソルが表示されるようにしています。


ブロック(難易度)の変更

難易度の高いパズルなので、どうしてもクリアできない場合は

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 の並びでそのままスプライト表示されています。

ブロックの形状とパターン番号の対応は次のとおりです。

必ずブロックの形状に合わせてパターン番号を指定して下さい。