IchigoJamで作ろう君の町のクイズ!全国選抜小学生プログラミング大会 福井県大会 の締め切りは今週末!

IchigoJamで作ろう君の町のクイズ!全国選抜小学生プログラミング大会 福井県大会 の締め切りは今週末!

IchigoJam BASICで簡単「クイズマシーン」を作ってみよう。

10 CLS

何はともあれ、まずは画面を綺麗に。

20 ?"フクイ デ ユウメイナ モノハ?"

‘?’ は「画面に見せて」の意味、これでクイズが表示されるはず、RUNしてみよう。

30 ?" 1:リンゴ"
40 ?" 2:キョウリュウ"
50 ?" 3:フジサン"

答えは3択にしてみよう、このコードを足してRUN、選択肢が現れるよ。

60 INPUT A

‘INPUT’ はキーボードから入力を受け付け、今回は変数Aに値が入るよ。

70 IF A!=2 GOTO60

もし答え(A)が 2 じゃなかったら60行目に戻るよ。

80 PLAY"T800<<<EG"

もし答え(A)が 2 だったら80行目にくるので、正解っぽい曲を流そう。

全体はこんな感じ。IchigoJam はプログラムを4つ保存可能、正解したら LRUN1 で次のクイズに行ってもいいね。

きみの町自慢をクイズにしても面白いかも?

そしてまだ間に合う、ぜひコンテストに応募しよう!










.

光センサーとサーボで “触らず” にスイッチを操作!IchigoJamでまちごとハッキング!?

光センサーとサーボで “触らず” にスイッチを操作!IchigoJamでまちごとハッキング!?

締め切りまで1週間「全国選抜小学生プログラミング大会 福井県大会」、「もっと好きになる わたしのまち」をテーマにまずは作ってみよう。

ということで、光センサーとサーボモーターを使ってこのような接続を。

光センサーと抵抗は足が長すぎたので切って短く。

10 PWM2,150
20 IF ANA(2)<500 GOTO10
30 PWM2,125
40 WAIT20
50 GOTO10

今回のプログラムはこんな感じ。

10 サーボをスタート角度に設定
20 もし光センサーが明るかったら 10へ
30 サーボの角度を125の向きに設定
40 1/3秒そのまま
50 10へ

センサーが500より小さい(明るい)うちはずっとセンサーをチェック、暗くなったら30に来るのでサーボを少し動かしてまた10へ。

さぁ、やってみよう。IchigoJam(IchigoDake)はキーボードとモニタがなくても動きます、このように設置しましょう。

サーボをスイッチにテープで貼り付け。

そしてこの光センサーに手をかざして暗くすると、非接触でスイッチを消すことができる、という算段。

非接触でスイッチングできるとこのご時世とても助かります。

まち中のスイッチを非接触にしちゃっても楽しいかも?締め切りまで残り1週間、楽しい作品待ってます










.

PDFに変わってCSVをアップしてみよう!いろんな様式書類を一発で作る「様式メーカー」α版!

PDFに変わってCSVをアップしてみよう!いろんな様式書類を一発で作る「様式メーカー」α版!

先日開催された「dxgov#2」、話すだけのMTGではなく “話して作るMTG”。

途中退席したものの、福野くんが「そもそも町内会や自治会をDX化できるか? 第2回 行政DXを創る会」として成果を共有してくれてます。

そこでGitHubに公開されていた register_terminal.html がとってもいい感じだったので派生して作りました「様式メーカー」。

使い方はまず、様式書類で集めたい項目をExcelやSpreadsheetで書き出します。「項目名」「項目型」「規定項目値」「備考」という4列の表にします。

保存する名前はなんでもいいですが、ファイルタイプを “CSV” にしましょう。(かつ utf-8 がおすすめ)

普段は様式PDFをどこかのサーバーにアップして、利用者がDL&印刷、そして書き込みという流れだと思いますが、ここではCSVをサーバーにアップ。

利用者はCSVファイルのURLをこの「様式メーカー」に入れます。(これまでの「DL&印刷」にあたる)

するとWeb上に書類様式が現れますので、項目を入力します。(送信は未実装)

先日の福野くんとクリスが作ったCSVもちゃんと表示されます。

まずは身近な会合やイベントの書類なんかを「DX」してみるといいかも。










.

カムロボをソーラーパネルで急速充電!JavaScriptで対応する鉛とニッケル水素バッテリー

カムロボをソーラーパネルで急速充電!JavaScriptで対応する鉛とニッケル水素バッテリー

Radishのバッテリー充電に味をしめ、

次はカムロボを充電。

// Charge Controller Ni 0.2
ana(5);ana(6); //OUT1,2 to ana

var Vmax=1900*4;  //mV
var Vblk=1350*4;  //mV
var Imax=2000*1;  //mA
var Nstp=6;       //times

function getVs(){
 var r=0;
 var i=32;

 while(i){
  r=r+(ana(5)*3300*10/1023);
  i=i-1;
 }

 return r/32;
}

function getVb(){
 var r=0;
 var i=32;

 while(i){
  r=r+(ana(6)*3300* 5/1023);
  i=i-1;
 }

 return r/32;
}

function getI(){
 var r=0;
 var i=32;

 while(i){
  r=r+(ana(2)*3300*10/1023);
  i=i-1;
 }

 return r/32;
}

// Bulk
function onChrgB(){
 log("[B]");
 var Vs=getVs(); log("Vs:",Vs," ");
 var Vb=getVb(); log("Vb:",Vb," ");
 var I =getI();  log( "I:", I," ");

 if( (Vb<Vmax)*(I<Imax) ){
  d=d+1; if(100<d)d=100;
 }else{
  d=d-1; if(d<0)d=0;
 }
 log("d:",d,"\n");

 pwm(4,d);led(1);
}

function onChckB(){
 pwm(4,0);led(0);
 sleep(1500);

 var Vb=getVb(); log("(B)Vb:",Vb,"\n");
 if(Vb<=vl) sc=sc-1;
 vl=Vb;

 if( sc ) return onChrgB;
 return onChrgF;
}

// Float
function onChrgF(){
 pwm(4,0);led(0);
}

function onChckF(){
 pwm(4,0);led(0);
 sleep(1500);

 var Vb=getVb(); log("(F)Vb:",Vb,"\n");
 sc=Nstp;
 vl=Vb;

 if( Vb<Vblk ) return onChrgB;
 return onChrgF;
}



// main
pwmt(100);
var d=0;          //PWM duration
var m=0;          //charge mode
var c=onChckF;    //check mode
var vl=0;         //last Vb
var sc=Nstp;      //stop count

while( m=c() ){
 var t=tick();
 while( tick()-t < (1000*10) ){
  m();
  if( inkey() + btn() ){pwm(4,0);led(0);sleep(1000);exit(1);}  // for DBG
 }

 if(m==onChrgB) c=onChckB;
 if(m==onChrgF) c=onChckF;
}

pwm(4,0);led(0);

チャージコントローラーのプログラム(IchigoLatte JS)はNiMh用に作り直してこんな感じ。鉛バッテリーとは充電時の挙動が違います。

ネオチャンプ4本をカムロボに積んだまま急速充電、快晴なら同時に3台( 12本)を30分で満タン、これならイベント会場で無限に走れる!

こいつ1つでなんでも充電できちゃう?プログラミングって面白いっ!

もしやられる方は電気の扱いに十分にお気をつけください!!!

なにかの間違いにより火災などに至る可能性があります。










.

ソーラーパネルでバッテリーを充電、IchigoJamで自作する「チャージコントローラー」!

ソーラーパネルでバッテリーを充電、IchigoJamで自作する「チャージコントローラー」!

下敷きのようにペラペラしてて¥12,000、「フレキシブル ソーラーパネル」をゲット!

出力は100Wもあります。

これは「こどもじどうしゃ Radish」を「おひさま」の力で走らせるしかないっ。

Radish(元はmottoy)のバッテリーは Pb 6v、いつもは付属の充電アダプタでコンセントから充電していますが、今回は夢の「ソーラー発電」。

ソーラーパネルをバッテリーにつなげば充電はされますが、なんといっても今回のパネルは100W、6A以上 も流れるし 21V まで上がるということで、直つなぎはやめてIchigoJamで制御します。

考えた回路はこちら、FETでチョッパーしてやろうという魂胆。ソーラー電圧、バッテリー電圧、電流をみるための回路も追加。

組んでみた基板はこんな感じ。ひとまず 7A ぐらいに耐えれるように試作、ついでにバッテリー系統から3.3vを作る回路も追加。

IchigoJam や IchigoDake に重ねて使用します。

// Charge Controller 0.3
ana(5);ana(6); //OUT1,2 to ana

var Vmax=7200;    //mV
var Vreg=6900;    //mV
var Imax=1000*1;  //mA
var Tchk=1000*10; //msec

var d=0;
var t=tick();

function getVs(){
 var r=0;
 var i=50;

 while(i){
  r=r+(ana(5)*3300*10/1023);
  i=i-1;
 }

 return r/50;
}

function getVb(){
 var r=0;
 var i=50;

 while(i){
  r=r+(ana(6)*3300* 5/1023);
  i=i-1;
 }

 return r/50;
}

function getI(){
 var r=0;
 var i=50;

 while(i){
  r=r+(ana(2)*3300*10/1023);
  i=i-1;
 }

 return r/50;
}

function onChrg(){
 var Vs=getVs(); log("Vs:",Vs," ");
 var Vb=getVb(); log("Vb:",Vb," ");
 var I =getI();  log( "I:", I," ");

 if( (Vb<Vmax)*(I<Imax) ){
  d=d+100; if(20000<d)d=20000;
 }else{
  d=d-100; if(d<0)d=0;
 }
 log("d:",d,"\n");

 pwm(4,d);led(1);
}

function onCheck(){
 pwm(4,0);out(0);led(0);
 sleep(1000);

 var Vb=getVb(); log("Vb:",Vb,"\n");

 return ( Vreg<Vb );
}



// main
while( !inkey() * !btn() ){
 onChrg();

 if(Tchk < tick()-t){
  if( onCheck() ) break;
  t=tick();
 }
}

pwm(4,0);out(0);led(0);

今回はJavaScriptでプログラミングできる IchigoLatte JS、チャージコントローラーのソースはひとまずこんな感じ、Vmaxを超えないように、Imaxを超えないようにPWM制御し、ソーラーを切ってみてVregに達していたら充電終了。もちろんBASICでもできるはず。

ハード的には12Vもいけるはずなので、ソースコードの設定値をいぢれば車なんかの12V鉛バッテリーにも対応のはず。

さっそく実験、晴れ時々曇り!

大丈夫、火は吹いていない模様。

こちらは電流計、3AほどでしっかりPWM制御されてます。突入電流のようなものが確認できますね、これは要対策です。

チョッパーされているとはいえ、このバッテリーに3Aはちょっと大きすぎかも、コイルとか挟んでみようかな?

バッテリーを並列にする手もありかも!?

真夏の炎天下、イベントで大活躍の「こどもじどうしゃ Radish」、これからはソーラーパワーでいつまでも走り続けられるかも!

もしやられる方は電気の扱いに十分にお気をつけください!!!

なにかの間違いにより火災などに至る可能性があります。










.

プログラミングできる「ししまい」登場!センサーも操って君だけの「舞」を披露しよう!

プログラミングできる「ししまい」登場!センサーも操って君だけの「舞」を披露しよう!

PCNから先日発売された「ししまいロボット」を組んでみよう。

難しいパーツは完成状態。

アイロンビーズで ししまい に必要なパーツを作っていきます。

並べたらクッキングペーパーを敷いてアイロン。

うまくできたかな?

アイロンの後に反ってくる場合は、冷めるまで重石をしよう。

全部のパーツをアイロンしよう!

パーツができたら、いよいよ組み上げ。

だんだん ししまい になっていくよ。

鼻に障害物センサーを入れて完成!さぁて、動くかな?

まずはセンサーを試してみよう。IN4,VCC,GND に 緑紫青 の線をさして、

お試しプログラム

1 ?IN(4):GOTO1

を実行。

鼻の前に障害物がない状態だと「1」。

障害物を検知すると「0」ですね、動作がおかしい人は接続を確認しよう。

次はサーボのチェック。接続はこんな感じ。電源に充電池4本、それをサーボの茶色と赤に接続。残りのオレンジの線はOUT5に。

ではチェック、

PWM5,85

で口が閉じるかな?

次は、

PWM5,135

で口が開くね!

では何かが近づいたら しし舞う 動きをプログラム。

10 IF IN(4) GOTO10
20 PWM5,135:WAIT10
30 PWM5,85:WAIT10
40 PWM5,135:WAIT10
50 PWM5,85:WAIT10
60 PWM5,135:WAIT10
70 PWM5,85:WAIT10
80 GOTO10

こんな感じでどうかな?

いい感じだね!

プログラムを改造して自分だけの「ししまい」に仕上げよう!


今年も開催「PCNこどもプロコン2021」!

応募締め切りは 2021/01/07、君だけの楽しい作品、待ってます!(協賛者様もお待ちしていますっ)










.

三角関数は太陽検知にも使える!sin,cosで作ろう「おひさまデテクタ」!

三角関数は太陽検知にも使える!sin,cosで作ろう「おひさまデテクタ」!

先日作った「おひさまデテクタ」、もっとカッコよく検知したいと思い、今回はプログラムを全面改良。

どうでしょう?速度もいいし、動きもカッコよくなりました。

無理やり向きを変えても、すぐにおひさまをデテクトしてくれます。

タイムラプスで太陽を追いかけてみました。いいところでカメラのバッテリー切れ。。。でも、なかなかいい感じ。

そしてもちろん「ひまわり」もできちゃいます。

var HC=1500, VC=1500;
var HA=2200, VA=2200;
var HI= 900, VI= 800;

var hc=HC, vc=VC;
var r=HA-HC;

while(1){
 led(1);

 while(32<r){
  r=r*3/5;
  var b=0, hcn=hc, vcn=vc;
  var d=0;
  while(d<360){
   var h=((sin8(d+90)*r)>>8)+hc;
   var v=((sin8(d   )*r)>>8)+vc;
   pwm(4,h);pwm(3,v);
   sleep(8);
   var a=ana(2);
   if(b<a){
    b=a; hcn=h; vcn=v;
   }
   d=d+6;
  }

  hc=hcn;
  if(hc<HI) hc=HI;
  if(HA<hc) hc=HA;
  vc=vcn;
  if(vc<VI) vc=VI;
  if(VA<vc) vc=VA;
 }

 pwm(4,hc);pwm(3,vc);
 sleep(33);
 led(0);

 var th=ana(2)*95/100;
 while(th<ana(2));

 r=r<<3;
}

今回改良したプログラムはこんな感じ。三角関数sin,cosはおひさま検知にも有用!

サーボとセンサーの練習に「ししまいロボット」、発売開始!










.

おひさまを捕捉せよ!IchigoJamによるエネルギー源探知システム!

おひさまを捕捉せよ!IchigoJamによるエネルギー源探知システム!

連日の猛暑、もうバテバテ。

これだけのエネルギー源「おひさま」を捉えるため、作ったのは「おひさまデテクタ」。サーボを2つひっ付けて水平方向と垂直方向に動作可能。3vで動作するFT30B、コンパクトに仕上がって便利っ。

そして筒の中には明るさセンサーCdS

var step=8;

while(1){
 led(1);

 pwm(3,1900);
 pwm(4,2200);
 sleep(1000);

 // vertical
 var max_b=0;

 var i=2200;
 var max_dv=i;
 while(800<=i){
  pwm(4,i); sleep(33);
  var b=ana(2);
  if(max_b<b){
   max_b=b;
   max_dv=i;
  }
  i=i-step;
 }

 pwm(4,max_dv); sleep(500);

 // horizontal
 max_b=0;

 i=2200;
 var max_dh=i;
 while(800<=i){
  pwm(3,i); sleep(33);
  var b=ana(2);
  if(max_b<b){
   max_b=b;
   max_dh=i;
  }
  i=i-step;
 }

 pwm(3,max_dh); sleep(500);

 led(0);

 // wait btn
 while(!btn());
 sleep(333);
}

ひとまず作ったプログラムはこんな感じのIchigoLatte JS。CdSでグルっと辺りを見回して、最終的に一番明るいところに向く、というもの。BASICでも同じことできるはず。

熱源捕捉、成功!

もっと かっこよく デテクトしたいところ。










.

好きな言語で作れる、たった182byteのLatteアプリ!IchigoLatte JS 1.2.0 正式版リリース!

好きな言語で作れる、たった182byteのLatteアプリ!IchigoLatte JS 1.2.0 正式版リリース!

IchigoLatte 1.2.0 リリースIchigoDake版はこちら)、今回の改良点はこちら。

* [cat] argument "-c"(count) is available.
* [lash] '.' and '_' added.
* [] API table added on 0xC0.(see api.h)

先日実装した「実行バイナリ直接実行機能」が追加されています。

IchigoLatte JS は「JavaScript でプログラミングできる小さなパソコン」ですが、もしラップトップなどのPCやmacがあるならば、お好きな言語、お好きなエディタで Latteアプリ を作れるようになりました。(arm thumbを吐ける環境必要)

#include "latte.h"

void _start(){
  while(1){
    latte.io_led(1); latte.sleep(333, 0);
    latte.io_led(0); latte.sleep(333, 0);
  }
}

例えばC言語でLチカするならこんな感じ。「latte」オブジェクトが IchigoLatte OSのAPIを提供しています。あとは make して転送、超簡単!(要:arm-gcc

typedef struct{
    // ichigolatte
    volatile int32_t* g_env;
    volatile uint64_t* g_msec;
    size_t  (*mem_check)();
    void*   (*mem_alloc)(size_t size);
    void    (*mem_free)(void* mem);
    int  (*timer_set)(size_t usec, void (*func)());
    uint32_t (*rand_get)();
    int32_t (*sin8)(int32_t d);
    int32_t (*div)(int32_t n, int32_t d);
    int32_t (*mod)(int32_t n, int32_t d);
    ssize_t (*read)(int fd, void *buf, size_t count);
    ssize_t (*write)(int fd, const void *buf, size_t count);
    int         (*flash_erase)(uint8_t num);
    int         (*flash_save)(uint8_t num, const void* buf, size_t size);
    const char* (*flash_load)(uint8_t num);
    void    (*uart_bps)(uint32_t bps);
    void    (*uart_send)(const uint8_t* buf, size_t len);
    int32_t (*uart_read)();
    int (*i2c)(uint8_t wbf[], size_t nwb, uint8_t rbf[], size_t nrb);
    int     (*io_led)(int nf);
    int     (*io_btn)();
    int     (*io_in)(int n);
    int     (*io_ana)(int n);
    void    (*io_out)(int n);
    void    (*io_pwm)(int n, uint32_t d);
    void    (*io_pwmt)(uint32_t t);
    void    (*io_beep)(uint32_t hz, uint32_t msec);
    void  (*sleep)(int msec, int deep);
    char* (*line)(const char* last, size_t len);
    void  (*reset)();
    void (*ntsc_onoff)(int n);

    // screen
    const uint8_t (*g_aFont)[8];
    unsigned char* g_aScreen;
    uint8_t* g_nCursorX;
    uint8_t* g_nCursorY;
    unsigned char* (*screen_buf)(uint8_t x, uint8_t y);
    void (*screen_regulize)();
    void (*screen_clear)();
    void (*screen_scroll_l)();
    void (*screen_scroll_r)();
    void (*screen_scroll_u)();
    void (*screen_scroll_d)();
    void (*screen_putc)(unsigned char c);
    void (*screen_puts)(const char* s);
    
    // keyboard
    int (*keyboard_enqKeyBuf)(uint8_t k);
    uint8_t (*keyboard_deqKeyBuf)();

    // library - stdio.c
    int (*atoi)(const char* s);
    signed int (*printf)(const char *pFormat, ...);
    int (*snprintf)(char *pString, size_t length, const char *pFormat, ...);

    // library - string.c
    void* (*memcpy)(void* dst, const void* src, size_t n);
    void* (*memset)(void* b, int c, size_t len);
    char* (*strncpy)(char* dst, const char* src, size_t len);
    int (*strncmp)(const char* s1, const char* s2, size_t n);
    size_t (*strlen)(const char* s);
} API;

Latte内部の機能たち、割り算も含めてひとまず使いそうなものをAPIとして公開してみました。「あれはないの?」とかありましたらご連絡ください。

#include "latte.h"

#define ON_THE_GROUND   99
#define KEY_SPACE       32
#define CENTER          15
#define GROUND          22



void _start(){
    // Initialize
    const int32_t sacchanX = CENTER;
          int32_t sacchanY = GROUND-6;
          int32_t sacchanV = 0;                 // Current Speed
          int32_t sacchanJ = -3;                // Jump Power
          int32_t nawaX = CENTER;
    const int32_t nawaY = GROUND;
          int32_t nawaV = 5;                    // Current Speed
          int32_t gravity = 1;
          int32_t slowness = 66;
          int32_t landingCount = 0;

    // Game loop
    while(!(  (sacchanX==nawaX) && (sacchanY==nawaY)  )){
        // Check Jumping key
        if(latte.keyboard_deqKeyBuf() == KEY_SPACE){
            sacchanV = sacchanJ;
        }

        // Move the Sacchan
        if(sacchanV != ON_THE_GROUND){
            sacchanY += sacchanV;
            if(GROUND < sacchanY){
                // Landed
                sacchanV = ON_THE_GROUND;
                sacchanY = GROUND;
                landingCount += 1;
            }else{
                sacchanV += gravity;
            }
        }

        // Move the Nawa
        nawaX += nawaV;
        nawaV += (nawaX<CENTER) - (CENTER<nawaX);

        // Draw
        latte.screen_clear();
        latte.printf("SCORE:%d\n", landingCount);
        *latte.screen_buf(sacchanX, sacchanY) = '@';
        *latte.screen_buf(nawaX, nawaY) = '-';

        // Show slowly to player
        latte.sleep(slowness, 0);
    }
}

名作「縄跳び さっちゃん」のC言語バージョンはこちら、たった182byte!

みなさんもお好きな言語でIchigoLatteアプリ、作ってみてね!











.

安心安全「Zen言語」で作る IchigoLatteアプリ!2Dぐるぐる🌀できる バージョン 1.2.0β リリース!

安心安全「Zen言語」で作る IchigoLatteアプリ!2Dぐるぐる🌀できる バージョン 1.2.0β リリース!

JavaScriptプログラミングを学習できる中高生向けIchigoJamIchigoLatte JS」、Zen言語で作ったプログラムも動くようにバージョンアップ中。

usingnamespace @import("latte.zen");

export fn _start() void {
  while(true){
    _ = latte.io_led(1);
    latte.sleep(500, 0);
    _ = latte.io_led(0);
    latte.sleep(500, 0);
  }
}

こちらはZen言語版 Lチカ 、”latte.zen” を @import してAPI “latte” を呼ぶだけ。これを make してできる実行バイナリは 40byte !

実行バイナリを IchigoLatte に転送するには、

lash> cat -c 40 uart > .

lashでこれを叩いて40byteのバイナリ待ち状態にして、uart接続されたPCからTX。

CoolTermならバイナリファイルをDrag&Dropするだけ。

lash> .

バイナリの実行は “.” エンター。

Zen言語でLチカ成功!

せっかくのZen言語、もっと楽しいものを作りましょう。

usingnamespace @import("latte.zen");

export fn _start() void {
  var cX:i8 = 16;
  var cY:i8 = 12;

  var d1:i32 = 90;
  var d2:i32 = 210;
  var d3:i32 = 330;
  var r:i32 = 8;
  var d:i32 = 0;
  var s:i32 = 1;

  while(true){
    latte.screen_clear();
    line(
      @intCast(i8, (r*latte.sin8(d+d1+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d1))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d2+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d2))>>8) + cY
    );
    line(
      @intCast(i8, (r*latte.sin8(d+d2+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d2))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d3+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d3))>>8) + cY
    );
    line(
      @intCast(i8, (r*latte.sin8(d+d3+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d3))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d1+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d1))>>8) + cY
    );

    latte.sleep(3, 0);

    var k:u8 = latte.keyboard_deqKeyBuf();
    if(k == 32){
      break;
    }else
    if(k == 30){
      s += 1;
    }else
    if(k == 31){
      s -= 1;
    }else
    {}

    d += s;
  }
}

fn _abs(x:i32) u32{
  return @intCast(u8, (if(0<x) x else -x));
}

fn _div(n:i32, d:i32) i32{
  return if(d != 0) latte.div(n, d) else n;
}

fn _dot(x:i32, y:i32) void{
  if( (0<=x and x<32) and (0<=y and y<24) ){
    latte.screen_buf(@intCast(u8,x), @intCast(u8,y)).* = '*';
  }
}

fn line(x1:i8, y1:i8, x2:i8, y2:i8) void{
  var dx:i32 = (x2 - x1);
  var dy:i32 = (y2 - y1);
  if(_abs(dx) < _abs(dy)){
    if(y1 < y2){
      var i:i32 = 0;
      while(y1+i <= y2){
        _dot(x1+_div(dx*i,dy), y1+i);
        i += 1;
      }
    }else{
      var i:i32 = 0;
      while(y2+i <= y1){
        _dot(x2+_div(dx*i,dy), y2+i);
        i += 1;
      }
    }
  }else{
    if(x1 < x2){
      var i:i32 = 0;
      while(x1+i <= x2){
        _dot(x1+i, y1+_div(dy*i,dx));
        i += 1;
      }
    }else{
      var i:i32 = 0;
      while(x2+i <= x1){
        _dot(x2+i, y2+_div(dy*i,dx));
        i += 1;
      }
    }
  }
}

これは3角形がぐるぐる回るプログラム、矢印キー上下で回転速度を変更可能。

このサンプルはgithubからどうぞ。実行バイナリを直接実行できる IchigoLatte JS 1.2.0 beta はこちら(Normal, forDake)からどうぞ。

型に厳密で安全志向プログラミング言語「Zen」、エッジ開発に最適かも!









.

[see also]