カテゴリ: IchigoJam

  • タイトル
    モールス デバッグ ツール

  • 開発環境
    IchigojamBASIC1.3.1
    外部メモリ(AT24C256)

  • 内容
    BASICマガジンのプログラムを入力した時、必ずと言って良いほど入力間違いをしてしまいます。そんな時、「誰かがプログラムを読み上げてくれれば、読み合わせができるのに」と思ったことはありませんか?
    このプログラムは、入力したプログラムをIchigoJamがモールス信号で読み上げくれます。
    がんばってモールス信号を覚えれば、アマチュア無線の上級を目指したり、ジブリアニメのモールス信号のシーンも楽めるかも。

  • morseDeBug
  • 必要な機器
    読み合わせするプログラムは外部記憶装置(EEPROM)から読み込みますので、外部記憶装置が必須になります。
    通販ショップで購入することができます。(参考:https://ichigojam.net/get.html)
    またサウンド出力用にIchigoJamキット付属の圧電ブザーを取り付けておいてください。

  • 操作方法
    実行すると「FileNo ?」と、プログラムの保存番号を聞いてくるので、読み合わせしたいプログラムの保存番号を入力してください。(100番以後) 最初の行からプログラムが1文字ずつとそれに該当するモールス符号が表示、モールス信号が発信されます。 英文モールスのみなので、それ以外の文字(カタカナや絵文字など)は低い音の長音1つが鳴って読み飛ばされます。

  • モールス符号のコード化について
    モールス符号は下記の規則で8bitにコード化してあります。
    単音を0、長音を1として、8bitに右詰めで配置します。
    次に左の空きbitを最下位bitを1、それ以外を0としたビット列で埋めます。
    例えば、Aは・-なので、000001-01=#05、Zは--・・なので、0001-1100=#1Cとなります。(見やすくするため、モールス符号とビット埋めとの間にハイフンを配置しています。)
    これの符号化により、上位bitから1bitずつ調べていき、bitが1になった以後のbit並びがモールス符号になります。
    参考文献:FaceBook内IchigoJamグループより

  • プログラムのしくみ

    各行の処理
    10行コメント
    20行短点長さ設定、モールス符号をメモリ上に配置
    30行読込むファイル場号
    40行外部メモリの読込アドレス計算
    50行外部メモリの読込アドレスを指定
    60行外部メモリから3byte読込(行番号、1行文字数)
    70行プログラムが行末になったら(1行文字数=0)終了
    80行行番号をモールス符号出力
    90~110行1行を1文字ずつモールス符号変換
    120~140行1行終了処理
    150行英小文字→大文字変換
    160行コード化されたモールス符号を読み込む
    170~180行英文モールス以外の文字の処理
    190行コード化符号からモールス符号を取り出す
    200~260行モールス信号の表示と発信

  • プログラムの改造
    モールス信号の単音は変数Sです。値を小さくすると早くなります。
    本プログラムは和文モールスに対応していませんので、和文モールスも発信できるよう改造してみましょう。

モールス デバッグ ツール
10 'morseDeBug
20 S=10:POKE#700,107,82,0,0,0,40,94,54,109,34,42,115,97,85,50,63,47,39,35,33,32,48,56,60,62,120,0,0,49,0,76,90,5,24,26,12,2,18,14,16,4,23,13,20,7,6,15,22,29,10,8,3,9,17,11,25,27,28
30 CLS:?"FILENO ";:INPUTN:N=N-100:IFN<0GOTO30
40 [1]=N*1024:POKE#800,PEEK(#803),PEEK(#802)
50 A=I2CW(80,#800,2,#802,0)
60 A=I2CR(80,#800,0,#802,3):CLS:?DEC$([1],5)
70 C=PEEK(#804):IF!CEND
80 FORK=0TO4:B=PEEK(#900+K):IFB!=32GSB150
85 NEXT
90 FORK=0TOC
100 A=I2CR(80,#800,0,#802,1):B=PEEK(#802):GSB150
110 NEXT
120 R=R+2+C
130 IFR%2R=R+1:A=I2CR(80,#800,0,#802,1)
140 GOTO60
150 IFB>96&&B<123B=B-32
160 A=PEEK(#700+B-33)
170 IFB<33A=0
180 IFB>90A=0:?CHR$(B)
190 FORI=0TO7:IFA<128A=A*2:NEXT:BEEP30,99:WAITS*3:BEEP0:RTN
200 ?CHR$(B);" ";
210 FORJ=ITO6:A=A*2
220 BEEP15,99:IFA&128?"-";:WAITS*3ELSE?".";:WAITS
230 BEEP0:WAITS*3
240 NEXT
250 I=8:NEXT:?:WAITS*7
260 RTN

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

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

  • 参考
    モ-ルス符号(wiki)
    • タイトル
      点数占い

    • 開発環境
      IchigojamBASIC1.3.1
      IchigojamBASIC1.2.6RPi
      IchigojamBASIC1.2.2ap

    • 内容
      点数神様からの、ありがたいお告げがもらえます。
      信じる、信じないはあなた次第です。

    • tentori
    • 遊び方
      RUNするとお告げが表示されます。

    • プログラムの内容
      プログラムの大半が「お告げ文」のデータになっています。
      お告げ文は上の句と下の句に分かれています。
      プログラムを見ただけでお告げ文の内容が解ってしまうと面白くないので、簡単な暗号化を行って解読できないようにしています。

    • プログラムのしくみ

      変数表
      Aお告げ文の上の句の先等アドレス
      Bお告げ文の下の句の先等アドレス
      C表示するお告げ文の先等アドレス
      Jお告げ文を復号化した文字コード

      各行の処理
      1行コメント
      2行メインプログラム
      3~4行お告げ表示サブルーチン
      5~24行お告げデータ

    • プログラムの改造
      プログラム2は暗号化プログラムです。
      1行目の’以後に文を入力してRUNすると、上の行に元の文字列、下の行に暗号化された文字列が表示されます。
      お告げ文を好きなように変更してみましょう。
      メモリ残量が少ないのでお告げ文を増やすには、お告げ文データを別プログラムにしてLRUNで呼び出すなどしてください。

    点数占い(プログラム1)
    1 'テントリウラナイ
    2 CLS:CLV:COPY#E0*8,0,8:?"アナタ ノ ウンセイ ハ";:FORI=0TO2:WAIT30:?"・";:NEXT:?:?:GSB3:?" ト":GSB3:?" ヨ":?:?RND(11);"テン":END
    3 WAIT60:GSBRND(20)+5:IFCC=BELSEC=A
    4 FORI=0TO20:J=PEEK(C+I):J=(J+130)*(J!=34):POKE#708+I,J:NEXT:?STR$(#708);:RTN
    5 A="204\^$^NW":B="ッョョA[^BXW":RTN
    6 A="K\[5,1^;W":B="/:^4\^690":RTN
    7 A="7\.O^H\4V^:A0W":B="FO6^CW":RTN
    8 A="MU=[^;W":B="3[?^D^CW":RTN
    9 A="1B\[^4\^;5>\":B="1>^4\^1M6^CW":RTN
    10 A="J\>^G^MF$^;W":B="S1:,1^;W":RTN
    11 A="I]/G^4\^I7W":B="ーH\[^D^CW":RTN
    12 A="RM^D^GL\W":B="8M->":RTN
    13 A="I\-6V^;W":B="C7A^6W":RTN
    14 A="H-5V^01":B="07P[^D^CXW":RTN
    15 A="3JY^D^H0UC0":B="/J\C0":RTN
    16 A="5J\[^4\^T0":B="HC05^4\^/U6^CW":RTN
    17 A=">\[;^$^3B\W":B="S1X0^4\^A\W":RTN
    18 A="?86^$^;W":B="N;\O:^4\^4S6^CW":RTN
    19 A="U.P[^$^>K\W":B="3C4^4\^0>6^CW":RTN
    20 A="ZU-A^H\4V^0W":B="@-8N^:>6^CW":RTN
    21 A="9-4.^G^X[:+1^;W^":B="8\H[^4\^1M0":RTN
    22 A="M[4\^H\4V^T[A\^0W":B="S.?+.H\.^N>0^>\":RTN
    23 A="/DP^D^O?+1^D^CW":B="B0X^D^05>6^CW":RTN
    24 A="DRDR^:A0W":B="/P^4\^JW":RTN
    

    点数占い(プログラム2)
    1 'アンゴウ プログラム
    2 A=#C04
    3 ?STR$(A)
    4 B=PEEK(A):IFB?CHR$(B-130);:A=A+1:GOTO4
    5 ?
    

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

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

  • 参考
    点取り占い(wiki)
    大人も子供も楽しめるシュールな魅力、「点取り占い」にクローズアップ! 夢の1シート買いしてみた(ねとらぼ)
    • タイトル
      ソリティアボウリング
      (電子工作マガジン2019年SUMMER号 別冊附録マイコンBASICMagazine掲載)

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

    • solitaire_BOWL
    • 内容
      トランプを使ったボウリングゲームです。
      山札のカードを小さい順に配置していき、置けなくなった時点で点数が決まります。
      5フレームで1ゲームとし、ボウリングと同じルールで点数をつけていきます。
      パーフェクトゲーム(5フレーム全てストライクを取ること。150点)を目指してください。

    • 遊び方
      画面上部にスコアボード、下部左にボウリングのピンに見立てたカード置場、右には上から1投目のカード捨場、2投目のカード捨場、右下に山札となっています。
      山札に表示されたカードをピンの場所に置きます。
      ピンに置くカードは数の小さい順に並べ、置けない時は右側のカード捨場に置きます。
      捨札2枚以下で全てのピンにカードが置ければストライク、捨札5枚以下ならスペアとなります。
      10ピン全てにカード置くか、捨札が6枚になると1フレーム終了で得点が計算されます。

    • 操作方法
      「ピン?」と表示されたらカードを置きたいピン番号(0~9)を入力します。
      カードを置けない場合は負の数字(例:-1)を入力します。

    • プログラムのしくみ
      プログラムリスト0はゲームのメイン部分で、プログラムリスト1は画面表示および得点計算をしています。
      LRUNで別プログラムを呼び出す時は、変数Lに戻り行番号を代入してから呼び出しています。
      プログラムリスト0
      1行コメント
      2行定数、キャラクタ定義
      3行キャラクタ定義、山札表示
      4行ピン位置入力
      5行画面表示ルーチン呼出
      6行倒れたピンの数
      7-8行1投ごとの点数計算
      9行フレーム終了時の変数クリア
      10行ゲーム終了チェック
      11行捨てカード処理
      12行ピン表示

      プログラムリスト1
      1行コメント
      2行枠線表示
      4-7行得点表示
      8行山札表示
      9行指定座標にカード表示

      配列変数
      0-9ピン
      10-12捨札(1投め)
      13-15捨札(2投め)
      16次の捨札位置
      17ボールを投げた数
      18山札
      20-261投めの点(1-7flame)
      30-362投めの点(1-7flame)
      41-53表示したカード(1-4bit)
      60-79ピン座標(X0,Y0,X1,Y1…)

    • プログラムの具体的な入力方法
      プログラムリスト0は保存番号0に、プログラムリスト1は保存番号1にSAVEしてください。

      罫線記号(カードの枠線)の入力は下記の通りです。

      左ALT+SHIFT+H
      左ALT+SHIFT+I
      左ALT+SHIFT+J
      左ALT+SHIFT+K
      左ALT+SHIFT+L
      左ALT+SHIFT+M
      左ALT+SHIFT+N
      左ALT+SHIFT+O(オー)
      左ALT+SHIFT+P
      左ALT+SHIFT+Q
      左ALT+SHIFT+R
      スペース1個

    • プログラムの改造
      プログラムを改造する場合は、キャラクタ定義や枠線表示を別プログラムにするなどしてメモリに空きを作ってください。

    • ソリティアボウリング(プログラム0)
      1 'ソリティアBOWL0
      2 CLV:CLP:CLS:FORI=20TO36:[I]=11:NEXT:LET[60],4,18,3,15,5,15,2,12,4,12,6,12,1,9,3,9,5,9,7,9:COPY#7D0,#750,8:POKE#750,129,195,231,255,255,231,195,129,0,0,0,0,0,0,0,0:COPY#768,#720,32:COPY#790,#190,64
      3 COPY#788,#208,8:COPY#7D8,#250,8:COPY#7E0,#288,8:COPY#7E8,#258,8:COPY#700,#168,8:COPY#708,#188,72:M=1<<RND(4):N=RND(13)+1:IF[40+N]&MCONTELSE[40+N]=[40+N]|M:[18]=M<<4+N:I=#760:L=4:LRUN1
      4 LC0,21:?CHR$(12);:INPUT"ピン? ",K:K=K%G:IFK<0[G+[16]]=[18]:[16]=[16]+1:L=11:LRUN1,4ELSEFORI=0TO9:IF[I]J=[I]&#F:L=[18]&#F:IF(I<K&&J>L)||(I>K&&J<L)||[K]?"オケマセン":WAIT60:I=9:NEXT:GOTO4
      5 NEXT:[K]=[18]:L=7:LRUN1,4
      6 P=G:FORI=0TO9:P=P-![I]:NEXT:RTN
      7 GSB6:IFP<GGOTO3ELSEIF[16]<3[20+[H]/2]=G:[H]=[H]+1:GOTO9
      8 [30+[H]/2]=P-[20+[H]/2]
      9 FORI=0TO16:[I]=0:[I+40]=0:NEXT
      10 A=[H]+1:[H]=A:B=[24]:IFA<G||(B+[34]=G&&A<11)||(B*[25]=100&&A<13)||(B=G&&A<12)GOTO3ELSEL=13:LRUN1,4
      11 IF[16]%3GOTO3ELSEGSB6:IF[16]=3[20+[H]/2]=P:GOTOGELSEGOTO8
      12 I=I+1:IFI>9GOTOLELSEIF[I]A=[60+I*2]:B=[61+I*2]:D=[I]:LRUN1,9ELSECONT
      13 LC0,22
      

      ソリティアボウリング(プログラム1)
      1 'ソリティアBOWL1
      2 G=10:?CHR$(19);"┏━━━┳━━━┳━━━┳━━━┳━━━━━┓":?:?"┣━┳━╋━┳━╋━┳━╋━┳━╋━┳━┳━┫":?"┃":?"┣━┻━╋━┻━╋━┻━╋━┻━╋━┻━┻━┫":?:?"┗━━━┻━━━┻━━━┻━━━┻━━━━━┛":?:?"┏━┳━┳━┳━┓□┏━┳━┳━┓":?"┃6┃7┃8┃9┃□┃□┃□┃□┃":?"┃□┃□┃□┃□┃□┃□┃□┃□┃
      3 COPYI,#4F8,8:?"┗┳┻┳┻┳┻┳┛□┗━┻━┻━┛":?"□┃3┃4┃5┃□□┏━┳━┳━┓":?"□┃□┃□┃□┃□□┃□┃□┃□┃":?"□┗┳┻┳┻┳┛□□┃□┃□┃□┃":?"□□┃1┃2┃□□□┗━┻━┻━┛":?"□□┃□┃□┃":?"□□┗┳┻┳┛□□□┏━┓":?"□□□┃0┃□□□□┃□┃":?"□□□┃□┃□□□□┃□┃":?"□□□┗━┛□□□□┗━┛
      4 L=-L:C=0:F=#E0:H=17:FORI=0TO4:E=[I+20]:A=E%11:B=[I+30]%11:D=A+B:LCI*4+1,3:?CHR$(E+F);"┃";CHR$([I+30]*(D<G)+12*(D=G)-(E=G)+F);"┃□┃":C=C+D:IFD=GD=[I+21]%11:C=C+D:IFA=GC=C+[I+31]%11:IFD=GC=C+[I+22]%11
      5 LCI*4,1:?"┃□";I+1:LC0,I*2-3:?"┃":LC22,I*2-3:?"┃":LCI*4,5:?"┃";DEC$(C,3):IF(I<3&&[G+I])A=I*2+11:B=9:D=[G+I]:GSB9:IF(I<3&&[13+I])A=I*2+11:B=13:D=[13+I]:GSB9
      6 NEXT:L=-L:A=[24]%11:B=[34]%11:IFA+B=GLC21,3:?CHR$([25]+F)
      7 IFA=G:LC19,3:?CHR$([25]+F);"┃";:IF[25]=G?CHR$([26]+F)ELSE?CHR$([35]+F)
      8 A=11:B=18:D=[18]:I=-1
      9 LCA,B:?CHR$((9-(D/16))*G/26+#ED):LCA,B+1:?CHR$((D&#F)+#F0):IFL<0RTNELSELRUN0,12
      

      ダウンロードURLは下記になります。
      solitaire_BOWL0.bin http://tagiyasoft.blog.jp/solitaire_BOWL0.bin solitaire_BOWL1.bin http://tagiyasoft.blog.jp/solitaire_BOWL1.bin
      ブラウザでD/LしてIchigoJamに転送する場合は、通信ソフトでバイナリ送信をしてください。
      (例:TeraTermの場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)

    • 参考ゲーム
      ソリティアボウリング

    1. BASICマガジンに投稿されたゲームを、ラクして遊びたい

      BASICマガジンに投稿されたゲームを遊ぶのには、プログラムを入力しなくてはならない。
      いわゆる「写経」である。
      それをなんとかラクにできないかを実験した。

    2. テストプログラム

      テストプログラムとして、
      • 適度な長さのプログラムであること
        (約1KBに収まっている)
      • 掲載誌のページをまたいでいないこと
        (画像の編集が不要)
      • IchigoJam固有のキャラクタやカタカナが使われていないこと
      等を条件に下記のプログラムを選んだ。

      掲載誌BASIC Magazine 43(電子工作マガジン2019年8月号別冊)
      プログラム名ファフニール
      作者あべのぶひで氏
      Fafnir1

    3. 方法

      以下の方法でOCR(光学的文字認識)を行う。

        Fafnir2
      1. 掲載されているプログラムをデジタルカメラで撮影
      2. 撮影した画像ファイルをgoogleドライブにアップロード
      3. googleドライブ上にて、"googleドキュメント"アプリで開く
      4. アプリが自動で文字認識をしてくれる
      5. 文字認識されたテキスト部分をコピーし、PCのテキストエディタ(メモ帳など)に貼り付け、必要に応じて保存する
      6. OCRしただけのテキストは改行がされていないので、行番号を目安に改行を挿入する
      7. IchigoJamに転送して実行
      8. エラーや不正動作があったら適宜修正
      9. バグが無くなるまで、7~8を繰り返す

    4. 結果

      OCRを使ったプログラムの文字認識結果は以下の通りである。

      総文字数953文字
      誤認識した文字数25文字
      誤認識率(文字単位)2.6% (=25文字/953文字)
      修正した行20,30,40,60,70,90,110,120,150,160,
      170,180,190,200,200,210,220,230
      エラー率(行単位)78.3% (=18行/23行)

    5. 考察

      まず、無修正でIchigoJamに転送したところ、"Out of memory”エラーが発生した。
      これは本来プログラム中には無いスペースが挿入されてしまったためである。
      そこで、全てのスペースを削除(テキストエディタで一括変換)した。
      これにより"Out of memory”エラーは発生しなくなったが、30行の”Fafnir Stage"のスペースまで削除されてしまった。
      このような固定文字列中のスペースについては一括変換を用いた削除では対応できないので課題が残る。

      画像をテキストに変換した時点で文法エラーを見つけていたが、今回の実験は「文字認識率」に重点を置いたので、あえて修正せずにIchigoJamに転送してエラーを発生させた。
      転送前に文法エラーを修正すれば、エラー発生率を下げられると考えられる。

      誤認識した文字を以下に示す。
      O(オー)0(ゼロ)
      0()
      C(
      E=
      N=
      上記の他に、文字抜けや、行末に不要文字が付加されるなどの誤認識があった。

      O(オー)と0(ゼロ)の誤認識により、"GOT0"となっている箇所がいくつかあった。
      これは予め検索することで、実行前に修正することが可能である。

      エラーメッセージが出ず、見つけにくいバグもあった。
      20行の後半、"COPY#800,1,200"である。
      これは文法エラーにならないため、バグの場所を見つけにくかった。

    6. 所感

      今回はあえてエラーの出なそうなプログラムを選んだ。
      前述した理由以外に、フォントの種類やフォントサイズも素材選びの対象としている。

      で、実際にOCRで写経がラクになったかと言うと、1KB程度のプログラムでは微妙である。
      ただ、ほぼ全ての誤認識が文法エラーだったので、全てを写経するよりはラクだったと思われる。

      「実際に手を動かした(写経した)方がプログラミングが身に付く」と言う意見もあると思うが、プログラムを読めないとバグ取りもできないはずである。
      本実験でバグ取りだけをやってみたが、このプログラムのおおまかな流れは把握することができた。
      100行の"W=-20"なんて「なるほど」と思う小技と思う。
      (まぁ、この手法が原因不明のバグの遠因だった訳だが(後述))

      なので「こういうやり方(OCR写経)があっても別にいいんじゃないの」というのが感想。

      さて、原因不明のバグなんですけど、"W=-20"は文字コードとして使われていて、例えば"LC0,0:?CHR$(-20)"とやると、ASCIIコード236のキャラクタが表示されます。(負数の下8bit)
      次に"?SCR(0,0)"とやると、"-20"という結果が表示されます。(IchigoJam AP v12243)
      ところが、このプログラムではSCR(x,y)の結果に236という数値が返るとして書かれています。
      で、70行のIF S=Tが偽となり、不正な動作(ロープを登れない)になってしまっていました。
      対策として100行を"S=SCR(X,Y)&#FF"とすることでようやく遊ぶことができました。
      このバグを見つけるのに結構時間を要したので、OCR写経がラクだったのかどうか、わからなくなってしまいましたのも事実(笑)

    7. 資料

      以下が、OCR直後、改行挿入後、デバッグ後の各プログラムである。

      OCR直後
      10 CLV:P=#93:T=#F2:U=#900 20 CLS:L=L+1:X=30: Y=1:V=22:D=6:COPY#800,1,200 30 POKEU, 6:COPYU+1,,31:COPY#BCO,U,32:LC10,23:?"Fafnir Stage";L; 40 FORI=0T025+L*9:POKE#940+RND(640), 0,6,6:NEXT 50 Q=L+2: FORI=1TOQ: GSB220:NEXT 60 WAIT5:K=INKEYO * (W>0):CLK 70 G=CK=29)*(X<31)-CK=28)*!!X:H=1:IF SET H=CK=31)-(K=30) 80 LC X,Y:?CHR$(S); : Y=Y+H*(SCR(X,Y+H)<>6):X=X+G*(SCR(X+G,Y)<>6) 90 BEEPN+ABS(X-Z)*3+1,7:IF N LC MN:?CHR$(T);:N=(N-1)*! SCR(M,N-1) 100 S=SCR(X,Y):LC X,Y:?CHR$(#ED);:IF S=#E8 OR S=#E9 W=-20:VIDEO2 110 IF SEP BEEP2:0=Q-1 120 S=S*(S=T):IF (K=32)*!N MEX:N=Y: SET 130 IF !Q BEEP3,60:WAIT90: GOTO20 140 IF X=Z AND Y=V WAIT90: BEEP200,80: GOTO230 150 IF !W VIDE01 160 W=W+1:IF W%3 GOT060 170 IF !RND(5)+! (Z%31)+! (V%22)+(W<1) J=!J:A=((X>Z)-(XV)-(Y6 ?CHR$(#E8+(DNT)); 200 E=U+Z+V*32:[C]=E:D=PEEKCE):IF D<>6 POKEE,#EC:IF DEP GSB220 210 GOT060 220 R=#960+RNDC608):IF PEEK(R) CONT ELSE POKER,P:RTN 230 LC12, 10:?"GAME OVER":IF INKEYO)=10 RUN ELSE CONT
      FEKTIC])=#E8 PORECE&+CD=T));TF DP GSB220


      改行挿入後
      10 CLV:P=#93:T=#F2:U=#900 
      20 CLS:L=L+1:X=30: Y=1:V=22:D=6:COPY#800,1,200 
      30 POKEU, 6:COPYU+1,,31:COPY#BCO,U,32:LC10,23:?"Fafnir Stage";L; 
      40 FORI=0T025+L*9:POKE#940+RND(640), 0,6,6:NEXT 
      50 Q=L+2: FORI=1TOQ: GSB220:NEXT 
      60 WAIT5:K=INKEYO * (W>0):CLK 
      70 G=CK=29)*(X<31)-CK=28)*!!X:H=1:IF SET H=CK=31)-(K=30) 
      80 LC X,Y:?CHR$(S); : Y=Y+H*(SCR(X,Y+H)<>6):X=X+G*(SCR(X+G,Y)<>6) 
      90 BEEPN+ABS(X-Z)*3+1,7:IF N LC MN:?CHR$(T);:N=(N-1)*! SCR(M,N-1) 
      100 S=SCR(X,Y):LC X,Y:?CHR$(#ED);:IF S=#E8 OR S=#E9 W=-20:VIDEO2 
      110 IF SEP BEEP2:0=Q-1 
      120 S=S*(S=T):IF (K=32)*!N MEX:N=Y: SET 
      130 IF !Q BEEP3,60:WAIT90: GOTO20 
      140 IF X=Z AND Y=V WAIT90: BEEP200,80: GOTO230 
      150 IF !W VIDE01 
      160 W=W+1:IF W%3 GOT060 
      170 IF !RND(5)+! (Z%31)+! (V%22)+(W<1) J=!J:A=((X>Z)-(XV)-(Y6 ?CHR$(#E8+(DNT)); 
      200 E=U+Z+V*32:[C]=E:D=PEEKCE):IF D<>6 POKEE,#EC:IF DEP GSB220 
      210 GOT060 
      220 R=#960+RNDC608):IF PEEK(R) CONT ELSE POKER,P:RTN 
      230 LC12, 10:?"GAME OVER":IF INKEYO)=10 RUN ELSE CONT
      
      FEKTIC])=#E8 PORECE&+CD=T));TF DP GSB220
      


      デバッグ後
      10 CLV:P=#93:T=#F2:U=#900
      20 CLS:L=L+1:X=30:Y=1:V=22:D=6:COPY#800,U,200
      30 POKEU,6:COPYU+1,U,31:COPY#BC0,U,32:LC10,23:?"FafnirStage";L;
      40 FORI=0TO25+L*9:POKE#940+RND(640),0,6,6:NEXT
      50 Q=L+2:FORI=1TOQ:GSB220:NEXT
      60 WAIT5:K=INKEY()*(W>0):CLK
      70 G=(K=29)*(X<31)-(K=28)*!!X:H=1:IFS=TH=(K=31)-(K=30)
      80 LCX,Y:?CHR$(S);:Y=Y+H*(SCR(X,Y+H)<>6):X=X+G*(SCR(X+G,Y)<>6)
      90 BEEPN+ABS(X-Z)*3+1,7:IFNLCM,N:?CHR$(T);:N=(N-1)*!SCR(M,N-1)
      100 S=SCR(X,Y):LCX,Y:?CHR$(#ED);:IFS=#E8ORS=#E9W=-20:VIDEO2
      110 IFS=PBEEP2:Q=Q-1
      120 S=S*(S=T):IF(K=32)*!NM=X:N=Y:S=T
      130 IF!QBEEP3,60:WAIT90:GOTO20
      140 IFX=ZANDY=VWAIT90:BEEP200,80:GOTO230
      150 IF!WVIDEO1
      160 W=W+1:IFW%3GOTO60
      170 IF!RND(5)+!(Z%31)+!(V%22)+(W<1)J=!J:A=((X>Z)-(XV)-(Y6?CHR$(#E8+(D=T));
      200 E=U+Z+V*32:[C]=E:D=PEEK(E):IFD<>6POKEE,#EC:IFD=PGSB220
      210 GOTO60
      220 R=#960+RND(608):IFPEEK(R)CONTELSEPOKER,P:RTN
      230 LC12,10:?"GAMEOVER":IFINKEY()=10RUNELSECONT


    • タイトル
      いちご雀(イチゴジャン)
      (電子工作マガジン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の場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)

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

    ↑このページのトップヘ