• タイトル
    マインスイーパーlatte (電子工作マガジン2017年WINTER号掲載)

  • 開発環境
    IchigoJamBASIC1.2.1

  • 内容
    マインスイーパーです。

  • マインスイーパーlatte
  • 遊び方
    フィールドの中から爆弾を探すゲームです。 爆弾に隣接しているマスは隣接している爆弾の数が表示されるので、それをヒントに全てのマスを開けてください。

  • 操作方法
    横方向(X軸)と縦方向(Y軸)を入力してマスを開きます。 それぞれ1~8の数字を入力し、Enterします。 全て開けられれば成功、爆弾を開けてしまうと失敗です。 最後にかかった時間が表示されます。

  • プログラムのしくみ

    各関数の説明
    bm.clrフィールド用メモリクリア
    bm.set爆弾配置
    bm.disp画面表示
    引数 0:爆弾を伏せて表示 1:爆弾を表示
    返値 開いていないマスの数
    kyinキー入力
    引数 xy:"X"または"Y"の文字 pos:文字表示Y座標
    返値 入力された数値
    searchマスを開く
    引数 入力したX,Y座標
    返値 0:爆弾以外を開いた 0以外:爆弾を開いた
    main初期設定、画面表示
    残りマス=爆弾数、もしくは爆弾を開いてしまうまでループ
    結果表示

    変数表(グローバル変数のみ)
    B爆弾の数
    Tゲーム開始時のタイム
    mメモリ(配列)先頭アドレス
    x,y入力した座標
    n残りマス数
    s入力座標が爆弾かどうか

  • プログラムの具体的な入力方法
    可読性を良くするためスペースでインデントしていますが、行頭のスペースは入力しなくても動作します。

  • プログラムの改造
    変数"B"は爆弾の数です。増減して難易度を変更することができます。

  • (プログラム1)
    var B=6;
    function bm(f){
     this.clr=function(){
      var i=0;
      while(i<100 ){
       if((i>10)*(i<89 )*((i%10)%9!=0)){ mem(m+i,0xF4); }
       else{ mem(m+i,0); }
       i=i+1;
      }
     };
     this.set=function(){
      var i=B, r;
      while(i){
       r=(rnd(8)+1)*10+rnd(8)+1;
       if(mem(m+r)==0xF4){
        mem(m+r,0xF6);
        i=i-1;
       }
      }
     };
     this.disp=function(f){
      var i=1, c, n=0;
      cls();
      log("\\X12345678\nY\n");
      while(i<9){
       var j=0;
       log(i);
       while(j<9){
        c=mem(m+i*10+j);
        if((c>0)*(c<9 )){ c=c+0x30; }
        else{
         if((c>9)*(f==0)){ c=0xF4; }
        }
        log(chr(c));
        if(c==0xF4){ n=n+1; }
        j=j+1;
       }
       log("\n");
       i=i+1;
      }
      return(n);
     };
    }
    
    function kyin(xy,pos){
     lc(0,pos);
     log(xy,"= ");
     var k=input();
     if((k<1 )*(k>8)){ k=0; }
     return(k);
    }
    
    function search(u,v){
     var sp=m+100;	//stack pointer
     var src=v*10+u;	//search position
     var z=mem(m+src);	//search position char
     if(((u%10)%9==0)*((v%10)%9==0)){ return(0); }	//out side
     if(z<=9){ return(0); }	//number
     if(z==0xF6){ return(z); }	//bomb
    
     var indx=0;
     mem(sp,1);	//[0]=1
     mem(sp+1,src);	//[[0]]=[1]=src
    
     var x, y, z, j, count=0;
     while(indx9){
          mem(sp, mem(sp)+1);
          mem(sp+mem(sp),j);
         }
         if(z==0xF4){ mem(m+j,0); }
         x=x+1;
        }	//while(x
        y=y+1;
       } 	//while(y
      }
      mem(m+src,count);
     }	//while(co
     return(0);
    }
    
    //main
    var T=tick();
    var m=mem(" ");
    var bomb=new bm();
    var x=0, y=0, n=1, s=0;
    bomb.clr();
    bomb.set();
    n=bomb.disp(0);
    while((n!=B)*(s==0)){
     x=kyin("X",12);
     y=kyin("Y",13); 
     if(x*y){
      s=search(x,y);
     }
     n=bomb.disp(0);
    }
    bomb.disp(1);
    if(s){ log("\n\nGAME OVER\n"); }
    if(n==B){ log("\n\nCONGRATULATION!\n\n"); }
    log("TIME: ",(tick()-T)/1000,"sec\n");
    

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

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

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

  • 参考ゲーム
    マインスイーパー