プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

入門その2 星空を描いてみよう

その1ではちょっと思い入れが強く出ましたが、その2からは多少普通のテンションになります...。(方針はあまり変わりません。)

このカテゴリの記事では、プチコンで動くBASICでグラフィックを描いたりしながら、プログラミングそのものに興味をいだいてもらうことを主眼に書いています。文法その他は二の次です。 当ブログは、皆さんのプログラミングライフを応援しています。

前回の続きから...

上下にも、左右にもモアレ模様を描き、かつちょっとカラフルにしたプログラムは次のようになります。

CLS
GPAGE 0:GCLS
FOR I=0 TO 255 STEP 2
GLINE I,0,255-I,191,I%14+1
NEXT I
FOR I=0 TO 191 STEP 2
GLINE 0,I,255,191-I,I%14+1
NEXT I

GLINE命令について説明書をみると、

GLINE 始点x座標,始点y座標,終点x座標,終点y座標[,色]

と書かれています。
x座標・y座標って何かわかりますか?
DSiの画面は小さな点でできています。横方向には256個、縦方向には192個の点があります。
このそれぞれの点の位置を表すのに、x座標・y座標を使っています。
ちょうど数学で、グラフを描く平面でxとyを使いますが、それと同じような考え方です。
中学・高校で習うxy平面では、xは右向きに大きくなっていき、yは上向きに大きくなっていきます。
下の図では、左下が(x,y)=(0,0)の点です。

一方、プチコンの画面では、xは右向きに大きくなっていくのは同じですが、yは下向きに大きくなっていきます。
下の図では、左上が(x,y)=(0,0)の点です。

座標は(0,0)からはじまるので、右下は(256,192)ではなく、(255,191)になります。
なお、これはグラフィックの場合のxy座標でしたが、テキストの場合は(0,0)から(31,23)となります。
(つまり横32文字、縦24行ということです。)

星空を描いてみる

画面に星空を描いてみましょう。
DSiの画面が点で構成されているのは上で述べたとおりですが、点を適当な感じに打つと星空のように見えます。

点を打つといっても、規則的な点だと星空に見えません。
こんな風に。

ではどうしましょうか。
BASICにはこんな時に便利なものがあります。
それは乱数というものです。
簡単にいうと「適当」な数字をプチコンの中で生み出してくれるもので、プチコンの中にサイコロが内蔵されているようなものです。
次のプログラムを入力してみましょう。

CLS
GPAGE 0:GCLS
FOR I=0 TO 200
X=RND(256)
Y=RND(192)
GPSET X,Y,15
NEXT I

(※6月24日訂正:2行目「PAGE 0」となっていましたのを「GPAGE 0」に訂正します。)

4,5行目で、Xには0〜255の乱数、Yには0〜191の乱数を割り当てています。
6行目のGPSETでX,Yで示される座標に、色が白(番号15)の点を打っています。
なお、FOR文では「I=0」とか、アルファベットの I をよく使います。
これも数学で数列を書く時に使う、 ki のiに由来があります。もちろん、I以外も使うことができますが、なぜ I ばかりよく出てくるのか、という疑問に答える余談でした。

さて実行すると、次のような画面になるでしょう。

お、ちょっと星空っぽくなったかも? やはりここでは「適当」さが重要みたいです。
でも都会の星空のようで少しさびしいかも。
では星の数を増やしてみましょう。
3行目のTOの後の200を2000にします。
変更後のプログラム3行目は次のようになります。

FOR I=0 TO 2000

では実行します。

今度は山の上に登って見た星空のようになりました。
今回はやりませんが、点に明暗差をつけるとより本物っぽくなるでしょう。
もっと増やすとどうなるでしょう。20000にして実行してみます。

FOR I=0 TO 20000

画面を埋め尽くしそうです。
ところで、プログラムが終了して、命令を打とうとしても見づらいので、画面の消し方を覚えておきます。
Rボタン+矢印キー左+STARTボタン です。これらのボタンを離さずに全部押します。
さて今度は星を200000にして実行してみます。

FOR I=0 TO 200000

終了するまで結構な時間がかかりますが、意外なことに画面は真っ白になりません。
(下画面の「編集」が点灯したら、R+左+STARTで画面クリアしましょう。)
実はプチコンの画面の点の数は256×192=49152個なので、乱数が均等ならば一つの点について平均して4回くらいは塗りつぶされていそうですが、そうなっていません。
では2000000にして実行してみます。(2の後に0が6つです。)

FOR I=0 TO 2000000


今度は、白い点が表示される代わりに、何かメッセージがでました。
これは扱える数値の上限を超えている、というエラーメッセージです。プチコンは何かできないことが出てくるとこんな風にメッセージを出してきます。

実は、プチコンではおよそ±524288までの数字しか扱うことができません。
なんでそんな中途半端な数字なのか、とか、なんでおよそと言っているのか、は簡単な説明は難しいので説明は省かせてください。すみません。
とにかく、扱える数字に限りがあることはわかりました。
いまどきの電卓で6桁しか数字が扱えないものはないですし、プチコンで家計簿を作ろうとしても年間で50万円以下の出費とは考えづらいので一般的な家計簿は作れなさそうです。

扱える数字がおよそ50万なのはわかりましたが、それ以上の回数、点を打つことはできないのでしょうか?

XとYを決めるのにそれぞれ乱数を使っていますが、それだと星ひとつにつき2つ乱数を使うことになるので、それでは乱数が均等に出たことにならないのでは?と思う人もいるかもしれません。

これらの問題を解決するために、またしてもいろいろといじくってみてください。

ではまた次回まで〜。