2009年03月01日

ドリトルについて(その7)「衝突」

ドリトルについて(その6)「続・かめた!千鳥足」」の続きです。
ドリトルの記事全体はカテゴリ「ドリトル」をご覧下さい。

うちの娘が画面を見ていて、「パパ。このかめさんたち、上に乗っかっちゃうんだね」と言いました。

そうです。作った「かめた」「かめこ」「かめお」達は相手がどういう状態か関係なしに勝手気ままに進むので、平気で乗っかっていきます。

オブジェクト同士がぶつかったかどうかで処理を変えるにはどうすればいいでしょうか。それは「衝突」という命令を使います。

タートルオブジェクトの命令の一つですが、「衝突」は少し変わっています。以前、プロパティの一つのように書いてしまいましたが、本当はメソッドです(おそらく「衝突する」という主体的に行う動作ではない(無理に表現するなら「衝突される」)ので、メソッドであっても「衝突」という表現になったのでしょう)。この動作は難しい言葉で「イベント」と呼ばれるものの一種です。event を英和辞書で引くと、「出来事」とあります。なんらかの出来事が発生することをイベントといいます。ボタンオブジェクトで「ボタンが押された」というのも一つのイベントです。

「衝突」は他のオブジェクトと重なったとき(オブジェクトの画像の一部分でも)に実行されます。しかし、最初は何を実行するのか定義されていません。したがって、たとえ衝突しても何も起こりません。新しい命令を定義する書式と同じやりかたで、

オブジェクト:衝突=「 」。


というようにどんな動作を実行するのか定義する必要があります。

ここではぶつかったら右に90度曲がるようにしてみましょう。かめたに「千鳥足」を定義した直後に、かめたの「衝突」を定義してあげれば、全員にコピーされますね。

かめた=タートル!作る。

かめた:千鳥足=「
自分!(乱数(360)) 左回り。
時計=タイマー!作る。
時計!「自分!(乱数(60)−30) 左回り 5 歩く」 実行。
」。

かめた:衝突=「自分!90 右回り」。

かめこ=かめた!作る。
かめこ!"ayumiRed.png" 変身する (赤) 線の色。

かめお=かめた!作る。
かめお!"ayumiYellow.png" 変身する (黄) 線の色。

かめた!千鳥足。
かめこ!千鳥足。
かめお!千鳥足。



さて実行してみましょう。
ドリトル千鳥足3匹じたばた

ん? みんな中央でじたばたしていますね。ちっとも進めないようです。
続きを読む
posted by n_shimizu at 00:46| Comment(0) | TrackBack(1) | ドリトル

2009年02月25日

ドリトルについて(その6)おまけ2

ドリトルについて(その6)「続・かめた!千鳥足」」の続きです。
ドリトルの記事全体はカテゴリ「ドリトル」をご覧下さい。

今回もその6のおまけです。

それぞれの軌跡が重なったとき、必ず

一番下が黒
二番目が赤
三番目が黄色

のように表示されているのに気がついたでしょうか。
ドリトル重なる順番

これはオブジェクトを作った順番なのです。すなわち

さいしょにかめた(線の色:黒)
つづいてかめこ(線の色:赤)
さいごにかめお(線の色:黄色)

の順に作ったからなのです。タートルオブジェクトが描いた線もオブジェクトの一部になっていることにも関係します。

すなわち黒い線はかめたの一部、赤い線ははかめこの一部、というように。

これを切り離すにはタートルオブジェクトの命令で「図形を作る」というものを実行するのですが、それはまた今度説明します。

次々と上に重ねていくようになっている、ということでした。
posted by n_shimizu at 23:42| Comment(0) | TrackBack(0) | ドリトル

2009年02月24日

ドリトルについて(その6)おまけ1

ドリトルについて(その6)「続・かめた!千鳥足」」の続きです。
ドリトルの記事全体はカテゴリ「ドリトル」をご覧下さい。

その6のおまけです。

前回、

かめた!千鳥足。
かめこ!千鳥足。
かめお!千鳥足。


としたときに、なぜ3匹同時に進んだのか疑問に感じませんでしたか?

今まで、

命令。
命令。
命令。


と並べたときに上から順番に実行されてきました。そしてそれは、上の行が「終わってから」下の行の実行が始まっていました。

しかし今回は、上の行の実行の終わり(かめたの歩き終わり)を待たずに下の行の実行(かめこやかめおの歩き始め)がされています。

これはタイマーオブジェクトの性質で、タイマーオブジェクトは必ず実行に時間がかかるので、タイマーオブジェクトにより何かを実行している時は終了を待たずにすぐさま次の命令が実行されます。このように複数の処理が同時に行われることを難しい言葉でスレッドといいます。

ただ、かめたが歩き終わってからかめこが出発。かめこが歩き終わってからかめおが出発のようにしたいときもあります。

その場合は、タイマーオブジェクトの命令で「待つ」を実行することにより、次には進まなくなります。

千鳥足の定義の部分で

かめた:千鳥足=「
自分!(乱数(360)) 左回り。
時計=タイマー!作る。
時計!「自分!(乱数(60)−30) 左回り 5 歩く」 実行。
時計!待つ
」。


のように変更すれば、それぞれ歩き終わるまで待ってくれます。
posted by n_shimizu at 23:44| Comment(0) | TrackBack(0) | ドリトル

2009年02月19日

ドリトルについて(その6)「続・かめた!千鳥足」

ドリトルについて(その5)「かめた!千鳥足」の続きです。
ドリトルの記事全体はカテゴリ「ドリトル」をご覧下さい。

さて前回のタイトルに冗談のように「かめた!千鳥足」と書きましたが、このように新しい命令を作って実行させることはできないのでしょうか。

実はできます。

オブジェクト:新命令の名前=「 」。


という記述で、このオブジェクトに新しい命令を追加することができます。さっそくかめたに「千鳥足」を追加してみましょう。前回の内容をすべて「 」に入れればいいのですね。

例1)
かめた=タートル!作る。

かめた:千鳥足=「
かめた!(乱数(360))左回り。
時計=タイマー!作る。
時計!「かめた!(乱数(60)−30)左回り 5 歩く」 実行。
」。


これを実行すると、真ん中にかめたが登場して終わります。どうしてでしょう?
ドリトル新規命令で動かない

続きを読む
posted by n_shimizu at 22:54| Comment(0) | TrackBack(3) | ドリトル

2009年02月15日

ドリトルについて(その5)「かめた!千鳥足」

ドリトルについて(その1)
ドリトルについて(その2)
ドリトルについて(その3)
ドリトルについて(その4)
の続きです。

そろそろかめた自身に勝手に歩かせてみたいと思います。

ドリトルには「乱数」という命令があります。

乱数(正の整数)


とすることで、1〜正の整数の間のランダムな数字を発生します。そこでこれを使ってかめたを勝手に歩かせてみます。

例1)
かめた=タートル!作る。
かめた!(乱数(360)) 左回り 100 歩く。


乱数(360)で、360度のどこに回転するかをランダムに決定しその角度を左回り。100ドット歩きます。乱数( )の外側の( )は必要です。これがないとかめたというタートルオブジェクトに対する命令として処理しようとして「乱数という命令が見つかりません」というエラーになります。あくまで左回りに対するパラメータの数値ですから( )をつけることで数値にする訳です。

実行結果は以下の通り。
ドリトルランダムロケット1

実行する度にどこに飛んでいくかわからない。ランダムロケットです。
続きを読む
posted by n_shimizu at 14:57| Comment(0) | TrackBack(1) | ドリトル

「オブジェクト」ってなーに?

ドリトルについて」シリーズ番外編です。

このブログにも何度かオブジェクト指向が分からんとか、少し分かったとか書いてきました(オブジェクト指向が何となく解ってきたオブジェクト指向−クラスとオブジェクトの例え話。)

じゃあ「オブジェクト」とは何なのさ、という話になります。また「指向」ってどういうこと?となります。

よくある話が、オブジェクトのことを「もの」などと訳して「ものを中心に考えるのだ」などという説明がありますが、それだと全く分かりません。そうではなく、英語文法に出てくる「S-V-O」の「O」がオブジェクトなんですね。目的語とか対象ということです。

それまでのプログラミング(たとえば BASIC とか)では、「PRINT」や「GOTO」などが中心でした。つまり「V(=動詞)」中心のプログラミングです。

ちなみに「S」の主語は「コンピュータ」でいいでしょう。

(コンピュータに向かって)
ああしろ
こうしろ

というのがプログラミングでした。いえ、それはもちろんオブジェクト指向でも変わらないのですが、扱うデータは、「する(動詞)」の付属物だったんですね。コンピュータに何かを「させよう」というのですから、これは自然なことだったと思います。

しかしこれは扱うデータの種類が少なかった頃の話。扱うデータの量と種類が膨大に増えていったときにいろいろ問題が起きてきます。「する」を並べて作ったプログラム上で、「このデータはこの「する」に当てはまるのだろうか?当てはまらないのだろうか?」という判断が難しくなってくるのです。

一つの解決方法はカプセル化といって、一つの処理をまとめてブラックボックスにしてしまい、入れるデータはこういう形、出てくる結果はこういう形というものだけ見せるようにするプログラミングのスタイル。

その後、出てきたのは、さらにそれを発展させて、データ……というか、「変数」を中心に据えたプログラミングです。まず対象物ありき。この対象物には性質(プロパティ)や動作(メソッド)が決まっている。このいろいろな性質や動作をする変数を「オブジェクト」という抽象概念で括ったのです。その変数に対して命令をする(メッセージを送信する)。すると中身が変質することもあるししないこともあるけど、新しいオブジェクトを返す。またそれに対して……というプログラミングです。

これによって、今現在扱っているものは何か、そしてそれをどうしたいのか、という細かい処理を組み合わせていく考え方に変わりました。

これがオブジェクト指向の考え方だと思います。

2006年の終わり頃から悩み始めてようやくここまでたどり着きました。

ちなみに、ドリトルでプロパティとメソッドは見た目で分かります。

例えばタートルオブジェクトについては、

メソッド:作る、歩く、戻る、移動する、閉じる、変身する、拡大する
プロパティ:右回り、左回り、位置、向き、ペンなし、ペンあり、線の色、線の太さ、衝突


メソッド(動作)は「する」など(日本語文法でいう用言)
プロパティ(性質)は名詞など(日本語文法でいう体言)

という言葉になっているんですね。そんなことは考えなくてもいいぐらいごく自然な感覚に作られているわけです。
posted by n_shimizu at 00:54| Comment(2) | TrackBack(0) | ドリトル

2009年02月14日

ドリトルについて(その4)

ドリトルについて(その1)
ドリトルについて(その2)
ドリトルについて(その3)
の続きです。

ドリトルは、インタープリターですから、作っては試し、作っては試しとできるところが大きな特徴ですから、前回の回答編はそのようにしてみましょう。

まず、100ドットの正三角形の描き方について。

正三角形の一つの角は60度だから60としていすればいいんだ!
と思った方いると思います。次のように。

例1)
かめた=タートル!作る。
「かめた!100 歩く 60 右回り。」!3 繰り返す。


これを実行してみましょう。
ドリトル正三角形ならず

……三角形になりません。なぜでしょう?続きを読む
posted by n_shimizu at 00:10| Comment(0) | TrackBack(1) | ドリトル

2009年02月10日

ドリトル作者兼宗さんが……

ドリトルの作者の一人である兼宗さんがカメ太の日記の中で、このブログにリンクを張ってくれました(ゆっくり歩くの改良版)。

掲示板の書き込みの反応なんですけど、反応早い早い。

ゆっくり歩くの改良版の中身についてはいずれまた。
posted by n_shimizu at 20:07| Comment(0) | TrackBack(0) | ドリトル

ドリトルについて(その3)

ドリトルについて(その1)
ドリトルについて(その2)
の続きです。

タートルオブジェクトには、「右回り」、「左回り」という命令があります。進行方向を回転させる命令です。

90 右回り


と指定することで、進行方向を右回り90度回転させることができます。

さて、「歩く」と「右回り」を使って一辺が100ドットの正方形を描いてみてください。




…。

できましたか? いくつか例を挙げて説明したいと思います。

例1)
かめた=タートル!作る。
かめた!100 歩く。
かめた!90 右回り。
かめた!100 歩く。
かめた!90 右回り。
かめた!100 歩く。
かめた!90 右回り。
かめた!100 歩く。
かめた!90 右回り。


実行画面は以下の通りです。
ドリトル正方形

続きを読む
posted by n_shimizu at 18:03| Comment(0) | TrackBack(2) | ドリトル

ドリトルについて(その2)

前回(ドリトルについて(その1))の続きです。

タートルオブジェクトについてもう少し詳しく言うと、

タートルオブジェクトとは
*グラフィック関係のオブジェクトの一つ
*移動する時に軌跡の線を残し、絵を描くことができる
*描いた絵を切り離して図形にすることができる
*規定値として
 ○「作る」と原点(0,0)に現れる
 ○ペンあり。線の色は黒
 ○「歩く」方向はX軸正の方向
 ○亀の絵

などということが性質や規定値として決まっています。ほとんどが「そうだろう」と思うような自然な規定値になっています。単にイメージを掴むためだけの場合はそのようなことを意識する必要はないけど、ちゃんとプログラミングをしたい場合はそのように「決まっている」ということを知っておく必要があると思います。

特にタートルグラフィックスのオブジェクトだから名前が「タートル」で亀の絵になっているんですけど、ほとんどシャレに近い(だから「変身する」で花を表示させたときになぜ「タートル」から花になるのかといった疑問に繋がる生徒がいます)。

さて、「作る」はコピーで、名前を付けることができることは前回説明しました。次のようなプログラムを実行してみましょう。

かめた=タートル!作る。
かめた!100 歩く。
かめこ=タートル!作る。
かめこ!100 戻る。


実行結果は次の通りです。
かめたとかめこ
続きを読む
posted by n_shimizu at 02:01| Comment(0) | TrackBack(3) | ドリトル

2009年02月08日

ドリトルについて(その1)

ドリトルが情報科仲間で流行りました。自分でもやってみてこれは面白いと思い12月の授業で実践しました。なかなか好評だったようです。

このブログで書くとネタバレになってしまうことになるので今まで書きませんでした。全クラスで一通り1時間はやったので書くことにします。

ドリトルとは学習用プログラミング言語の一種です。

JAVA上で動くので、JAVA 環境さえあれば基本的にどんなマシンでも動きます。オンライン版もあるのでブラウザ上で動かすこともできます。

特徴としては、学習用とはいってもオブジェクト指向言語であること。基本はタートルグラフィックスなので、結果がすぐに見えること(もちろんグラフィックを使わないプログラムも作れます)。日本語(日本文字?)を使っているのでイメージを掴みやすいこと。でしょうか。

こんな感じです。
かめた=タートル!作る。
かめた!100 歩く。


実行結果は次のようになります。
ドリトル実行画面


続きを読む
posted by n_shimizu at 22:55| Comment(0) | TrackBack(4) | ドリトル