SlideShare a Scribd company logo
1 of 33
Scalatronで楽しく学ぶ
         関数型プログラミング




2012-07-22 Jun SAITO (@ST63Jun_)
自己紹介

 FiS Projectの皆さんは知ってると思いますが



 Twitter: @ST63Jun_

 地方の私立工業大学で大学院生やってます

 普段はJavaを読み書きしています

 Scala歴:「hello world は書いた」



                               2
Scalatron

プログラミング言語Scala (スカラ) による


多人数対戦型


プログラミングゲーム!!


                            3
プログラミングゲーム

 Scalatronはプログラミングを題材にしたゲームです:



 プログラミング可能な「ボット」

 プレイヤーはボットのプログラムをScalaで書く

 他のプレイヤーのボットと対戦,最強のプログラムを目指す



 …面白そうでしょ?

                                  4
プログラミングゲームのよいところ

 動いているのが目に見えるので楽しい

 目標 (倒したい相手) がいるのでモチベが高まる

     ↓

 楽しいので夢中でプログラムを書く

     ↓

 気が付いたらプログラムが書けるようになる

     ↓

 \大勝利!!/


                             5
ゲーム画面




        6
似てるっぽいもの

 Robocode (IBM)
   戦車をJava (.NET) でプログラミングして対戦

 カルネージハートシリーズ (ARTDiNK)
   OKEと呼ばれるロボットをプログラミングして対戦
   プログラミングは「チップ」を繋げることで行う
   初代はPlayStationでリリース,最新作はPSPで出ています




                                        7
Scalatronが想定するプレイヤー

 以下のような人がプレイすることを想定しています:



 Scalaについて学びたい

 Scalaのプログラミングスキルを磨きたい



             OK,どんなゲームなのか
             は解ったけどそのScalaっ
               てのは何者なわけ?

                              8
プログラミング言語Scala

 スケーラブル (Scalable) な言語
   小規模なスクリプトから大規模システムまで
   TwitterのシステムはScala製

 マルチパラダイム言語
   オブジェクト指向
   関数型プログラミング
   それぞれの良いところを融合

 設計者は Martin Odersky
   JavaのGenericsの設計者でもあります

                              9
関数型プログラミングとは

 オブジェクト指向についてはすでにご存知かと思います

 関数型プログラミング
  処理を手続きではなく関数として扱うプログラミングモデルです
  手続き型言語の例
   C, BASIC, COBOL
   オブジェクト指向は手続き型の延長線上にあります
  関数型言語の例
   Lisp, ML, Haskell

 例として0から9までの偶数を列挙するプログラムを挙げます

                                   10
手続き型プログラミングの例
           // 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
関数型プログラミングの例
    // Scalaによる関数型の例
    println(Range(0, 9).filter(x => x % 2 == 0))



 数とは,0から9までの数である

 偶数とは,数から「2で割り切れる」ものを選んだものである



 関数型では問題は何であるかを記述します




                                                   12
各スタイルの利点・欠点

手続き型              関数型
 利点               利点
   処理手順を直感的に書け      処理を簡潔にコード化でき
                      る
    る
                     再利用性の高いコードを書
   処理速度のチューニング       きやすい
    がしやすい
                   欠点
 欠点                 画面表示や外部入力といっ
   変数が増えるとわけがわ       た,副作用を伴う処理を表
    からなくなる            現しづらい
                     そして,現実世界は副作用
   コードが長いとわけがわ       だらけである
    からなくなる


                                     13
マルチパラダイム
  Scalaが,今まで親しんでいた
  CやJavaとは違う考え方をし
  ているのは解ったけど,そんな
   のすぐには覚えられないよ.



       Scalaはマルチパラダイム言語だ
        から,どちらのスタイルで書い
       たっていいのよ.…でも,Scala
        本来のパワーを使うには関数型
         も理解する必要があるわね.




                           14
Scalatronのすすめ

 オブジェクト指向プログラミングがJava初学者の大きな壁で
  あるように,関数型プログラミングもScala初学者の大きな壁
  であることは間違いないと思います

 かつてオブジェクト指向がそうであったように,関数型言語
  が今後ソフトウェア開発の常識になっていくことは十分考え
  られます

 ですので,ここはひとつScalatronで関数型言語のエッセンス
  を体験してみてはいかがでしょうか!



                                     15
Scaratronことはじめ

 Scalatronのここがすごい
     Scala処理系を内蔵しています
     ボットのプログラムはブラウザ上のIDEから編集可能です
     IDEにはScalaプログラミングのチュートリアルが付属しています
     Scala処理系やIDEのインストールは不要,気軽に始められます!

   もちろん,お気に入りのエディタやIDEでも編集できます
   ブラウザ上で編集したコードはgitでクローンできます
     編集したコードをpushすると反映されます

      言い忘れてましたが,Scalatron本体は
      http://scalatron.github.com/ から入手可能です



                                              16
IDE




      17
ボットのプログラミング

 …の前に,Scalatronのゲームルールを簡単に説明します

 基本的なルールは単純ですが,全部説明すると長いので公式
  のドキュメント (英語) を参照することをお勧めします

 Scalatronのルールについては今回私家翻訳版を用意しました
 https://gist.github.com/3144973

 誤訳などありましたらご指摘いただけると幸いです




                                     18
Scalatronゲームルール (1)

 プレイヤーがプログラミングするのは「ボット」です

 ボットはエネルギーユニット (EU) を回収するのが任務です

 EUは食用となる動物や植物を集めることで増加します

 逆に,毒性の植物に触れたり凶暴な動物に襲われるとEUは減
  尐します

 一定時間内に最も多くのEUを獲得したプレイヤーが勝者です




                                   19
Scalatronゲームルール (2)

 ボットは「ミニボット」と呼ばれるユニットを生産できます

 ミニボットもEUを回収することができます

 ミニボットは「自爆」することができます

 自爆によって他プレイヤーにダメージを与えられます

 与えたダメージはボーナスとして自分のEUに加えられます




                                20
プレイヤーユニットの説明

 マスターボット ,ボット(Master bot, Bot)
   プレイヤーの分身となるもの
   不死身
   ミニボットを生成することができます

 ミニボット (Mini-bot)
   マスターボットや他のミニボットから生成されます
   最初にボットからEUを与えられ,活動中に尐しずつ減尐していき
    ます
   保持しているEUが0になると消滅します
   保持EUを爆発力に変換することで自爆攻撃できます


                                     21
資源ユニットの説明

 資源ユニット
   触れることでEUを回収したり,失ったりします
   ランダムな位置に生成され,常に一定量がマップ上に存在
   マップを動きまわる「動物」と固定の「植物」があります

 植物 (Plants)
   触れると+100EUのジュガー (Zugar)
   触れると-100EUのトキシフィラ (Toxifera)

 動物 (Beasts)
   触れると+200EUのフラペット (Fluppet)
   触れると-150EUのスノーグ (Snorg)


                                   22
各ユニットの説明




           23
ボットのプログラミング

 サーバ-クライアントモデル
  ボットはクライアントとしてゲームサーバに接続します
  ボットが見たものや現在のEU等はゲームサーバから通知されます
  ボットは通知された情報を見て,次の行動内容をサーバに返答し
   ます
  一連のやりとりに用いるコマンドは Scalatron Protocol で規定さ
   れています
  https://github.com/scalatron/scalatron/blob/master/Scalatr
  on/doc/markdown/Scalatron%20Protocol.md




                                                               24
サーバとのやりとりの例

     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
ボットのビュー (視界)

 ボットが勝利するためには,敵ユニットや資源の位置を認識する
  必要があります

 マスターボットは31x31,ミニボットは21x21の範囲で周囲を認
  識することができます

 検知したユニットやオブジェクトは以下のようなテキストで表現
  され,サーバからボットへ通知されます
            WWWW
            WWW      M: ボット自身
            W_____   W: 壁
            W        P: ジュガー
            W_____
            W        詳細は Scalatron Protocolに記載
            W__M__                               26
ボットプログラミングのポイント

 パーサの作成
    ゲームサーバが送信してくる文字列を解析するパーサが必要です
    mapやfilterといった関数型言語の要素を応用することで簡単に実装できます

 座標を表わすオブジェクト
    位置や距離の演算のために必要です
    Scalaでは演算子を自分で定義することができます

 戦術・戦略
    ミニボットを上手く使うことで,多種多用な戦略を展開することができます
    次のスライドではルールブックに載っている戦略について簡単に紹介します

 Scalatron のチュートリアルでは,以上の内容についてScalaの基礎から
  説明していますので,ぜひ活用しましょう
  https://github.com/scalatron/scalatron/blob/master/Scalatron/do
  c/markdown/Scalatron%20Tutorial.md
                                                                    27
戦略・戦術

 ミサイルディフェンス
    敵ボットを見つけたら直ちにミニボットを生産
    敵の位置をミニボットに入力し,敵ボットまでダッシュ!
    十分な距離まで近づいたら自爆
    爆発で与えたダメージ分のボーナスが自分のEUに加算されます

 フードフェッチャー
  食料となるアイテム (フラペット・ジュガー) を見つけたら直ちに
   ミニボット生成
  ミニボットは目標の位置までアイテムを回収しながら移動
  十分な量のEUを回収したらマスターボットの所に帰還してEUをマ
   スターに転送

                                      28
戦略・戦術

 ウォールプランター
  敵ボットの周囲にミニボットを壁として設置
  敵の活動を邪魔します

 マインレイヤー
  ミニボットを地雷として設置
  敵が来るまで待機し,近づいたら自爆




                          29
戦略・戦術

 フラペットハーダー
  フラペットを囲むようにミニボットを展開
  追い込むようにしてフラペットをマスターボットの方へ誘導
  マスターボットでフラペットを回収

 スノーグテンプター
  1対以上のミニボットを使ってスノーグを誘導
  敵ボットの方へ持っていき,襲うように仕向けます




                                 30
まとめ

 プログラミング言語Scalaによるプログラミングゲーム
  Scalatron を紹介しました

 Scalaはマルチパラダイム言語で,オブジェクト指向と関数型
  言語の両方のスタイルが使えるとを説明しました

 Scalatron で関数型の側面を学ぶことをお勧めしました

 Scalatronのゲームルールを説明し,プログラミングのポイン
  トを簡単に解説しました

 戦略・戦術の例を挙げました

                                     31
おわり

 ご静聴ありがとうございました




                   32
質疑応答など




         33

More Related Content

What's hot

Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法Hiroshi Yoshida
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26Yoshihisa Ozaki
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Masahiko Mizuta
 
InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012Go Tanaka
 
C#coding guideline その2_20130325
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325Yoshihisa Ozaki
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメなべ
 
オープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリオープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリ陽平 山口
 

What's hot (9)

Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012InvokeDynamic at #shikadriven 2012
InvokeDynamic at #shikadriven 2012
 
C#coding guideline その2_20130325
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325
 
Sharing Deep Dive
Sharing Deep DiveSharing Deep Dive
Sharing Deep Dive
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメ
 
オープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリオープンソースで作るスマホ文字認識アプリ
オープンソースで作るスマホ文字認識アプリ
 

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

Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in DartGoro Fuji
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesTakeshi Komiya
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaKazuhiro Hara
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
 
Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Taiji Miyabe
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpMasahito Zembutsu
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code readingHiro Yoshioka
 
Error handling in Erlang and Scala
Error handling in Erlang and ScalaError handling in Erlang and Scala
Error handling in Erlang and ScalaMasahito Ikuta
 

Similar to Scalatronで楽しく学ぶ関数型プログラミング (20)

Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Inside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfesInside of excel 方眼紙撲滅委員会 #pyfes
Inside of excel 方眼紙撲滅委員会 #pyfes
 
WebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 JavaWebSocket+Akka(Remote)+Play 2.1 Java
WebSocket+Akka(Remote)+Play 2.1 Java
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
Java fx勉強会lt 第8回
Java fx勉強会lt 第8回Java fx勉強会lt 第8回
Java fx勉強会lt 第8回
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
Error handling in Erlang and Scala
Error handling in Erlang and ScalaError handling in Erlang and Scala
Error handling in Erlang and Scala
 
Groovyコンファレンス
GroovyコンファレンスGroovyコンファレンス
Groovyコンファレンス
 

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 

Recently uploaded (10)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 

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

  • 1. Scalatronで楽しく学ぶ 関数型プログラミング 2012-07-22 Jun SAITO (@ST63Jun_)
  • 2. 自己紹介  FiS Projectの皆さんは知ってると思いますが  Twitter: @ST63Jun_  地方の私立工業大学で大学院生やってます  普段はJavaを読み書きしています  Scala歴:「hello world は書いた」 2
  • 4. プログラミングゲーム  Scalatronはプログラミングを題材にしたゲームです:  プログラミング可能な「ボット」  プレイヤーはボットのプログラムをScalaで書く  他のプレイヤーのボットと対戦,最強のプログラムを目指す  …面白そうでしょ? 4
  • 5. プログラミングゲームのよいところ  動いているのが目に見えるので楽しい  目標 (倒したい相手) がいるのでモチベが高まる ↓  楽しいので夢中でプログラムを書く ↓  気が付いたらプログラムが書けるようになる ↓  \大勝利!!/ 5
  • 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
  • 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