mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【IchigoLatte】ゴーストバスター(ゲーム)

隕石避けゲームに少し手を入れたら全く違うものになりましたw
内容は、
・5編隊の炎を追加
・レーザーを撃てる(最大5発まで)
・自分が上下にも移動可能
・アイテム(☆)を取ると敵が全滅、レーザー5発補給
・見た目の変更
・タイトル画面を追加

f:id:myerss555:20170823201352j:plain
f:id:myerss555:20170823201405j:plain

※2KByteに収めるためなるべく空白を減らしています

//----- Ghost Buster
var LASER=0xf7;
var ITEM1=0xf0;
var ENEMY1=0xec,ENEMY2=0xf5;
var GHOSTS=5,X=15;
var count,score,wait,my;
var i,j,k,x,y,char,shot;
var str=" Hit Enter Key ... ";

function ini()
{
 my=0xf9;
 y=23;
 count=0;
 score=0;
 wait=200;
 shot=5;
 cls();
 x=10;
 lc(x,6);
 log("Ghost Buster!\n");
 x=4;
 lc(x,9);
 log("MOVE ...",
  "LEFT,RIGHT,UP,DOWN\n");
 lc(x,10);
 log("SHOOT...SPACE\n");
 lc(x+4,11);
 log(chr(ITEM1),
  "...All Flush ITEM !\n");
 x=8;
 lc(x,14);
 log(str);
 input();
 cls();
}

function key(kc)
{
 k=kc;
}

function ghost()
{
 count=count+1;
 if(count%10==0){
  lc(rnd(31),0);
  log(chr(ENEMY1));
 }

 if(count%100==0){
  i=0;
  x=rnd(31-GHOSTS);
  while(i<GHOSTS){
   lc(x+i,0);
   log(chr(ENEMY2));
   i=i+1;
  }
 }

 if(count%300==0){
  x=rnd(31-3);
  i=0;
  while(i<3){
   j=0;
   while(j<3){
    lc(x+j,i);
    log(chr(ITEM1));
    j=j+1;
   }
   i=i+1;
  }
 }
}

function shoot()
{
 i=0;
 i=0;
 while(i<10){
  lc(X,y-i-1);
  log(chr(LASER));
  i=i+1;
  sleep(10);
 }
 i=0;
 while(i<10){
  lc(X,y-i-1);
  log(chr(0x00));
  i=i+1;
  sleep(10);
 }
 shot=shot-1;
}

function move()
{
 lc(X,y);
 log(chr(0x00));
 scroll(2,1);
 if(k==0x1c){
  my=0xfd;
  scroll(1,1);
 }
 if(k==0x1d){
  my=0xfb;
  scroll(3,1);
 }
 char=scr(X,y);
 if((k==0x1e)*(y>11)){
  my=0xf9;
  y=y-1;
 }
 if((k==0x1f)*(y<23)){
  my=0xfa;
  y=y+1;
 }
 k=0;
 lc(X,y);
 log(chr(my));
}

function check()
{
 if(char==ITEM1){
  cls();
  lc(11,13);
  log("FLASH !!!\n");
  sleep(2000);
  cls();
  shot=5;
  return;
 }

 if(char){
  x=10;
  lc(x,13);
  log(" GAME OVER ");
  lc(x,14);
  log(" ",score," points ");
  x=8;
  lc(x,16);
  log(str);
  input();
  ini();
  setTout(main,wait);
 }
}

function main()
{
 score=score+1;
 ghost();

 if((k==0x20)*(shot>0)){
  shoot();
 }

 move();
 check();

 if(wait>30){
  wait=wait-1;
 }

 setTout(main,wait);
}

setKprs(key);
ini();
main();

【IchigoLatte】USB-シリアルモジュール(PC⇔IchigoLatte間転送)

IchigoJam 向け USB-シリアルモジュール ※IchigoLatteでも使えます
「ショップのふうせん」で購入
f:id:myerss555:20170806233814j:plain

残念ながら、PC上から直接コマンド入力やviは使えません
ファイル(プログラム)転送は動作確認済み

【初期設定】
①「CP210x USB - UART ブリッジ VCP ドライバ」をインストール
 ※Linuxの場合はドライバ不要のようです
 https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

 例)Windows7 64bit の場合
 CP210x_Windows_Drivers.zip を解凍し、CP210xVCPInstaller_x64.exe を起動

②IchigoLatte と USB-シリアルモジュールを接続
 ジャンパワイヤ オスーメス 3本で繋ぐだけなんですが
 ポイントは、RXDとTXDをクロスさせること
 (最初クロスせずに繋げて3分ほど悩みました・・・)
 RXD - TXD
 TXD - RXD
 GND - GND

③USB-シリアルモジュールをPCに挿す

④IchigoLatte の電源ON

⑤Tera Term の設定
 Terminal設定
 f:id:myerss555:20170807000251p:plain
 f:id:myerss555:20170807000308p:plain
 Serial設定
 f:id:myerss555:20170807000638p:plain
 f:id:myerss555:20170807000652p:plain


【転送(PC ⇒ IchigoLatte)】
①IchigoLatte の画面で、cat uart > .

②Tera Term からファイル転送
 f:id:myerss555:20170807001003p:plain
 f:id:myerss555:20170807001017p:plain
 f:id:myerss555:20170807001029p:plain

③青いLEDが消灯していることを確認して、IchigoLatte の画面で、ESCキー
 ☆★☆ 注意! ☆★☆
  Tera Term で転送が終了しても、USB-モジュールの青いLEDが点灯中はまだ転送中です
 f:id:myerss555:20170807003458j:plain

④IchigoLatte の画面で、viで内容確認
 ※改行コードが文字化けしている場合は、転送元PCのファイルの改行コードを「LF」で保存する
 ※私の環境では、改行コードが「CRLF」だと文字化けしました


【転送(IchigoLatte ⇒ PC)】
①IchigoLatte の画面で、cat . > uart
②Tera Term にプログラムが表示されるので、コピペしてPCに保存する
 f:id:myerss555:20170807002516p:plain

【IchigoLatte】みんなのIchigoLatte入門

webではIchigoLatteの情報がまだまだ少ないので試しに買ってみました
f:id:myerss555:20170806221333j:plain

本体よりもちょっぴり高いですがその価値は十分にあり
特にサンプルプログラムを動かしてみるとIchigoLatteの癖(?)が
よくわかります

35本のサンプルプログラムの1例(隕石避けゲーム)

// ----- Meteor Game -----
var k,x=15,y=23;
var count=0,score=0,wait=200;

// key
function key(kc){
    k=kc;
}

// main
function main()
{
    score=score+1;

    // print meteor
    count=count+1;
    if(count%10==0){
        lc(rnd(31),0);
        log(chr(0xe9));
    }
    lc(rnd(31),0);
    log(chr(0));

    // move
    lc(x,y);
    log(chr(0));
    scroll(2,1);
    if(k==28){
        scroll(1,1);
    }
    if(k==29){
        scroll(3,1);
    }
    k=0;
    var char=scr(x,y);
    lc(x,y);
    log(chr(0xf1));

    // check
    if(char){
        lc(11,13);
        log("Game Over\n");
        lc(11,14);
        log(score," points\n");
        exit();
    }

    // set timer
    if(wait>30){
        wait=wait-1;
    }
    setTout(main,wait);
}

// start
setKprs(key);
cls();
main();

内容は掲載のサンプルそのままですが、見やすいようにインデント等変えてます
このサンプルではサイズに余裕があるので大丈夫ですが、
実際は見た目よりもサイズを考慮して書く必要があります
まずは空白を極力減らすことでしょうか
※最大2KByteまで


f:id:myerss555:20170806222528j:plain