• タイトル
    MatchBit

  • 開発環境
    IchigoJamBASIC1.2.1
    IchigoLatte1.0.1

  • 内容
    マイコンが決めた1と0の並びを30秒の制限時間以内に当てるゲームです。
    クリアすると1桁ずつ増えていきます。

  • MatchBit
  • 遊び方
    「START!」の表示の後、キーを入力していきます。
    入力された数字(0または1)は回答欄の右端に入り、それまであった並びは1桁ずつ左にずれます。一番左にあった数字は削除されます。(これを左シフトと言います)
    マイコンが決めた数字と一致すればレベルクリアで、かかったタイムと積算時間が表示されます。

  • 操作方法
    RUNすると「Ready?」と表示され、カウントダウンが始まります。
    「START!」の表示で入力開始。
    どのキーを押してもOKです。("Esc"を除く)
    入力されたキーのアスキーコードが奇数なら1、偶数なら0が入力されます。

  • プログラムの具体的な入力方法
    左にJavaScript、右にBASICのプログラムが書かれています。
    IchigoLatteの場合は左のプログラムを、IchigoJamの場合は右のプログラムを入力してください。

  • プログラムについて
    プログラムは、IchigoJamのBASICから、IchigoLatteのJavaScriptへステップアップするための参考プログラムとして、あえて各命令が対になるように書いてあります。
    また、IchigoLatteに無い「BIN$」命令は新たに作成しています。

    各処理の内容は下記の通りです。

  • 各行の処理
    JavaScriptBASIC処理内容
    init()30 @I:'init変数設定
    readyGo()90 @R:'ready_goカウントダウン
    bin() BIN$()
    key() 260 @K:'key キー入力、一致確認、タイムアウト
    disp()400 @D:'disp結果表示
    match()460 @O:'match 一致した場合の表示
    gameOvr()540 @E:'game overゲームオーバー表示
    main()620 @M:'mainメイン処理


  • BASICからJavaScriptへステップアップのコツ
    BASICからJavaScriptへステップアップする際、最初に戸惑うのは「GOTO」命令が無いことと思います。
    「GOTO」を使わないプログラムを書くためには、プログラムの設計段階から考えなくてはなりません。

    まずBASICのプログラムリストを見てください。
    全ての処理が小さなサブルーチンになっていて、それらはほとんどがメイン処理(main以後)から呼び出されています。
    BASICではこの様な書き方はあまり見られないと思いますが(構造化BASICを除く)、これような書き方をすると「GOTO」をできるだけ使わない書き方ができます。

    今回作ったJavaScriptのプログラムでは「GOTO」を使う代わりに、「while」で行を戻る、「if」や「break」で行を飛ばす、「return()」で処理を飛ばす、といった手法を使っています。

    今日広く使われているプログラミング言語の多くは「GOTO」命令の使用を推奨していません。(これについては色々な意見はあります)
    「GOTO」を使わない処理の流れを考えるクセをつけておくと、JavaScript以外の言語を習得する際にも役に立ちます。

    なお、今回はBASICとJavaScriptの比較をテーマにしましたので、全ての変数がグローバル変数になっています。
    実際にJavaScriptでプログラムする場合は、関数の返り値やローカル変数を多用します。
    JavaScriptでのプログラムに慣れてきたら、変数のスコープも考えてプログラムを設計するようにしましょう。

    以上、簡単ではありますが上記プログラムがJavaScript学習の一助になれば幸いです。


  • MachBit
    JavaScriptBASIC
    //MachBit
    
    var l=0, n, t, u=0, r, s=0, x, y;
    
    function init(){
     l=l+1;
     x=0;
     n=1<<(l+1);
     y=rnd(n);
    }
    
    function readyGo(){
     var i=0;
     cls();
     log("LEVEL = ",l);
     lc(0,5);
     i=0;
     while(i<=l){
      log("?");
      i=i+1;
     }
     lc(0,2);
     log("Ready?");
     i=0;
     while(i<=4){
      lc(0,3);
      log(5-i);
      sleep(1000);
      i=i+1;
     }
     lc(0,3);
     log("START!\n\n");
    }
    
    function bin(b,d){
     while(d>0){
      log(((1<<(d-1))&b)!=0);
      d=d-1;
     }
    }
    
    function key(){
     var k;
     while(x!=y){
      k=0;
      while(!k){
       k=inkey();
       lc(20,6);
       log((30000-tick()+t)/1000," ");
       if(tick()-t>30000){
        return(0);
       }
      }
      k=k%2;
      x=(x<<1)+k;
      x=x&(n-1);
      lc(0,6);
      bin(x,l+1);
     }
     return(1);
    }
    
    function disp(){
     lc(0,5);
     bin(y,l+1);
     lc(0,11);
     log("Your Level = ",l,"\n");
     log("Your time  = ",u/1000,"sec\n");
     log("Total time = ",s/1000,"sec\n");
    }
    
    function match(){
     u=tick()-t;
     s=s+u;
     log("\n\nMATCH BIT!");
     disp();
     log("\nHIT [enter] key then next level");
     while(inkey()!=10){}
    }
    
    function gameOvr(){
     log("\ntime out");
     disp();
     lc(13,11);
     log(l-1);
     lc(0,15);
     log("GAME OVER\n");
    }
    
    function main(){
    
     while(1){
      init();
      readyGo();
      t=tick();
      if(!key()){
       break;
      }
      match();
     }
     gameOvr();
    }
    
    main();
    
    10 'MachBit
    20 GOTO@M
    
    
    30 @I:'init
    40 L=L+1
    50 X=0
    60 N=1<<(L+1)
    70 Y=RND(N)
    80 RTN
    
    90 @R:'ready_go
    
    100 CLS
    110 ?"LEVEL = ";L
    120 LC0,5
    
    130 FORI=0TOL
    140 ?"?";
    
    150 NEXT
    160 LC0,2
    170 ?"Ready?"
    
    180 FORI=0TO4
    190 LC0,3
    200 ?5-I
    210 WAIT60
    
    220 NEXT
    230 LC0,3
    240 ?"START!"
    250 RTN
    
    'BIN$(b,d)
    
    
    
    
    
    
    260 @K:'key
    
    
    
    
    270 K=INKEY()
    280 LC20,6
    290 ?(1800-TICK())/60;" "
    
    
    300 IFTICK()>1800R=0:RTN
    310 IF!KGOTO@K
    320 K=K%2
    330 X=(X<<1)+K
    340 X=X&(N-1)
    350 LC0,6
    360 ?BIN$(X,L+1)
    370 IFX!=YGOTO@K
    380 R=1
    390 RTN
    
    400 @D:'disp
    
    410 LC0,5:?BIN$(Y,L+1)
    
    420 LC0,11:?"Your Level = ";L
    430 ?"Your time  = ";U/60;"sec"
    440 ?"Total time = ";S/60;"sec"
    450 RTN
    
    460 @O:'match
    470 U=TICK()-T
    480 S=S+U
    490 ?:?:?"MATCH BIT!"
    500 GSB@D:'disp
    510 ?:?"HIT [enter] key then next level"
    520 @W:IFINKEY()!=10GOTO@W
    530 RTN
    
    540 @E:'game over
    550 ?:?"time out"
    560 GSB@D:'disp
    570 LC13,11
    580 ?L-1
    590 LC0,15
    600 ?"GAME OVER"
    610 RTN
    
    620 @M:'main
    630 CLV
    640 @L:'loop
    650 GSB@I:'init
    660 GSB@R:'ready_go
    670 CLT:T=TICK()
    680 GSB@K:'key
    
    
    
    690 IFRGSB@O:GOTO@L:'match:'loop
    700 GSB@E:'end
    710 END
    
    
    

    ダウンロードURLは下記になります。
    MachBit(JavaScript)  http://tagiyasoft.blog.jp/machbit_J.bin
    MachBit(BASIC)  http://tagiyasoft.blog.jp/machbit_B.bin


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

  • 参考ゲーム
    初歩のラジオ 1979年7月号  金庫破りゲーム「ルパン」