More Related Content
Similar to Scalatronで楽しく学ぶ関数型プログラミング
Similar to Scalatronで楽しく学ぶ関数型プログラミング (20)
Scalatronで楽しく学ぶ関数型プログラミング
- 7. 似てるっぽいもの
Robocode (IBM)
戦車をJava (.NET) でプログラミングして対戦
カルネージハートシリーズ (ARTDiNK)
OKEと呼ばれるロボットをプログラミングして対戦
プログラミングは「チップ」を繋げることで行う
初代はPlayStationでリリース,最新作はPSPで出ています
7
- 9. プログラミング言語Scala
スケーラブル (Scalable) な言語
小規模なスクリプトから大規模システムまで
TwitterのシステムはScala製
マルチパラダイム言語
オブジェクト指向
関数型プログラミング
それぞれの良いところを融合
設計者は Martin Odersky
JavaのGenericsの設計者でもあります
9
- 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
- 16. Scaratronことはじめ
Scalatronのここがすごい
Scala処理系を内蔵しています
ボットのプログラムはブラウザ上のIDEから編集可能です
IDEにはScalaプログラミングのチュートリアルが付属しています
Scala処理系やIDEのインストールは不要,気軽に始められます!
もちろん,お気に入りのエディタやIDEでも編集できます
ブラウザ上で編集したコードはgitでクローンできます
編集したコードをpushすると反映されます
言い忘れてましたが,Scalatron本体は
http://scalatron.github.com/ から入手可能です
16
- 21. プレイヤーユニットの説明
マスターボット ,ボット(Master bot, Bot)
プレイヤーの分身となるもの
不死身
ミニボットを生成することができます
ミニボット (Mini-bot)
マスターボットや他のミニボットから生成されます
最初にボットからEUを与えられ,活動中に尐しずつ減尐していき
ます
保持しているEUが0になると消滅します
保持EUを爆発力に変換することで自爆攻撃できます
21
- 22. 資源ユニットの説明
資源ユニット
触れることでEUを回収したり,失ったりします
ランダムな位置に生成され,常に一定量がマップ上に存在
マップを動きまわる「動物」と固定の「植物」があります
植物 (Plants)
触れると+100EUのジュガー (Zugar)
触れると-100EUのトキシフィラ (Toxifera)
動物 (Beasts)
触れると+200EUのフラペット (Fluppet)
触れると-150EUのスノーグ (Snorg)
22
- 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