• 題名
    テンケス+4x4文字 (電子工作マガジン2017年SPRING号掲載)

  • 開発環境
    IchigoJamBASIC1.2.0

  • 内容
    プログラムは2つのプログラムから成っています。
    プログラム1:4x4文字を表示します。
    プログラム2:数字をスライドさせ、同じ数字を重ねて消していくパズルゲームです。
  • テンケス
  • 使い方(4x4文字)
    プログラム1は、4バイト×4バイトの文字を表示するプログラムです。
    配列[101]に表示したい文字のアスキーコード、USR関数の第2引数に表示したいVRAMアドレスを入れてコールします。

    *注意:プログラムサイズを小さくするため表示アドレスのチェックは行っていません。
    ですので、VRAM以外および#B9C以後のアドレスを表示位置に指定するとプログラムやデータが破壊されます。

    ・使用例
    10 [101]=65:X=USR(#700,#900):'画面左上に「A」が表示されます
    20 [101]=97:X=USR(#700,#900+10+32*6):'横10,縦6の位置に「a」が表示されます
    30 [101]=255:X=3:Y=8:Z=USR(#700,#900+X+32*Y):'横3,縦8の位置に「イチゴ」が表示されます

  • 遊び方(テンケス)
    4x4マスの中に数字が表示されます。
    矢印キーを押すと数字がその方向に滑っていきます。
    同じ数同士がぶつかると重なって次の数に変わります。
    数字が「10」まで進むとマスから消えます。
    数字が移動するごとに新たに2つの数字が表示されます。
    空きマスが1マス以下になるとゲームオーバーです。
    空きマスの探索中は左下に数字が表示されますので、数字が消えるまでキーは押さないでください。

  • プログラムのしくみ
  • 変数表(プログラム2)
    I,J,Wループ用
    Vキー入力
    Sスコア
    R乱数用
    X,YマスのXY座標
    K,Zマスの座標を一列に変換した値
    AUSR関数用ダミー変数
    Zマスの移動元の配列添字
    Uマスの移動先の配列添字
    [0]~[15]マスの中の数字(画面表示は、左上[0]~右下[15])
    [21]~[24]矢印キーが押された時のジャンプ先行番号
    [101]4x4文字用

    各行の処理
    1行コメント
    2行初期画面表示・分岐先行の設定
    3行数字を表示×2
    4行キー入力・スコア表示
    5行空きマス探索・ゲームオーバー判断
    6行マス内の数字をアスキーコードに変換
    7行4x4文字を表示
    8,9行左キーが押された場合の処理
    10,11行右キーが押された場合の処理
    12,13行上キーが押された場合の処理
    14行下キーが押された場合の処理
    15行数字を表示してサブルーチン終了

  • プログラムの具体的な入力方法
    プログラムリスト中の「□」はスペース1個です。
    カードの枠線は「左ALT+SHIFT+キー」で入力します。
    ━ 左ALT+SHIFT+H
    ┃ 左ALT+SHIFT+I
    ┏ 左ALT+SHIFT+O(オー)
    ┓ 左ALT+SHIFT+P
    ┗ 左ALT+SHIFT+Q
    ┛ 左ALT+SHIFT+R
    プログラム1の50行のLRUN文にプログラム2の保存番号を記入すると、プログラム1を実行後、自動的にプログラム2を読み込んで実行できます。


  • プログラムの改造
    プログラム1は、このゲーム以外でも使用することができます。
    上記の使い方を参考に自作プログラム等に組み込んで使用してください。
    なおプログラム1の2行目は機械語ルーチンを書き込むアドレスです。
    現在はキャラクタ定義用のアドレスに書き込まれていますが、該当キャラクタを使用したい場合はアドレスを適宜変更してください。
    (その場合はUSR関数の呼び出しアドレスも変えてください)
    プログラム2の"if[k]=10"がマスから消える数字ですので、10以下にすると難易度が下がります。
    (11以上にすると数字以外の文字になってしまいます)

  • テンケス(プログラム1)
    10'4x4
    20 Z=#700
    30 pokeZ,224,180,64,24,8,35,27,2,202,51,91,92,219,0,155,24,4,38,64,180,4,33,28,120,93,120,1,180,8,32,0,34,0,38,0,39,100,8,86,65,118,0,109,8,87,65,127,0,1,56
    40 pokeZ+#32,247,209,116,8,125,8,1,188,3,34,47,70,23,64,191,0,38,70,22,64,62,68,128,54,6,112,164,8,173,8,1,48,1,57,242,209,28,48,2,51,64,188,1,62,216,209,224,188,112,71
    50 LRUN(プログラム2の保存番号)
    

    テンケス(プログラム2)
    1 'イッチ
    2 clv:let[21],4,5,6,7:cls:?"┏━━━━┳━━━━┳━━━━┳━━━━┓ SCORE:0":FORI=1TO4:forj=1to4:?"┃□□□□┃□□□□┃□□□□┃□□□□┃":next:?"┣□□□□╋□□□□╋□□□□╋□□□□┫":next:lc0,20:?
    "┗━━━━┻━━━━┻━━━━┻━━━━┛"
    2 clv:let[21],4,5,6,7:cls:?"「----v----v----v----フ SCORE:0":FORI=1TO4:forj=1to4:?"|    |    |    |    |":next:?">----+----+----+----<":next:lc0,20:?"L----^----^----^----ノ"
    3 gsb5:gsb5
    4 v=inkey()-27:ifv<1orv>4goto4elsegsb[20+v]*2:lc28,0:?s:goto3
    5 j=1:fori=0to15:j=j*[i]:next:ifj?"GAME OVER":endelser=rnd(16):lc0,21:if[r]?r:goto5else[r]=1:gsb6:?"  ";:rtn
    6 fory=0to3:forx=0to3:k=y*4+x:[101]=[k]:if[k][101]=[k]+48:if[k]=10[k]=0:[101]=12:s=s+10
    7 a=usr(#700,#921+y*160+x*5):next:next:rtn
    8 forw=0to2:fory=0to3:forx=0to2:z=y*4+x:u=z+1:if[z]OR[u]if[z]=0[z]=[u]:[u]=0elseif[z]=[u]s=s+[z]:[z]=[z]+1:[u]=0
    9 goto15
    10 forw=0to2:fory=0to3:forx=1to3:z=y*4+4-x:u=z-1:if[z]or[u]if[z]=0[z]=[u]:[u]=0elseif[z]=[u]s=s+[z]:[z]=[z]+1:[u]=0
    11 goto15
    12 forw=0to2:forx=0to3:fory=0to2:z=y*4+x:u=z+4:if[z]OR[u]if[z]=0[z]=[u]:[u]=0elseif[z]=[u]s=s+[z]:[z]=[z]+1:[u]=0
    13 goto15
    14 forw=0to2:forx=0to3:fory=1to3:z=(4-y)*4+x:u=z-4:if[z]or[u]if[z]=0[z]=[u]:[u]=0elseif[z]=[u]s=s+[z]:[z]=[z]+1:[u]=0
    15 next:next:gsb6:next:rtn

    テンケス(プログラム1のアセンプラリスト)
    push	{r5,r6,r7}
    add	r0,r0,r1	'描画実VRAM
    mov	r3,#8
    lsl	r3,r3,8
    add	r3,#ca		'[101]の下位アドレス=#8CA
    ldrb	r3,[r3,r1]	'[101]の数
    lsl	r3,r3,3		'キャラジェネアドレス
    add	r3,r3,r2	'実キャラジェネアドレス
    mov	r2,#03		'0000 0011マスク
    mov	r6,#4		'大ループカウンタ
    @LOOP1
    push	{r6}		'大ループカウンタ保存
    mov	r1,#4		'小ループカウンタ
    ldrb	r4,[r3,0]	'1行目
    ldrb	r5,[r3,1]	'2行目
    @LOOP2
    cpy	r7,r5		'2行目
    and	r7,r2		'0000 0011マスク
    lsl	r7,r7,2
    cpy	r6,r4		'1行目
    and	r6,r2		'0000 0011マスク
    add	r6,r7
    add	r6,#80		'疑似グラフィックキャラ
    strb	r6,[r0,0]	'描画
    lsr	r4,r4,2
    lsr	r5,r5,2
    add	r0,1		'描画位置右移動
    sub	r1,#1		'小ループカウンタ減算
    bne	@LOOP2
    add	r0,#1C
    add	r3,2
    pop	{r6}		'大ループカウンタ取り出し
    sub	r6,1		'大ループカウンタ減算
    bne	@LOOP1
    pop	{r5,r6,r7}
    ret
    


MixJuiceでのダウンロードURLは下記になります。
テンケス(Prpgram1) http://tagiyasoft.blog.jp/tenkes1.bin
テンケス(Prpgram2) http://tagiyasoft.blog.jp/tenkes2.bin

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

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