• 題名
    JOLTSZX (電子工作マガジン2016年WINTER号掲載)

  • 開発環境
    IchigoJamBASIC1.1.1

  • 内容
    テトリスもどきゲームです。TETRIS

  • 遊び方
    キー操作で落ちてくるピースを操作して底から積み上げていきます。
    1列全て揃うとその段が消えて、段が詰まります。
    最上段まで積み上がってしまうとゲームオーバーです。

  • 操作方法
    テンキーでピースを操作します。

    [1]:左移動
    [2]:回転
    [3]:右移動

    回転方向は時計回りのみで、落下はありません。

  • プログラムのしくみ


  • 変数表
    A現位置のピース形状(復帰用に保存)
    B現位置のピース形状
    C移動後のピース形状
    D回転後のピース形状
    Kピースの高さ
    Pピース種類
    Qピースの向き
    R回転後のピースの向き
    U移動後のピースの位置
    V現在のピースの位置
    L入力キー
    Sスコア
    I,Jループ用
    W頻出数=32
    [0]~[27]ピース形状
    <br/>
    各行の処理
    10行コメント行
    20行機械語サブルーチン、初期画面作成
    30行ピース形状
    40行ピースの出現、キー入力
    50行ピースが移動できるか?
    60行回転前のピースを消去
    70行移動前のピースを消去
    80行移動後のピースを描画
    90行積み上がったらピースのキャラクタを変更
    100行1段揃ったか?
    110行1段落とす
    120行ピース出現に戻る


    1段落ちの処理はBASICだと処理が遅いので機械語にしました。

    各ピースは下記の形状をしており、1バイトで表され、配列変数に納められます。
    画面表示の時に、左下から右上にかけて、1bit~8bitの順に展開されます。
    ○は常に空マスで、ピースの描画基点となります。
    3x3マスで表示するため、オリジナルのテトリスにある「I」形状は無く、代わりに「+」形状が使われています。

    各ビットを展開した時の並び方
     123
    1■■○
    2■■
    3
     #D8
    
     123 123
    1  ○ ■ ○
    2 ■■ ■■
    3■■   ■ 
     #33	 #5A
    
     123 123
    1  ○  ■○ 
    2■■  ■■ 
    3 ■■ ■  
     #1E	 #99
    
     123 123 123 123
    1■■○   ○  ■○   ○
    2■   ■■■  ■  ■
    3■     ■ ■■  ■■■
     #C9	 #3C	 #93	 #0F
    
     123 123 123 123
    1  ○  ■○   ○ ■■○
    2■■■  ■    ■  ■
    3■    ■■ ■■■  ■
     #39	 #96	 #27	 #D2
    
     123 123 123 123
    1  ○  ■○  ■○  ■○ 
    2■■■ ■■  ■■■  ■■ 
    3 ■   ■       ■  
     #3A	 #9A	 #B8	 #B2
    
     123 123 123
    1 ■○
    2■ ■
    3 ■
     #AA
    
    

  • プログラムの具体的な入力方法
    20行めは機械語サブルーチンになっていますので、間違えないように入力してください。
    入力間違いがあるとエラーメッセージが出ずに、IchigoJamが操作不能になってしまう可能性があります。
    ですので、プログラムを入力したら、まずSAVEしてからRUNするようにしてください。
    もしIchigoJamが操作不能になってしまった場合は電源を入れ直してください。
    (保存していないプログラムは消えてしまいます)

  • プログラムの改造
    40行の「P=RND(7)」を「P=RND(6)」にすると「+」のピースが出現しなくなるので少しだけ簡単になります。


  • JOLTSZX
    10 'テトリス
    20 CLS:CLV:W=32:poke#8A0,3,70,202,92,32,51,202,84,64,59,26,10,8,42,248,209,1,48,2,70,15,35,26,64,11,42,240,209,112,71:LC15,0:?"SCORE:":FORI=0TO19:POKE#900+I*W,2:POKE#90B+I*W,2:IFI<12POKE#B80+I,2
    30 NEXT:LET[0],216,216,216,216,51,90,51,90,30,153,30,153,201,60,147,15,57,150,39,210,58,154,184,178,170,170,170,170
    40 V=#925:P=RND(7):Q=RND(4):R=Q:FORK=0TO18:U=V+W:L=INKEY():IFLL=(L-1)%3-1:IFL=0R=(Q+1)%4ELSEU=V+W+L
    50 A=[P*4+R]:B=A:FORI=0TO2:FORJ=0TO2:IFB&1ANDPEEK(U-I*W+J)=2IFK=0LC15,5:?"GAME OVER":ENDELSEI=3:J=3:IFQ<>RR=Q:NEXT:NEXT:GOTO50ELSEIFLU=U-L:L=0:NEXT:NEXT:GOTO50ELSEU=U-W:K=18
    60 B=B>>1:NEXT:NEXT:B=A:C=B:D=[P*4+Q]:FORI=0TO2:FORJ=0TO2:IFD&1POKEV-I*W+J,0
    70 IFB&1POKEV-I*W+J,0
    80 IFC&1POKEU-I*W+J,1
    90 B=B>>1:C=C>>1:D=D>>1:NEXT:NEXT:V=U:Q=R:NEXT:B=A:FORI=0TO2:FORJ=0TO2:IFB&1POKEV-I*W+J,2
    100 B=B>>1:NEXT:NEXT:FORI=0TO19:FORJ=0TO9:IFPEEK(#B61-I*W+J)=0J=20
    110 NEXT:IFJ=9S=S+1:LC23,0:?S:FORJ=0TO9:POKE(#B61-I*W+J),0:NEXT:J=USR(#8A0,#B40-I*W):I=-1
    120 NEXT:GOTO40
    


    機械語サブルーチン(一段落ち)
    USR(#8A0,*)
    引数:消えた行の1行上のアドレス/戻値:無し(不定)
    @LBL1
    cpy	R3,R0		'R3=R0		'R3=転送元アドレス(USR引数)
    @LBL2
    ldrb	R2,[R1,R3]	'R2=[R1+R3]	'キャラクタ=[実アドレス+転送元アドレス]
    add	r3,#20		'R3+=#20	'R3=転送先アドレス
    strb	r2,[r1,r3]	'[R1+R3]=R2	'[実アドレス+転送元アドレス]=キャラクタ
    sub	r3,#40		'R3-=#40	'R3=転送元アドレスを1行上
    lsr	r2,r3,8		'R2=R3>>8	'R2=転送元アドレスの上位バイト
    cmp	r2,#8		'R2-8		'R2が8か?(転送元アドレスが#8**か?)
    bne	@LBL2		'IF!0GOTO @LBL2	'偽なら@LBL2へ
    add	r0,#1		'R0+=1		'転送元アドレスを隣の列へ
    cpy	r2,r0		'R2=R0		'R2=転送元アドレス
    mov	r3,#f		'R3=#0F		'マスク
    and	r2,r3		'R2&=R3		'R2の下8bit
    cmp	r2,#b		'R2-#0B		'11列めか?
    bne	@LBL1		'IF!0GOTO @LBL1	'偽なら@LBL1へ
    ret			'RET
    
MixJuiceでのダウンロードURLは下記になります。
TETRIS http://tagiyasoft.blog.jp/tetris.bin

以下のように入力してD/Lしてください。
NEW
? MJ GET tagiyasoft.blog.jp/tetris.bin

ブラウザでD/LしてIchigoJamに転送する場合は、通信ソフトでバイナリ送信をしてください。
(例:TeraTermの場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)