Your SlideShare is downloading. ×
Scalatronで楽しく学ぶ関数型プログラミング
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Scalatronで楽しく学ぶ関数型プログラミング

1,586
views

Published on

Published in: Technology

1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total Views
1,586
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
1
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Scalatronで楽しく学ぶ 関数型プログラミング2012-07-22 Jun SAITO (@ST63Jun_)
  • 2. 自己紹介 FiS Projectの皆さんは知ってると思いますが Twitter: @ST63Jun_ 地方の私立工業大学で大学院生やってます 普段はJavaを読み書きしています Scala歴:「hello world は書いた」 2
  • 3. Scalatronプログラミング言語Scala (スカラ) による多人数対戦型プログラミングゲーム!! 3
  • 4. プログラミングゲーム Scalatronはプログラミングを題材にしたゲームです: プログラミング可能な「ボット」 プレイヤーはボットのプログラムをScalaで書く 他のプレイヤーのボットと対戦,最強のプログラムを目指す …面白そうでしょ? 4
  • 5. プログラミングゲームのよいところ 動いているのが目に見えるので楽しい 目標 (倒したい相手) がいるのでモチベが高まる ↓ 楽しいので夢中でプログラムを書く ↓ 気が付いたらプログラムが書けるようになる ↓ \大勝利!!/ 5
  • 6. ゲーム画面 6
  • 7. 似てるっぽいもの Robocode (IBM)  戦車をJava (.NET) でプログラミングして対戦 カルネージハートシリーズ (ARTDiNK)  OKEと呼ばれるロボットをプログラミングして対戦  プログラミングは「チップ」を繋げることで行う  初代はPlayStationでリリース,最新作はPSPで出ています 7
  • 8. Scalatronが想定するプレイヤー 以下のような人がプレイすることを想定しています: Scalaについて学びたい Scalaのプログラミングスキルを磨きたい OK,どんなゲームなのか は解ったけどそのScalaっ てのは何者なわけ? 8
  • 9. プログラミング言語Scala スケーラブル (Scalable) な言語  小規模なスクリプトから大規模システムまで  TwitterのシステムはScala製 マルチパラダイム言語  オブジェクト指向  関数型プログラミング  それぞれの良いところを融合 設計者は Martin Odersky  JavaのGenericsの設計者でもあります 9
  • 10. 関数型プログラミングとは オブジェクト指向についてはすでにご存知かと思います 関数型プログラミング  処理を手続きではなく関数として扱うプログラミングモデルです  手続き型言語の例  C, BASIC, COBOL  オブジェクト指向は手続き型の延長線上にあります  関数型言語の例  Lisp, ML, Haskell 例として0から9までの偶数を列挙するプログラムを挙げます 10
  • 11. 手続き型プログラミングの例 // Javaによる手続き型の例 for (int i = 0; i < 10; i++) { if (i % 2 == 0) System.out.println(i); }1. 変数iを0から9まで1づつ増加させる2. 変数iが2で割り切れるならそれは偶数なので,iを表示3. 1に戻る 手続き型では問題をどうやって解くかを記述します 11
  • 12. 関数型プログラミングの例 // Scalaによる関数型の例 println(Range(0, 9).filter(x => x % 2 == 0)) 数とは,0から9までの数である 偶数とは,数から「2で割り切れる」ものを選んだものである 関数型では問題は何であるかを記述します 12
  • 13. 各スタイルの利点・欠点手続き型 関数型 利点  利点  処理手順を直感的に書け  処理を簡潔にコード化でき る る  再利用性の高いコードを書  処理速度のチューニング きやすい がしやすい  欠点 欠点  画面表示や外部入力といっ  変数が増えるとわけがわ た,副作用を伴う処理を表 からなくなる 現しづらい  そして,現実世界は副作用  コードが長いとわけがわ だらけである からなくなる 13
  • 14. マルチパラダイム Scalaが,今まで親しんでいた CやJavaとは違う考え方をし ているのは解ったけど,そんな のすぐには覚えられないよ. Scalaはマルチパラダイム言語だ から,どちらのスタイルで書い たっていいのよ.…でも,Scala 本来のパワーを使うには関数型 も理解する必要があるわね. 14
  • 15. Scalatronのすすめ オブジェクト指向プログラミングがJava初学者の大きな壁で あるように,関数型プログラミングもScala初学者の大きな壁 であることは間違いないと思います かつてオブジェクト指向がそうであったように,関数型言語 が今後ソフトウェア開発の常識になっていくことは十分考え られます ですので,ここはひとつScalatronで関数型言語のエッセンス を体験してみてはいかがでしょうか! 15
  • 16. Scaratronことはじめ Scalatronのここがすごい  Scala処理系を内蔵しています  ボットのプログラムはブラウザ上のIDEから編集可能です  IDEにはScalaプログラミングのチュートリアルが付属しています  Scala処理系やIDEのインストールは不要,気軽に始められます!  もちろん,お気に入りのエディタやIDEでも編集できます  ブラウザ上で編集したコードはgitでクローンできます  編集したコードをpushすると反映されます 言い忘れてましたが,Scalatron本体は http://scalatron.github.com/ から入手可能です 16
  • 17. IDE 17
  • 18. ボットのプログラミング …の前に,Scalatronのゲームルールを簡単に説明します 基本的なルールは単純ですが,全部説明すると長いので公式 のドキュメント (英語) を参照することをお勧めします Scalatronのルールについては今回私家翻訳版を用意しました https://gist.github.com/3144973 誤訳などありましたらご指摘いただけると幸いです 18
  • 19. Scalatronゲームルール (1) プレイヤーがプログラミングするのは「ボット」です ボットはエネルギーユニット (EU) を回収するのが任務です EUは食用となる動物や植物を集めることで増加します 逆に,毒性の植物に触れたり凶暴な動物に襲われるとEUは減 尐します 一定時間内に最も多くのEUを獲得したプレイヤーが勝者です 19
  • 20. Scalatronゲームルール (2) ボットは「ミニボット」と呼ばれるユニットを生産できます ミニボットもEUを回収することができます ミニボットは「自爆」することができます 自爆によって他プレイヤーにダメージを与えられます 与えたダメージはボーナスとして自分のEUに加えられます 20
  • 21. プレイヤーユニットの説明 マスターボット ,ボット(Master bot, Bot)  プレイヤーの分身となるもの  不死身  ミニボットを生成することができます ミニボット (Mini-bot)  マスターボットや他のミニボットから生成されます  最初にボットからEUを与えられ,活動中に尐しずつ減尐していき ます  保持しているEUが0になると消滅します  保持EUを爆発力に変換することで自爆攻撃できます 21
  • 22. 資源ユニットの説明 資源ユニット  触れることでEUを回収したり,失ったりします  ランダムな位置に生成され,常に一定量がマップ上に存在  マップを動きまわる「動物」と固定の「植物」があります 植物 (Plants)  触れると+100EUのジュガー (Zugar)  触れると-100EUのトキシフィラ (Toxifera) 動物 (Beasts)  触れると+200EUのフラペット (Fluppet)  触れると-150EUのスノーグ (Snorg) 22
  • 23. 各ユニットの説明 23
  • 24. ボットのプログラミング サーバ-クライアントモデル  ボットはクライアントとしてゲームサーバに接続します  ボットが見たものや現在のEU等はゲームサーバから通知されます  ボットは通知された情報を見て,次の行動内容をサーバに返答し ます  一連のやりとりに用いるコマンドは Scalatron Protocol で規定さ れています https://github.com/scalatron/scalatron/blob/master/Scalatr on/doc/markdown/Scalatron%20Protocol.md 24
  • 25. サーバとのやりとりの例 class ControlFunction { val rnd = new Random() def respond(input: String): String = { *1 val (opcode, paramMap) = CommandParser(input) if( opcode == “React” ) { // サーバから“React”コマンドを受けとったら *2 val dx = rnd.nextInt(3)-1 // “Move”コマンドをサーバに返答する val dy = rnd.nextInt(3)-1 “Move(direction=” + dx + “:” + dy + “)” *3 } else { “” // “React”コマンドでなければなにもしない (サーバへ何も応答しない) } }*1 サーバから受信したコマンドを解析する CommandParserクラスを別に定義しています }*2 val は Javaでいう final Object … です*3 Scalaでは return 文は省略可能です 25
  • 26. ボットのビュー (視界) ボットが勝利するためには,敵ユニットや資源の位置を認識する 必要があります マスターボットは31x31,ミニボットは21x21の範囲で周囲を認 識することができます 検知したユニットやオブジェクトは以下のようなテキストで表現 され,サーバからボットへ通知されます WWWW WWW M: ボット自身 W_____ W: 壁 W P: ジュガー W_____ W 詳細は Scalatron Protocolに記載 W__M__ 26
  • 27. ボットプログラミングのポイント パーサの作成  ゲームサーバが送信してくる文字列を解析するパーサが必要です  mapやfilterといった関数型言語の要素を応用することで簡単に実装できます 座標を表わすオブジェクト  位置や距離の演算のために必要です  Scalaでは演算子を自分で定義することができます 戦術・戦略  ミニボットを上手く使うことで,多種多用な戦略を展開することができます  次のスライドではルールブックに載っている戦略について簡単に紹介します Scalatron のチュートリアルでは,以上の内容についてScalaの基礎から 説明していますので,ぜひ活用しましょう https://github.com/scalatron/scalatron/blob/master/Scalatron/do c/markdown/Scalatron%20Tutorial.md 27
  • 28. 戦略・戦術 ミサイルディフェンス  敵ボットを見つけたら直ちにミニボットを生産  敵の位置をミニボットに入力し,敵ボットまでダッシュ!  十分な距離まで近づいたら自爆  爆発で与えたダメージ分のボーナスが自分のEUに加算されます フードフェッチャー  食料となるアイテム (フラペット・ジュガー) を見つけたら直ちに ミニボット生成  ミニボットは目標の位置までアイテムを回収しながら移動  十分な量のEUを回収したらマスターボットの所に帰還してEUをマ スターに転送 28
  • 29. 戦略・戦術 ウォールプランター  敵ボットの周囲にミニボットを壁として設置  敵の活動を邪魔します マインレイヤー  ミニボットを地雷として設置  敵が来るまで待機し,近づいたら自爆 29
  • 30. 戦略・戦術 フラペットハーダー  フラペットを囲むようにミニボットを展開  追い込むようにしてフラペットをマスターボットの方へ誘導  マスターボットでフラペットを回収 スノーグテンプター  1対以上のミニボットを使ってスノーグを誘導  敵ボットの方へ持っていき,襲うように仕向けます 30
  • 31. まとめ プログラミング言語Scalaによるプログラミングゲーム Scalatron を紹介しました Scalaはマルチパラダイム言語で,オブジェクト指向と関数型 言語の両方のスタイルが使えるとを説明しました Scalatron で関数型の側面を学ぶことをお勧めしました Scalatronのゲームルールを説明し,プログラミングのポイン トを簡単に解説しました 戦略・戦術の例を挙げました 31
  • 32. おわり ご静聴ありがとうございました 32
  • 33. 質疑応答など 33

×