Scratch(その後)

散々仕事三昧の傍らで、息子が結構真面目に宿題をこなしている。理由は1つ。Scratchが触りたいのです。
そんな息子の心意気にほだされ、今日の夕方は息子にmacbookを明け渡し、一緒にScratchを触ってみました。
と言うわけで、今晩もアレな話題です。


Scratchは触れば触る程、懐の深いプログラム言語だということがわかります。開発チームはこの言語を「低い床、高い天井、広い壁」などと呼んでいるそうですが、Scratchはその表現に呼応するように、「敷居が低いのに、高度な機能を実装できるため、様々なプログラムが組める」素晴らしいテキストであると感じます。


例えば「敷居の低さ」で言えば、基本のインターフェースがスプライト(キャラクター)を動かすことを中心に考えられていること。なんでも出来る言語の場合、スプライトを動かすなんてのは一苦労しちゃうものですが、Scratchの場合は「◯◯歩進む」なんてボタンが用意されていて、子どもがとてもとっつきやすい。
この間も紹介したけれども、こんな風にブロックを積み上げるだけでネコちゃんが動いちゃうんだから、子どもは楽しいだろう。

またScratchには簡易的なペイントソフトも内蔵されていて、子どもが「オリジナルのキャラクターを動かしたい!」と思った時、それに答えてくれます。確かにカッコいいキャラクターを作るのには全然物足りないんだけど、子どもはただのマルやシカクだって、自分で描いたものが動けばやっぱり楽しいのです。


次に懐の深さ。これには横で見ていた僕もびっくりしたんだけど、Scratchはオブジェクト指向言語が備えているべき基本的な機能が一通り備わっています。
変数について言えば、グローバル変数とプライベート変数の使い分けに対応しています。忌み嫌われることの多いグローバル変数ですが、モジュール間を簡単に繋ぐ為には、やはりあった方が敷居がグンと低くなります。
また、個々のスプライトが言わば1つのモジュールとなっていて、その中に動作させたい内容単位でプロシジャーを積み上げていくことができます。例えば、シューティングゲームの自機を設定したスプライトには、方向キーを押した時のプロシジャーと敵機に当たったときのプロシジャーを独立させて登録できます。
そして圧巻なのは、スプライト間でメッセージのやり取りができること。例えば、自機のタマが敵機に当たった時、敵機には「タマに当たったよ」とメッセージを送り、そのメッセージを受け取った敵機は「爆発してスコアに加算する」、判定を行ったタマ自身は「自分が消える」という処理をする事ができます。正直言って、他のモジュールへ指示を出す機構は実装されていないと思っていたので、
結構たまげました。


・・・正直言ってプログラムがわからん人には全然ついてこれない話題で申し訳ないのですが、一見子ども騙しのようなインターフェースが、上記に示したような懐の深さを持っている事で、この言語を使い倒すと、かなり高度なゲームを作ることができます。
実際、Scratchプロジェクトの公開ページには、物好きが作成したスーパーマリオソニックが置いてありますし、僕の息子も日経ソフトウェアの紹介ページを参考にして、2時間程でブロック崩しゲームの根幹部を作り上げてしまいました。
そして、びっくりしてしまうのが、小学校6年生の息子が自分で作り上げたプログラムのエッセンスをほぼ理解している事。これは、息子の能力が高いということではなくて、Scratchのもつ教育的機能が優れているからに他なりません。根幹部が出来上がった後も、息子はちょこちょことブロックを組み替えたり付け加えたりしながら、「ボールがブロックに当たったら音が出る」とか「ボールがパドルに当たった時の反射角を変える」とかを実装して遊んでいました。


もしあなたが今からプログラムを勉強したいのであれば、下手なテキストを読みながらVB.NETを触ったりしていないで、Scratchをインストールして、子どもと一緒に遊んで見ることを強くお勧めします。その方が余程楽しいし、隣で一緒に遊んでいる子どもは、すぐにあなたの強力なライバルになってくれる筈です。そして、Scratchの機能を一通り使いこなせるようになったあなたは、気がつけばVB.NETの初級者クラスをかなり追い抜き、中級者でも難しい「オブジェクト指向の概念」を体で覚えていると思います。
そして、必要に迫られて冷や汗を書きながら慣れないオブジェクト指向言語を触っている三流以下のSE(つまり僕みたいなSEのこと)にとっては、オブジェクト指向言語を再教育してくれる格好のテキストになりますよ!


さて、子どもと決めた夏休みの課題は、この根幹部に「ゲームオーバーを作る」「全部ブロックが消えたらステージクリアとなる」「残機を3機まで持てる」「ステージによって、登場するブロックの数や硬さを変える」を追加で実装する事です。僕にもまだ正解は見えていないので、とても楽しみです。