944BASIC


次はこれも比較的簡単なプログラム。棒グラフ表示 サンプルをいじります

実行してみる
棒グラフ表示実行中 あるデータに基づいて定義された値の横棒グラフを表示します。

リストをみてみる
PHOTOFRM.BAS GRAPH.BASをエディタで開きます。
これもすごくシンプルなリストですね。この程度なら一瞬で表示してくれます。BASICで体重管理のソフトとか作る 参考になるでしょうか?^^;
ここからは以前に説明したことのあるコマンドについてはそちらを参照してもらうことにして、新しく使うコマンド 類の説明を中心にしていこうと思います。


100 DIM A(31)=0,23,4,13,65,37,66,89,34,18,9,3,23,64,……

DIM命令が新しく出てきました。これは配列変数の定義命令です。Aという名の変数をに32個の部屋に区切ってやって それぞれに値を入れられる…。そんなところでしょうか。Aという名前で定義されたので、参照するときはA(n)というように 括弧の中の数字を指定してやります。リストでは31なので0〜31の32個指定できるわけですね。PRINT A(2)で 画面に4が表示されます。

CLS

CLearScreenの略です。文字どおり画面を掃除してくれます。具体的にはバックグラウンドカラーで塗りつぶすって とこです。次

LINE 39,0,39,319
LINE 0,9,239,9

これも文字どおりですね。線を引く命令です。パラメータの最初の2つが始点、後ろの2つが終点の座標です。つまり最初の LINEは(39,0)-(39,319)の線を引きます。画面の左から40ドット目、一番上から下まで縦に引いてある直線ですね。 ちなみに初期状態では240x320の画面領域が確保されるらしく、横画面機種では右側が空いていて下が切れてて見えません^^; この辺は最終調整段階まで御預けですかね。横機種使ってる人少ないのかなぁ…。2つ目のLINEは同様に上から10ドット 目に横線をビシッと引く命令ですね。

FONT 3*16+1

FONT命令は表示する文字の種類を指定する命令です。16xn+mで値を求められ、nでフォントの 大きさ、mで表示の仕方を指定してます。詳しい対応表はリファレンスを見てもらうとして、ここでは3*1ので48に対応 した4x10ドットフォントを選び、+1に対応した描画色のみで描画を行います。CLSで塗りつぶした 画面に初期値の黒で文字を書くという指定をしています。

LOCATE 0,0: PRINT '■グラフ '
LOCATE 10,0: PRINT '0 10 20 30 40 50 60 70 80 90 100'

で、実際に書いているのはここ。LOCATEで表示する位置(画面の左上から何文字目か)を指定して、PRINTで 表示する文字列を'(シングルクォーテーション)でくくって指定します。PRINTには変数も指定できますが、そこは 後まわしにしましょう。リストでは一番左上から…。と左から11文字目の一番上から…それぞれの文字列を書いています。

COLORFG 100,100,100

描画を行うときに使う色を指定するのがCOLORFGです。初期状態では黒でして、ここでは こんな色を指定しています。

I=39
200 IF I<=239 THEN LINE I,10,I,319: I=I+20: GOTO 200

でこの色を使って線を引かせているのが上のリスト。結論から言うと画面の上から11ドット目から一番下まで縦線を引いていき ます。左から40ドット目を初めに右に20ドットずつずらして引いていき、右端まできたら終わりという繰り返しの作業をここでは 行わせてるわけです。
IF〜THENは条件式。もし(IF)の条件があっているならTHEN以降を実行するという命令です。ここ ではI<=239ですからIという変数の中身が239以下なら…という条件があってるときにTHEN以降の命令が 実行されます。LINEIの値に従って引き、Iに20を加算します。そしてまたIFの条件を試しに戻る という感じですね。GOTOの飛び先が数字になっていますが、これは行番号を表わします。ま、ラベルと同じと考えてOKです (笑)
あと、各所にある:(コロン)ですが、これはマルチステートメントといって、一行に複数の命令を書き込むものです。とり あえずここでは説明は省きます^^;

BOXFILL 40,I*10+1,40+A(I)*2,I*10+8

そして棒の描画です。BOXFILLLINEと同様、長方形の対角線の始点と終点の座標を指定します。なんか いろいろ難しそうなことをやっていますがなれれば大丈夫。試しにIに数値をいくつか代入して調べてみましょう。
I=1のとき
BOXFILL 40,1*10+1,40+A(1)*2,1*10+8
BOXFILL 40,11,40+23*2,18
BOXFILL 40,11,86,18
こうなります。簡単ですね?同様にI=2…
BOXFILL 40,2*10+1,40+A(2)*2,2*10+8
BOXFILL 40,21,40+4*2,28
BOXFILL 40,21,48,28
I=3で…
BOXFILL 40,3*10+1,40+A(3)*2,3*10+8
BOXFILL 40,31,40+13*2,38
BOXFILL 40,31,66,38
以下、これの繰り返しです。Iの数値が増すにつれ、棒を描く位置が下にずれていき、最初にDIMで指定した値に 従った棒の長さを描いています。こういった同じような処理で、値が少しづつ違うというのを繰り返すってのはコンピュータの 得意技ですね。大いに利用してあげましょう。

140 KEYWAIT
END

で、棒を描き終わったら140に飛んでくるのは解りますよね?KEYWAITはそこで何かキー入力があるまで以降の処理をしない という命令です。つまりグラフを表示し終わったらジーっと待ってるわけですね。健気です(笑)でキー入力があったらEND でプログラム終了をします。以降にどんな命令を置いても実行されません。

いぢってみる
ふぅ、コレだけのリストでも結構説明することが多いですね^^; 後のことは怖いので考えないことにします(笑)
で、今回は逃げ腰って事で…。
と、この辺にとどめておきます^^;

・ちょっとカラフルに
簡単なところから攻めます(笑)
まずは棒を書くところの手前を以下のようにリストを修正してみてください。

COLORFG 100,100,255
I=1
120 IF I>31 THEN GOTO 140
 LOCATE 3,I: PRINT I
 BOXFILL 40,I*10+1,40+A(I)*2,I*10+8
 I=I+1
GOTO 120
      ↓
I=1
120 IF I>31 THEN GOTO 140
 COLORFG 100,100,50+A(I)*2
 LOCATE 3,I: PRINT I
 BOXFILL 40,I*10+1,40+A(I)*2,I*10+8
 I=I+1
GOTO 120

COLORFG命令が繰り返し文(120 IFGOTO 120)の中に入ってきました。しかも第3パラメータが 50+A(I)*2という式になっています。これは色指定(COLORFG)の青成分(第3パラメータ)に変化をつけて、 A(I)の値が高いほど青みが強くなっていくように変更した式です。リファレンスを見れば解ると思いますが、 COLORFGの第1パラメータが赤成分、第2パラメータが緑成分、第3パラメータが青成分と光の三原色を表わしているので、 第1パラメータを50+A(I)*2という式にすれば赤が増していくグラフになります。この辺はいろいろいぢってみてください。 気をつけなくてはいけないはCOLORFGに与えられる値は各成分、0〜255なのでその範囲で変化する式を考えなければ なりません。ちなみに50+A(I)*2という式はA(I)が0〜100の値を取る場合50〜250の間を取ります。

さて、ちょっと戻ってグラフのバックの線にも色をつけてみましょう。修正個所はここです

COLORFG 100,100,100
I=39
200 IF I<=239 THEN LINE I,10,I,319: I=I+20: GOTO 200
        ↓
I=39
200 IF I<=239 THEN COLORFG I,20,255-I:LINE I,10,I,319: I=I+20: GOTO 200

これもCOLORFGを中に入れてしまいました。Iが変化する中でのこの変更です。原理は棒グラフ自体の色変化 と同じなので、実行結果とリストを見比べながら自分で色々いぢってみてください。さっきのが理解できればこれはかなり 簡単だと思います。

・棒グラフの値を実行するたびに変わるように
リストの最初でA(n)に値を定義しているわけですが、ここをいぢって実行するごとに結果が変わるようなグラフにしてみます。
とりあえず以下のように修正してください。

100 DIM A(31)=0,23,4,13,65,37,66,89,34,18, …
  ↓
DIM A(31)
FOR I=0 TO 31
 A(I)=RND%101
NEXT

結構変わっちゃいましたね。最初のDIM A(31)では配列の定義だけ行って値は代入していません。そのあとの FOR〜TO〜NEXT文で値を代入しています。これはIを0から31まで変化させ、FORNEXTにはさまれた 命令を実行せよ。という命令文です。つまり中のA(I)=RND%101が32回繰り返されるわけです。その間Iは0〜31 の値を取るので、結果、変更前と同じようにA(0)〜A(31)まで値が入るのです。
そこに代入される値ですが、これはRND命令を使っています。RND命令は乱数を発生させる命令文で0〜65535まで 値をランダムに発生させます。それを101で割った余りを求めて0〜100の乱数値をA(I)に代入しています。
これで実行するたびに違う値がA(I)に入ることになり違った結果のグラフが表示されることになります。
乱数はゲームなどには必須になるので覚えておきましょう。

・ついで
下のほうがはみでちゃってるので、そこの部分を描かないようにしてみましょう。棒グラフ描画ループの以下の部分を修正 してください。

120 IF I>31 THEN GOTO 140
      ↓
120 IF I>22 THEN GOTO 140

グラフのはみ出る部分は書かないようにしてみました。バックのラインは修正してないので実際は描画されているのですが、ここは 修正しても効果が殆ど無いのでほおっておきます(笑)とりあえず、綺麗に収まってるように見えますよね?^^;

棒グラフ表示(改造版)実行中 ・・・意外といぢれないもんですね(笑)まぁ、それも人生かと。ハァ。棒グラフの棒をグラデーションさせるとか縦の棒グラフにする とか折れ線グラフもつけてみるとか色々出来そうですが、今回はそんなパワーないですし^^;ってことで各々頑張るように(笑)


戻る