2017年03月

  • 題名
    テンケス+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の場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)

  • 題名
    おにごっこゲーム (電子工作マガジン2017年SPRING号掲載)

  • 開発環境
    IchigoJamBASIC1.2.0

  • 内容
    あなたは猫です。
    天敵の蛸(?)に捕まらないように部屋にあるキャットフードを全て食べつくしてください。 nekotako

  • 遊び方
    テンキーの[2][4][6][8]のキーで上下左右に移動します。
    敵は最短距離で近づいてきますので、捕まらないように逃げながらドットを消してください。
    全てのドットを消すと面クリアです。
    面をクリアするごとに移動速度が少しずつ速くなり、ランダムに配置される壁が少なくなります。

  • プログラムのしくみ
  • 変数表
    A残りのドットの数
    C残りの猫の数
    D自分の移動先のキャラクタ
    I,Jループ用
    K入力されたキー
    O敵の位置
    P自分の位置
    Sスコア
    T敵が移動した後に表示するキャラクタ
    V自分の移動方向
    W移動速度
    X,Y乱数用一時変数

    各行の処理
    1行コメント行
    2行初期設定
    3~4行画面描画
    5行敵を右下に描画
    6行自分を左上に描画
    7行キー入力と移動方向の計算
    8行自分移動先のキャラクタによって移動方向決定
    9行自分の移動とスコア加点
    10行敵と自分の最短移動方向を計算
    11行敵移動先のキャラクタによって移動方向決定
    12行面クリア判定
    13行捕まったか判定
    14行ゲームオーバー処理
    15行TRY AGAIN?
    16行画面中央の3行をクリア


  • プログラムの改造
    2行のW=21の数値を小さくすると全体の速度が早くなります。
    2行のC=2の数値を大きくすると自分の残数が増えます。


  • おにごっこゲーム
    1'ネコタコ
    2 CLS:CLV:W=21:C=2:LC25,0:?"SCORE":LC25,15:?CHR$(236);"= 2"
    3 FORJ=0TO22:FORI=0TO22:LCI,J:IF(I%22<>0ANDJ%4=1)OR(J%22<>0ANDI%4=1)?CHR$(144)ELSE?CHR$(4)
    4 NEXT:NEXT:FORI=0TOW/10:X=RND(12)+5:Y=RND(12)+5:IFVPEEK(X,Y)=144LCX,Y:?CHR$(4)ELSEI=I-1
    5 NEXT:O=#BB5:V=1:T=144:POKEO,237:A=214-W/10
    6 P=#921:POKEP,236:WAIT90
    7 K=INKEY():POKE#1003,0:IFK=0K=VELSEK=K-53:IFABS(K)<>1ANDABS(K)<>3K=VELSEK=(1/K)-(K/3)*32
    8 D=PEEK(P+K):IFD<>4V=KELSEIFV=KK=RND(4)*2-3:K=(1/K)-(K/3)*32:GOTO8ELSEK=V:GOTO8
    9 POKEP,0:P=P+V:IFPEEK(P)=144THENS=S+1:LC25,1:?S:A=A-1
    10 POKEP,236:Y=(P-O)/32:X=P%32-O%32:POKEO,T:IFABS(Y)< ABS(X)Z=(ABS(X)/X)ELSEZ=(ABS(Y)/Y)*32
    11 T=PEEK(O+Z):IFT<>4O=O+Z:POKEO,237:ELSEZ=RND(4)*2-3:Z=(1/Z)-(Z/3)*32:GOTO11
    12 IFA=0GOSUB16:LC6,11:?"SATGE CLEAR":WAIT90:W=W-2:GOTO3
    13 WAITW:IFP<>OGOTO7ELSEIFC>0C=C-1:LC28,15:?C:T=0:GOTO6
    14 GOSUB16:LC7,11:?"GAME OVER":LC4,13:?"TRY AGAIN?(Y/N)"
    15 K=INKEY():IFK=89ORK=121RUNELSEIFK=78ORK=110ENDELSEGOTO15
    16 FORI=3TO19:FORJ=10TO12:LCI,J:?" ":NEXT:NEXT:RETURN
    


MixJuiceでのダウンロードURLは下記になります。
ネコタコ http://tagiyasoft.blog.jp/nekotako.bin

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

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

↑このページのトップヘ