• タイトル
    いちご雀(イチゴジャン)
    (電子工作マガジン2019年SPRING号 特別別冊附録マイコンBASICMagazine掲載)

  • 開発環境(動作確認機種)
    IchigojamBASIC1.3.1
    IchigojamBASIC1.2.6RPi
    IchigojamBASIC1.2.2ap

  • suzumejan
  • 内容
    すずめ雀」ゲームです。
    すずめ雀とは麻雀(マージャン)に似たゲームで、手持ちの6個の牌(ハイ)を3つ同じか3つ連続の組み合わせにするゲームです。

  • ルール
    ※上るには合計5点以上が必要

    ※必ず必要な組み合わせ
    3個連続:1点
    3個同じ:2点

    ※ボーナス
    アカハイ[イチゴマーク]:1個につき1点
    ドラ[ドラ表示と同じ数]:1個につき1点
    タンヤオ[2~8の数のみ使用]:1点
    チャンタ[1,9,発中を3個2組に必ず使用]:1点

    ※役満(他の役とは組み合わさりません)
    オールグリーン[♪マークのみ使用]:10点
    チンヤオ[1,9,発,中のみ使用]:15点
    スーパーレッド[イチゴマークのみ使用]:20点

    ※親制度、一荘戦のルールはありません。

  • 遊び方
    LRUN0 とする(もしくはプログラム0を RUN する)と画面上部にマイコンの牌(ハイ)、中央にプレイヤーの牌が表示されます。
    牌を1個取ると「ツモ」と表示され、次に「ステ?」と表示されるので、牌の下に表示されている番号(0~5)を入力して不要な牌を捨ててください。
    捨てた牌が中央に表示され、次にマイコンの順番になります。
    マイコンの捨てた牌で上れる場合「ロン?=0」と聞かれるので、上る場合は0、上らない場合は1を入力してください。
    ただし既に自分が牌で上れていた場合は「フリテン」と表示され、上ることはできずに自動的に牌が1個取られます。
    (例:2,3と持っていて、1を捨てていた場合、4でも上れない)
    牌を1個取った時に上ることができる場合は「ツモアガリ?=0」と表示されるので、上る場合は0、上らない場合は1を入力してください。
    持点は30点からスタートし、上った場合は上がり点を相手からもらえます。
    どちらかの持点が0点以下になるとゲーム終了です。
    持点が0点以下になる前に途中で終了しても持点は記憶されていますので RUN で再開できます。
    持点を戻したい場合は、 CLP:LRUN0 と入力してください。

  • プログラムのしくみ
    プログラムは4つのプログラムリストから成っています。
    プログラム0は入力などゲームの流れの部分。
    プログラム1は役の判定、表示をする部分。
    プログラム2は画面表示と牌を配る部分。
    プログラム3はキャラクタ定義。

    配列変数表
    [0]-[5]COM手牌
    [6]-[11]YOU手牌
    [12]-[17]役判定用
    [18]役判定(♪枚数)
    [19]役判定(苺枚数)
    [20]役判定(ドラ枚数)
    [21]COM捨位置
    [22]-[38]COM捨牌
    [39]YOU捨位置
    [40]-[56]YOU捨牌
    [57]次自摸位置
    [58]-[100]自摸山
    [101]ドラ牌
    [98]COM上がり点(役点数計算時に使用)
    [99]YOU上がり点(役点数計算時に使用)
    [0]COM持ち点(和了後に使用)
    [1]YOU持ち点(和了後に使用)

    牌のデータ形式
    0bit~4bit数字
    (1~9,#C(発),#F(中))
    5bit~6bit牌の一意
    7bit♪(緑牌
    8bit苺(赤牌
    1索=#11,#21,#31,#81
    2索=#42,#52,#62,#82
    #4C,#5C,#6C,#7C
    #8F,#9F,#AF,#BF
    bit000000000
    内容00000000

  • プログラムの具体的な入力方法
    プログラム0は保存番号0に、プログラム1は保存番号1に、プログラム2は保存番号2に、プログラム3は保存番号3に保存してください。
    プログラム3は麻雀牌のキャラクタ定義ですので、数字でプレイしたい人は入力不要で、その代わりにプログラム0の1行目を「1 lrun2,10」に変更してください。

  • プログラムの改造
    プログラム0の17行のCの値はマイコンの思考(試行?)回数で、現状は持点に連動させています。思考時間が遅いと感じる場合はCの値が小さくなるよう数式を変更してください。
    数字の1の牌は麻雀の慣例に従って鳥の絵にしてあります。別の絵にしたい場合はプログラム3の3行を変更してください。

  • 実行速度について
    AP版で普通に遊べる速度、RPi版ではちょっと遅いかなという感じ、IchigoJam版ではかなり待たされます。

  • その他
    すずめ雀は、すごろくやさんの商品および商品名です。
    発・中の文字は、美咲フォントを使用しました。

  • イチゴジャン(プログラム0)
    1 'スズメジャン0
    2 LRUN3
    3 FORI=0TO4:[6+I]=[100-I]:[100-I]=0:NEXT:[D]=A:L=2:R=4:LRUN2
    4 [6]=[[21]+21]:L=0:R=5:LRUN2
    5 FORK=6TO11:IF[K]=[[21]+21][K]=[6]:[6]=0
    6 NEXT:L=2:R=7:LRUN2
    7 H=[39]:IF[99]<5GOTO13ELSEINPUT"ロン?=0",K:IFKGOTO13
    8 [6]=[39+H]:L=0:R=9:LRUN2
    9 FORI=6TO11:IF[I]=[39+H]:[I]=[6]:[6]=0
    10 NEXT:IF[99]H=-1:GOTO13
    11 H=H-1:IFHGOTO8
    12 [6]=[[21]+21]:L=1:GOTO23
    13 [6]=[[D]+79]:[[D]+79]=0:[D]=[D]-1:L=0:R=14:LRUN2
    14 IFH<0?"フリテン"
    15 ?"ツモ":IF[99]>4INPUT"ツモアガリ?=0",K:IF!KL=1:GOTO23
    16 INPUT"ステ?",K:K=ABS(K%6):[[39]+40]=[6+K]:[6+K]=0:[39]=[39]+1:L=0:R=17:LRUN2
    17 C=30-PEEK(E):C=3+C*(C>0):IF[D]<0FORI=0TO5:[I]=[I+58]:NEXT:[39]=A:L=0:R=25:LRUN2
    18 FORI=0TO5
    19 J=RND(43)+58:IF[J]<1CONTELSE[I]=[J]:[J]=-[J]:NEXT:L=0:R=20:LRUN2
    20 FORI=58TO95:[I]=ABS([I]):NEXT:IF[98]>4L=9:GOTO23
    21 C=C-1:IFCGOTO18
    22 [[21]+22]=[63+[D]]:[63+[D]]=0:[21]=[21]+1:L=0:R=4:LRUN2
    23 R=24:LRUN2
    24 LC0,13:IFZ?">YOU";ELSE?">COM";
    25 IFR=25?"ナガレ":F=1ELSE?"アガリ<"
    26 LCA,21:IFFINPUT"ツヅケル?=0",K:IF!KRUN
    27 ?"COM:";[0],"YOU:";[1]
    

    イチゴジャン(プログラム1)
    1 'スズメジャン1
    2 LC0,14:IFL=2LRUN0,R
    3 Z=L<9:FORI=0TOZ:Q=0:LET[18],0,0,0:FORJ=0TO5:K=12+J:[K]=[I*6+J]%A:[K]=[K]-![K]:[20]=[20]+([K]%A=[101]%A):K=[I*6+J]:[18]=[18]+(K<#80&&K>#40):[B]=[B]+(K>#80):NEXT
    4 LC0,13:IFLL="オナジ +2":?CHR$(12)
    5 IF[12]=[13]&&[13]=[14]Q=Q+1002:?STR$(L):IF[12]=1||[12]=9||[12]=12||[12]=15Q=Q+10
    6 IF[15]=[A]&&[A]=[17]Q=Q+1002:?STR$(L):IF[15]=1||[15]=9||[15]=12||[15]=15Q=Q+10
    7 IFQ=2024Q=15:IFL?"チンヤオ =15":GOTOBELSEGOTOB
    8 IFLL="レンゾク +1"
    9 IF[12]+1=[13]&&[13]+1=[14]Q=Q+1001:?STR$(L):IF[12]=1||[14]=9Q=Q+10
    10 IF[15]+1=[A]&&[A]+1=[17]Q=Q+1001:?STR$(L):IF[15]=1||[17]=9Q=Q+10
    11 IFQ>2000Q=Q%1000ELSEQ=0:GOTOB
    12 IF[18]=6Q=10:IFL?"オールグリーン =10":GOTOBELSEGOTOB
    13 IF[B]=6Q=20:IFL?"スーパーレッド =20":GOTOBELSEGOTOB
    14 IFLL="タンヤオ +1"
    15 IFQ<10Q=Q%10+1:?STR$(L)ELSEIFQ<20Q=Q%10ELSEQ=Q%10+2:IFL?"チャンタ +2"
    16 IF[B]>0Q=Q+[B]:IFL?"アカハイ +";[B]
    17 IF[20]>0Q=Q+[20]:IFL?"ドラ +";[20]
    19 [98+I]=Q:IFL?"-------":?"テン:";Q:[I]=PEEK(E+I)+Q:POKEE+I,[I]:[!I]=60-[I]:POKEE+!I,[!I]
    20 NEXT:F=([0]*[1])>0:LRUN0,R
    

    イチゴジャン(プログラム2)
    1 'スズメジャン2
    2 CLS:FORM=0TO1:FORI=M*6TOM*6+4:FORJ=I+1TOM*6+5:IF[I]%A>[J]%AK=[I]:[I]=[J]:[J]=K
    3 NEXT:NEXT:I=M*6:IF[I]%A+1=[I+2]%A&&[I+2]%A+1=[I+4]%AK=[I+1]:[I+1]=[I+2]:[I+2]=[I+4]:[I+4]=[I+3]:[I+3]=K
    4 FORI=M*6TOM*6+5:GSB6:NEXT:K=M*18+22:FORG=KTOK+[K-1]:LCG-K+5,M*4+3:J=[G]:GSB8:LCG-K+5,M*4+4:?CHR$([G]%A+#E0);:NEXT:?CHR$(8):LC15,M*10:IFM?"YOU:";ELSE?"COM:";
    5 ?PEEK(E+M);"テン":NEXT:J=[101]:LC28,0:?"ドラ":LC29,2:?CHR$(J%16+#E0):LC29,1:GSB8:LRUN1
    6 IF!M&&L<9:LCI%6+5,1:?CHR$(6):LCI%6+5,0:?CHR$(6):RTN
    7 LCI%6+5,M*10+1:?CHR$([I]%A+#E0):LCI%6+5,M*10:J=[I]
    8 J=J/A:?CHR$(#EE*(J>3)+17*(J>7)):IFMLCI%6+5,13:?I-6
    9 RTN
    10 CLV:A=16:B=19:D=57:E=2032:POKE1912,0,A,-2,146,146,-2,A,A:POKE1888,0,118,170,68,186,124,40,206:I=1792:COPYI,!PEEK(I)*1408+384,80:COPYI,0,8:IFPEEK(E)+PEEK(E+1)!=60POKEE,30,30
    11 FORJ=0TO43:K=J%4:K=K*A+J/4+1+((J/4)&1)*64:IF!(J%4)&&J<36K=K%A+128
    12 [J]=K:IFJ>39[J-4]=[J-4]+2:[J]=[J]+132:IFJ>40[J-32]=(J*A+67)%128
    13 NEXT:FORI=0TO43
    14 J=RND(44)+58:IF[J]CONTELSE[J]=[I]:[I]=0:NEXT:LRUN0,3
    

    イチゴジャン(プログラム3)
    1 'スズメジャン3
    2 IF!PEEK(1792)LRUN2,10
    3 POKE1800,0,48,216,120,127,126,60,20
    4 POKE1808,0,16,16,16,0,16,16,16
    5 POKE1816,0,16,16,16,0,68,68,68
    6 POKE1824,0,68,68,68,0,68,68,68
    7 POKE1832,0,68,68,84,16,84,68,68
    8 POKE1840,0,84,84,84,0,84,84,84
    9 POKE1848,16,16,0,84,84,0,84,84
    10 POKE1856,0,84,108,68,0,68,108,84
    11 POKE1864,84,84,0,84,84,0,84,84
    12 COPY1792,0,8
    13 RUN
    

    ダウンロードURLは下記になります。
    suzume0.bin http://tagiyasoft.blog.jp/suzume0.bin
    suzume1.bin http://tagiyasoft.blog.jp/suzume1.bin
    suzume2.bin http://tagiyasoft.blog.jp/suzume2.bin
    suzume3.bin http://tagiyasoft.blog.jp/suzume3.bin

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

  • 参考ゲーム
    すずめ雀すごろくや

  • タイトル
    パンツショップ
    (電子工作マガジン2018年WINTER号 特別別冊附録マイコンBASICMagazine掲載)

  • 開発環境
    IchigojamBASIC1.2.1

  • pants
  • 内容
    あなたはパンツのレンタル屋さんです。
    パンツを借りに次々にお客さんがやってきます。
    あなたの仕事はパンツを仕入れてお客さんに貸すことです。
    あなたは一流のパンツ職人になることができるか?

  • 遊び方
    画面の上段には来店したお客さんが表示され、その下側には希望のレンタル時間が表示されます。
    下段にはパンツの在庫が表示され、その上側にパンツの寿命が表示されます。貸出中のパンツは「RENT」と表示されます。
    所持金100moneyからスタート。パンツの仕入れは-10money、お客さんが最後までパンツをはいていれば+10money、借りることができなかったり途中で脱げてしまった場合は-10moneyです。所持金が無くなったらゲームオーバーです。
    スコアは、お客さんがパンツをはいている時間1秒につき1点加算されます。(4人ともパンツをはいていれば4点/秒が加算されます)
    古くなったパンツはレンタル中に脱げてしまいますので、早めに捨てて新しいパンツに入れ替えておいてください。ただしパンツの仕入れにはお金がかかりますので注意。
    パンツの寿命が早く縮まってしまうお客さんと、そうではないお客さんがいますので、寿命が長めのパンツと古くなったパンツを効率的に貸し出すのがコツです。

  • 操作方法
    ←,→パンツ選択
    パンツ仕入
    パンツ破棄
    1~4パンツ貸し出し

    "←"と"→"のキーでパンツを選び、数字"1"~"4"のキーで該当するお客さんにパンツを貸し出します。
    パンツの無い位置で"↑"キーを押すとパンツを仕入れられます。
    "↓"のキーを押すとその場所にあるパンツを捨てられます。

  • プログラムのしくみ
    プログラムは2つのプログラムから成り、プログラム1は主にプレーヤーの操作、プログラム2は主にパンツの表示を行っています。

    変数表(配列変数)
    [0]~[3]体格
    0=空,1~4=体格,10位=着用パンツ柄,100位=パンツ返却位置
    [4]~[7]希望レンタル時間
    [8]~[11]パンツが脱げる時間
    [12]~[15]パンツ柄
    [16]~[19]パンツ寿命

    プログラム1
    20行キャラクタ定義(プログラム2)
    30行変数初期化
    40~60行パンツ発生
    80行客の表示時間チェック
    90行パンツの寿命チェック
    110行パンツ表示(プログラム2)
    120行所持金チェック
    150~200行キー処理
    220~240行貸出用変数セット

    プログラム2
    20~40行キャラクタ定義
    80~110行客表示
    120~130行パンツ着用
    140行客ゲージ表示
    150~160行在庫表示
    170行パンツゲージ表示
    190行"↑↑↑"表示

  • プログラムの具体的な入力方法
    プログラムリストでは、プログラム1を保存番号0、プログラム2を保存番号1としていますが、別の番号として保存した場合はプログラム中のLRUN命令を保存した番号に変更してください。

  • プログラムの改造
    プログラム1の50行のRND文は、それぞれ客の発生率、体格、レンタル時間を決めています。
    行頭の「if!rnd(20+...」の20の値を小さくすると客の発生率が上がり、大きくすると発生率が下がります。
    IchigoJamPCの場合は、P1-50行の20を10、プログラム1の140行の3を30程度を目安に変更し、プログラム2の120行のs=s+a/19を削除するとちょうど良くなります。

  • パンツショップ(プログラム1)
    10 'PTKT-1
    20 LRUN1
    30 CLV:CLT:P=1:C=100
    40 J=0:FORI=0TO3
    50 IF![I]J=J+1:IF!RND(20+(5-S/40)*(S<200))THEN[I]=RND(3)+(S>200):[4+I]=TICK()+(RND(4)+2)*120:J=0
    60 NEXT:IF4=JCLT
    70 FORI=0TO3
    80 IF[4+I]&&([4+I]100&&[8+I]1P=P-1
    170 IFK=29ANDP<4P=P+1
    180 IFK=30AND![15+P][11+P]=RND(4)+1:[15+P]=(RND(4)+1)*240:C=C-10
    190 IFK=31&&[11+P]>0[11+P]=0:[15+P]=0
    200 IFK<49ORK>52GOTO140
    210 K=K-49:IF![K]OR[K]>9OR[11+P]<0GOTO140
    220 [K]=[K]+[11+P]*10+P*100
    230 [15+P]=[15+P]-([4+K]-TICK())*([K]%10)/4:[11+P]=-1
    240 [8+K]=TICK()+[15+P]
    250 GOTO140
    

    パンツショップ(プログラム2)
    
    10 'PTKT-2
    20 CLP:POKE#EA*8,1,2,3,4:FORI=0TO3:COPY(#E7+I)*8,PEEK(#EA*8+I)*8,8:NEXT
    30 POKE#700,64,64,96,96,80,80,76,67,0,0,0,16,56,56,84,147,4,4,12,12,20,20,100,132,64,64,64,64,64,64,64,64
    40 POKE#720,4,4,4,4,4,4,4,4,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,255:LRUN0,30
    50 CLS:?"MONEY:";C,"SCORE:";S
    60 FORL=0TO3:M=L*8+4:LCM,2:?L+1
    70 IF![L]GOTO150
    80 N=[L]%10:POKE#9A0+M,#E1:POKE#9E0+M,#E5
    90 FORO=1TON:POKE#9A0+M-O,#E6:POKE#9A0+M+O,#E6:NEXT
    100 FORO=0TO4:Q=#960+O*32+M:POKEQ-N,#E3:POKEQ+N,#E4:NEXT
    110 POKE#9A0+M-N,#E0:POKE#9A0+M+N,#E2
    120 Q=[L]/10%10+#E6:IF#E6O?CHR$(132);
    150 M=L*4+2:IF[12+L]<0LCM-1,12:?"RE":LCM,13:?"NT"
    160 IF[12+L]>0FORO=0TO2:N=#E6+[12+L]:POKE#A7F+M+O*32,N,N,N:NEXT:POKE#AC0+M,0
    170 LCL*4+1,11:FORO=0TO[L+16]/288:?CHR$(131);:NEXT:?CHR$(8);:IF(O/2)*2<>O?CHR$(129);
    180 NEXT
    190 M=P*4-2:N=30+([11+P]<0):POKE#ADF+M,N,N,N
    200 LRUN0,120
    


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

  • 参考ゲーム
    ハンバーガーショップ(バンダイ LCDゲーム)
    週間電子ゲームレビュー
    電子ゲームの世界

  • タイトル
    91X(電子工作マガジン2018年AUTUMN号掲載)

  • 開発環境
    IchigojamBASIC1.2.1

  • 内容
    マーカー(自機)を動かし、自分の領域を増やしていく陣取りゲームです。

  • 遊び方
    マーカーは矢印キーで移動し、自分のエリア(濃いアミカケ)内を自由に移動することができます。
    スペースキーを押しながら矢印キーを押すと、自分のエリア外にライン(薄いアミカケ)を引きながら移動することができます。
    再度自分のエリアに戻ってくると、ラインで囲った領域が新たに自分のエリアとなります。
    マーカーが敵に触れたり、作成中のラインに敵が触れるとゲームオーバーです。
    1回のラインで多くのエリアを確保すると得られる得点がアップします。

  • qix
  • 操作方法
    [↑]キー上移動
    [↓]キー下移動
    [←]キー左移動
    [→]キー右移動
    [SPACE]キーラインを引く

    画面の「S」はスコア、「A」は確保したエリア、「T」は残り時間です。

  • プログラムのしくみ
    機械語部分(プログラム1)とBASIC部分(プログラム2)に分かれています。
    機械語ルーチンは、初期画面作成、敵キャラクタの移動、塗りつぶしの3つの処理が含まれています。
    BASICルーチンは、キー入力、マーカー移動、サウンド等の処理をしています。

    変数表
    E,F,G頻出数字
    I,Jループ用一時変数
    A確保領域
    M自分の位置
    N自分の位置に元々あったキャラクタ
    C自分または敵の移動先キャラクタ
    V自分または敵の移動方向
    Q敵の頭の位置
    O敵の尾の位置
    P敵の長さ
    D線描画フラグ
    Kキー入力
    B新たに確保した領域
    Sスコア
    Wウエイト用

    機械語サブルーチン(プログラム1)
    USR(#700,0)
    塗りつぶし
    引数:無し
    戻値:領域数
    USR(#774,0)
    枠描画
    引数:無し
    戻値:無し
    USR(#77C,1)
    敵移動
    引数:上位4bit=キャラクタ(RND(14))+下位4bit=方向(RND(4))
    戻値:FF=GameOver/FE=retry_RND(4)/FD=error/00=no_error

  • プログラムの具体的な入力方法
    プログラム1は機械語プログラムですので、間違えないように入力してください。
    入力間違いがあるとエラーメッセージが出ずに、IchigoJamが操作不能になってしまう可能性があります。
    ですので、プログラムを入力したら、まずSAVEしてからRUNするようにしてください。
    もしIchigoJamが操作不能になってしまった場合は電源を入れ直してください。
    (保存していないプログラムは消えてしまいます)
    また、6行の「END」を、「(例)LRUN2」のようにプログラム2の保存番号に変更すると、プログラム1を実行後すぐにプログラム2を読み込んで実行することができます。
    プログラム1は通常のPOKE文だとメモリ容量を超えてしまうため、BASE16というアルゴリズムで圧縮してあります。
    (正確にはバイナリ→テキスト変換。POKE文を利用したプログラムに対して圧縮の意味)

  • プログラムの改造
    プログラム2のPに4を加えた数が敵の初期の長さになります。長くすると難しくなります。(短くすると正しく動作しません)
    Wは全体の動きを遅くするための数値です。初期値5から1面クリアごとに小さく(=早く)なります。増減させて難易度を変更できます。
    7行の9999は制限時間です。増減させて難易度を変更できます。

  • 91X(プログラム1)
    1 'QIX1
    2 Z="ONKEI@B@@@@ADGAHBNBFCF@AB@BB@ACBKBDBALMLM@EMB@BH@CM@HABHOGMKHNBHOEMLMAAIB@CI@@BC@@O@@JOHAOBC@@O@@GOHBABC@@O@@DOHD@BC@@O@@AOHNFNGLHEL@@BH@@M@G@DGB@B@LHEDMNNG@@B@":Y=#700:GSB8
    3 Z="B@BBB@BDMAEM@KAK@GM@@CBI@CM@@DBI@AM@@@BI@BMA@AC@@CBCMCEE@ACBKBDBO@MKONKMONKD@FB@I@BGCO@AGOAHKNBFCF@AGFAHB@BB@ACJM@EEI@EEOKMACMDFAOCEFNALBLBBAB@AE@EEI@EEB@CJOKME":Y=#750:GSB8
    4 Z="@CB@GNALBABALHEEHHEEB@CALHEEHHEEONKLG@DG@@KE@BKD@ODF@HBFCF@BOLCFCNDDKEAL@B@II@DF@CBBA@D@@@BBJLEJB@CLCLDDDAAN@FM@AOBA@BBH@CM@BABA@CBH@@M@D@BAOOB@FBEL@DBJ@FMAHOBB":Y=#7A0:GSB8
    5 Z="FBEDDBDFHACBB@BAFBEDDAN@ONB@@@BJCNMAFCAHB@CK@@BA@@O@CMOH@@BHCGMAAOBA@@O@CHOH@@BHCBMABABA@@O@CCOH@@BHBMMAD@BA@@O@BNOH@@BHBHMADADFHACAB@CDBAG@B@CCMKAK@@BBJKEBKCEJ":Y=#7F0:GSB8
    6 Z="CKDDB@CK@@BA@@O@ANOH@@BHA@MAAOBA@@O@AIOH@@BH@KMABABA@@O@ADOH@@BH@FMAD@BA@@O@@OOH@@BH@AMAOMB@@GN@@@B@AJDFB@CBA@G@@KDDMKAK@@BBKCEB@BKL@@KMG@DG@@B@EJELH@BJ@BMMHOBJ":Y=#840:GSB8
    7 Z="@@MJONB@G@DG":Y=#890:GSB8:END
    8 W=Y+LEN(Z)/2-1:FORX=YTOW:POKEX,PEEK(Z)&15<<4+PEEK(Z+1)&15:Z=Z+2:NEXT:RTN
    

    91X(プログラム2)
    1 'QIX2
    '全体初期設定
    2 E=143:F=32:G=23:s=0:p=0:W=5
    '面初期設定
    3 CLS:A=USR(#774,0):A=0:LC21,G:?"T:";:M=#921:N=3:V=1:P=P+4:W=W-1:PLAY"T700EREDRDRDE2REFRFGR0R0"
    'QIX配置
    4 Z=#9A0+RND(512):IFPEEK(Z)GOTO4ELSEPOKEZ,134:Y=Z:FORI=0TOP:Y=Y+V:IFY<#960Y=Y+F:V=1:I=I-1ELSEIFPEEK(Y)Y=Y+31:IFPEEK(Y)Y=Y-33:IFPEEK(Y)Y=Y+1:V=-F:I=I-1
    5 POKEY,134:NEXT:CLT:C=3:N=4:V=0:wait120:GOTOG
    'QIX移動
    6 J=J+1:IFJ>9J=Y:Y=Z:Z=J:J=0:POKEZ,E:GOTO6
    7 a=usr(#7B4,rnd(14)<<4+rnd(4)):IFa=#FF||TICK()>9999POKEZ+V,E:POKEZ,E:GOTOFelseifa=#FEgoto6
    10 J=0:LCG,G:?9999-TICK();:WAITW
    '自移動
    11 V=0:D=0:K=PEEK(#1002):IF!KGOTO6ELSEIFK&16D=1
    12 IFK&1V=-1ELSEIFK&2V=1ELSEIFK&4V=-FELSEIFK&8V=F
    13 C=PEEK(M+V):IFD&&(C>128&&C74LC12,10:?" CLEAR ";:play"t999erer9grgr9brb":WAITE:GOTO3
    24 IFC=3POKEM,N:M=M+V:N=PEEK(M):POKEM,42
    25 IF!C&&DPOKEM,N:M=M+V:N=4:POKEM,42
    26 GOTO6
    32 lc9,9:?"GAME OVER":play"t500fr9fgfrfgedc":LC0,0:OK
    

    91X(プログラム1のアセンブラリスト)
    '塗りつぶし	引数:無し/戻値:領域数
    push	{r1-r7,LR}
    mov	r0,#90
    lsl	r0,r0,4		'仮想LC0,0(#900)
    add	r7,r0,r1	'R7=実VRAM
    mov	r6,#2E		'#BE0-#900=#2E0
    lsl	r6,r6,4		'R6=仮想LC0,23(#BE0)
    @VRAMTOP		'敵側塗りつぶし(#20)	R2=カウンタ
    mov	r2,#20					
    @LOOP1			'敵側探索
    add	r2,1
    cmp	r2,r6
    bgt	@FILL		'塗りつぶし
    ldrb	r0,[r2,r7]				
    cmp	r0,#20					
    beq	@LBL1					
    cmp	r0,#81					
    blt	@LOOP1
    cmp	r0,#8E
    bgt	@LOOP1
    @LBL1			'!= ,!=O,!=o
    add	r1,r2,r7
    sub	r1,#20		'R1=チェックVRAM
    mov	r3,#00		'R3=R1の上
    gosub	@CHKNULL				
    mov	r3,#1F		'R3=R1の左
    gosub	@CHKNULL			
    mov	r3,#21		'R3=R1の右
    gosub	@CHKNULL				
    mov	r3,#40		'R3=R1の下
    gosub	@CHKNULL				
    bla	@LOOP1					
    @CHKNULL
    ldrb	r0,[r1,r3]
    cmp	r0,#00
    beq	@PUTSPC
    ret
    @PUTSPC
    mov	r0,#20		'R0=CHR$(#20)=SPACE
    strb	r0,[r1,r3]
    bla	@VRAMTOP
    @FILL			'自領域塗りつぶし(#00)
    mov	r0,#00		'R0=領域数(戻値)
    mov	r2,#20		'R2=カウンタ
    mov	r4,#20
    @LOOP2
    ldrb	r1,[r2,r7]				
    sub	r3,r1,r4
    beq	@LBL3					
    cmp	r1,#03
    beq	@LBL2
    cmp	r1,#04
    beq	@LBL2
    cmp	r1,#00
    bne	@LBL4
    @LBL2
    add	r0,#01					
    mov	r3,#03
    @LBL3
    strb	r3,[r2,r7]				
    @LBL4
    add	r2,1
    cmp	r2,r6					
    blt	@LOOP2					
    pop	{r1-r7,PC}
    
    'nop
    'nop
    
    '--枠描画
    '枠	引数:無し/戻値:無し
    push	{r1-r7}
    mov	r0,#0,6
    mov	r7,#90
    lsl	r7,r7,4		'仮想LC0,0(#900)
    add	r7,r7,r1	'R7=実LC0,0
    mov	r6,#BE
    lsl	r6,r6,4		'仮想LC0,23(#BE0)
    add	r6,r6,r1	'R6=実LC0,23
    mov	r2,#20		'R2=カウンタ
    @KABELOOP1
    sub	r2,#01
    strb	r0,[r2,r7]	'上枠
    strb	r0,[r2,r6]	'下枠
    bne	@KABELOOP1
    mov	r5,r7
    add	r5,#1F		'#91F
    add	r6,r5,1		'#920
    mov	r2,#2C		'R2=カウンタ(#2C0)
    lsl	r2,r2,4
    @KABELOOP2
    strb	r0,[r2,r5]	'右枠
    strb	r0,[r2,r6]	'左枠
    sub	r2,#20
    bpl	@KABELOOP2	'r2>#00(=r2+r5>#900)
    mov	r0,#03
    add	r6,r7,#01
    mov	r1,#21
    strb	r0,[r1,r7]
    strb	r0,[r1,r6]
    add	r1,#20
    strb	r0,[r1,r7]
    'mov	r0,#2A		'#2A="*"
    strb	r0,[r1,r6]
    pop	{r1-r7}
    ret
    
    'nop
    'nop
    
    '--QIX移動
    '使用変数:q,o
    '引数(R0)	上位4bit=キャラクタ(RND(14))
    '		下位4bit=方向(RND(4))
    '戻値(R0)	FF=GameOver/FE=retry_RND(4)/FD=error/00=no error
    push	{LR}
    push	{r1-r10}
    mov	r7,r1		'R7=実VRAM先頭アドレス
    mov	r6,#08
    lsl	r6,r6,#08
    add	r6,#FC
    add	r6,r7		'R6=#8FC=Y(=o)
    add	r5,r6,#02	'R5=#8FE=Z(=q)
    lsr	r2,r0,#04
    mov	r8,r2		'R8=キャラクタ(RND(14))
    mov	r2,#03
    and	r0,r2
    'mov	r9,r0		'R9=方向(RND(4))
    mov	r2,#00
    ldrh	r4,[r5,r2]	
    sub	r4,#20		
    add	r4,r7
    sub	r1,r0,#1	'RND=1	上
    beq	@Q_EAT		'R1=0
    mov	r1,#1F
    cmp	r0,#02		'RND=2	左
    beq	@Q_EAT		'R1=31
    mov	r1,#21
    cmp	r0,#03		'RND=3	右
    beq	@Q_EAT		'R1=33
    mov	r1,#40		'R1=64 RND=0	下
    @Q_EAT
    mov	r0,#FF
    ldrb	r2,[r4,r1]	'R2=Q+V
    cmp	r2,#04
    bne	@Q_NL_CK		
    mov	r2,#8F
    strb	r2,[r4,r1]		
    mov	r2,r8
    add	r2,#81
    mov	r1,#20
    strb	r2,[r4,r1]		
    bla	@Q_EXIT
    
    @Q_NL_CK
    mov	r0,#FE
    cmp	r2,#00
    bne	@Q_EXIT			
    add	r3,r4,r1
    sub	r3,#20		
    mov	r1,#00
    gosub	@Q_CHECK
    cmp	r0,#00
    bne	@Q_EXIT
    mov	r1,#1F
    gosub	@Q_CHECK
    cmp	r0,#00
    bne	@Q_EXIT
    mov	r1,#21
    gosub	@Q_CHECK
    cmp	r0,#00
    bne	@Q_EXIT
    mov	r1,#40
    gosub	@Q_CHECK
    cmp	r0,#00
    bne	@Q_EXIT
    mov	r1,r8		'R8=キャラクタ(RND(14))
    add	r1,#81
    add	r4,#20
    strb	r1,[r4,#00]		
    add	r3,#20		
    sub	r3,r3,r7
    mov	r2,#00
    strh	r3,[r5,r2]		
    
    ldrh	r3,[r6,r2]		
    add	r3,r7
    sub	r3,#20		
    
    mov	r1,#00
    gosub	@Q_CHECK
    cmp	r0,#00
    bne	@Q_TAIL
    mov	r1,#1F
    gosub	@Q_CHECK
    cmp	r0,#00
    bne	@Q_TAIL
    mov	r1,#21
    gosub	@Q_CHECK	
    cmp	r0,#00
    bne	@Q_TAIL
    mov	r1,#40
    gosub	@Q_CHECK
    cmp	r0,#00
    bne	@Q_TAIL
    mov	r0,#FD		'error
    BLA	@Q_EXIT
    @Q_TAIL
    mov	r0,#00
    mov	r2,r3
    add	r2,#20
    strb	r0,[r2,#00]	
    add	r3,r1
    sub	r3,r3,r7
    mov	r2,#00
    strh	r3,[r6,r2]	'O=O+[I]
    @Q_EXIT
    pop	{r1-r10}
    pop	{PC}
    ret
    'sub
    @Q_CHECK
    mov	r0,#00
    ldrb	r2,[r3,r1]	'R2=Q+V-r1	
    cmp	r2,#80
    ble	@Q_CHK_RET		
    cmp	r2,#8F
    bge	@Q_CHK_RET		
    mov	r0,#FE		'rnd(4) retry
    @Q_CHK_RET
    ret
    


    MixJuiceでのダウンロードURLは下記になります。
    91x(1) http://tagiyasoft.blog.jp/91x1.bin
    91x(2) http://tagiyasoft.blog.jp/91x2.bin

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

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

  • 参考ゲーム
    QIX

↑このページのトップヘ