#フラッピーバードを自動操縦してみる!
こんにちは。プログラミングスクールTENTOで講師をしている谷岡です。OtOMOの倉本さんが誰か書かないか?とつぶやいていたので、重い腰を上げて参加することにしました。
TENTO : http://www.tento-net.com/
OtOMO : http://otomo.scratch-ja.org/
普段、教室内ではビジュアル言語のビスケットやスクラッチはあんまり教えてなくて、主にJavaScriptなどのテキスト言語を教えてるので、お高くとまって見えるかもしれませんが、結構フレンドリーなので、もっと気さくに話しかけてほしいです。みんなが想像するよりスクラッチもできます(とおもっています)し、ちびっ子もきらいじゃないです。
とはいえ、どんくらいスクラッチできるんだよ!?と言われたらことばでは証明のしようがないので、以前に、大人の威厳を見せるためにつくったフラッピーバードもどきと、それを魔改造したバージョンを紹介したいと思います。
フラッピーバードとは?
フラッピーバードについては、Hour of Code などでも紹介されているので、わたしが説明するより、そちらを参考にしてもらったほうがいいですよね。Hour of Code では、全10ステージをクリアすると、自分好みのフラッピーバードがつくれてしまいます。(対象年齢は4歳以上となっていますが、漢字が多いので未就学児には少し難しいかもしれません。)
Hour of Code
もし、フラッピーバードがどんなものかよくわからないのであれば、スクラッチを使ってフラッピーバードをつくるまえに、一度 Hour of Code で Flappy Code(フラッピーゲーム)をつくってみることをおすすめします。
Flappy code : https://code.org/flappy
完成すると、URLでシェアすることができます。
Flappy ゲーム : https://studio.code.org/c/139076578
Scratch 2.0
さて、フラッピーバードがどんなものかわかったところで、スクラッチでつくってみましょう。今回のスクラッチの開発環境は、Web版の Scratch 2.0 です。Webページを開いたら、「Scratchに参加しよう」でアカウントを作成し、サインインします。
Scratch : https://scratch.mit.edu/
フラッピーバードをつくる
スクラッチでの開発方法や、フラッピーバードのつくりかたは、ここではくわしく説明しませんが、「中を見る」でスクリプトの中身をみると、けっこう簡単につくれることがわかると思います。
Flappy Bat : https://scratch.mit.edu/projects/25083768/
フラッピーバードをつくる手順
開発手順だけ、まとめておきますね。流れ自体は、Flappy Code と大差ありません。
- キャラクターをつくる
- キャラクターに加速度をつける
- 地面にぶつかるとゲームオーバー
- クリックイベントでパタパタする
- 障害物をつくる
- 障害物をクローンする
- 障害物を移動させる
- 障害物にぶつかるとゲームオーバー
Flappy Bat
キャラクターを『とり』じゃなくて『こうもり』にしたので、Flappy Bat という名前にしました。完成するとこんなかんじになります。ぜひ挑戦してください!100点までいくにはそうとう練習が必要ですよ。
Flappy Bat : https://scratch.mit.edu/projects/25083768/#fullscreen
自動操縦とは?
さて、本家フラッピーバードは、その難易度の高さで有名になりましたが、つくってみた Flappy Bat の難易度も相当のものです。かなりがんばっても10点とか20点くらいまでしかいかない人も多いと思います。どうにかして最高得点を更新したいので、機械学習とか人工知能(AI)をつかって自動操縦できないか?とおもったわけです。
当時つくったプレゼン資料(修正版) : 「auto flight flappy bat」
最近は、人工知能とか、機械学習とか、すごくはやってて、気になっている人もおおいかもしれません。その入門編をスクラッチでやろう!というこころみです(でした)。(今回実装したのは、学習機能がないルールベースのオートパイロットです。)
自動操縦してみる
自動操縦といえば、最近では、Google社が実験している自動車の自動運転なんかが有名ですよね。でも、じつは旅客機などの飛行機では、すでに自動操縦(オートパイロット)は一般的で、なんらかのしかけで自動的に操縦されています。
というわけで、最終目標である機械学習による自動操縦はいったんおいといて、まずはルールベースでやってみようというわけです。フラッピーバードの操作方法はじつは簡単で、障害物との距離と高低差を見ながら、クリックするだけです。自動操縦機能を実装するための入力を「キャラクターと障害物の距離」と「キャラクターと隙間の高低差」と定義し、出力をクリックするタイミングと定義します。
- 《入力》
- キャラクターと障害物の距離
- キャラクターと隙間の高低差
- 《出力》
- クリックするタイミング
定義さえできてしまえば、この入力と出力のあるスクリプトをつくればいいわけです。(実際には、もうちょっと複雑になってしまいますが...)数式であらわすと、入力 $x$ にたいして、出力 $y$ が、式 $y = \phi(x)$ であらわされるシステムがあったとき、この $\phi$ を定義することが機械学習器をつくるということです。本格的に機械学習をやろうとするなら、この枠組みは、たもったほうがよいです。
Flappy Bat 0.3
そして、三日三晩、夜なべをして完成したのがこちら。ジャジャーン!
Flappy Bat 0.3 : https://scratch.mit.edu/projects/25295560/
HARDモードと、EASYモードがあります。また、画面左上の[AUTO ON / OFF]を切り替えることで、自動操縦を ON / OFF できます。自動操縦に勝てるかな?
てなかんじで今回はここまでです。もうちょっとまとまった時間と、やる気があれば人間の操作をモニタリングして、学習する機能を追加できると思ってますが、それはまた次回のおたのしみということで、それではよいお年を!
関連書籍案内
子どもにプログラミングを学ばせるべき6つの理由
著者: 神谷 加代 著/できるシリーズ編集部 著/竹林 暁 監修
12歳からはじめるHTML5とCSS3
TENTO (著)
略歴
TENTOスタッフ : http://www.tento-net.com/staffs
谷岡広樹(たにおかひろき)
千葉大学工学部卒。大学卒業後、プログラマーとして自然言語処理や、
情報検索のシステム開発に携わる。TENTOの設立者である草野、竹林
両氏の志に共感し、2013年3月よりTENTOをお手伝い中。