zacca blog

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Scalaで「悪いなのび太、このゲームN人用なんだ。」

Scalaの勉強がてら、スネ夫の「悪いなのび太、このゲーム3人用なんだ」を実行するプログラムつくってみた。
ソース(ExceptNobita.scala)
勉強のポイントは
  • パターンマッチ
  • パターンガード
  • ケースクラス
  • 再帰関数
  • シングルトンオブジェクト
って感じかなぁ。

case class Kid(name:String)
class FunnyGame {
    var member = List[Kid]()
    def attend(kid:Kid) = {
        member = kid :: member
    }
}
object Suneo extends Kid("Suneo") {
    val game = new FunnyGame
    def attend(kids:List[Kid]) = {
        val list = tailingNobita(kids)
        list.foreach {
            kid => kid match {
                case Suneo =>
                    game.attend(Suneo)
                    println(Suneo.name+":僕はもちろん参加ね。")
                case kid if kid != Kid("Nobita") =>
                    game.attend(kid)
                    println(Suneo.name+":大歓迎だよ"+kid.name+"!")
                case kid =>
                    println(Suneo.name+":悪いな"+kid.name+"、このゲーム"
                    +game.member.length+"人用なんだ。")
            }
        }
    }
    def tailingNobita(kids:List[Kid]):List[Kid] = kids match {
        case kid :: kids if kid == Kid("Nobita")
            => tailingNobita(kids) ++ List(kid)
        case kid :: kids
            => kid :: tailingNobita(kids)
        case Nil => Nil
    }
}
object ExceptNobita {
    def main(args:Array[String]) {
        val kidNames = List[String]() ++ args
        val kids = Suneo :: getKids(kidNames)
        Suneo.attend(kids)
    }
    def getKids(names:List[String]):List[Kid] = names match {
        case kid :: kids => Kid(kid) :: getKids(kids)
        case Nil => Nil
    }
}

 動作はこんな感じ。

$ scala ExceptNobita Nobita Gian Shizuka
Suneo:僕はもちろん参加ね。
Suneo:大歓迎だよGian!
Suneo:大歓迎だよShizuka!
悪いなNobita、このゲーム3人用なんだ。

のび太をのけものにします。

$ scala ExceptNobita Shizuka Nobita Gian
Suneo:僕はもちろん参加ね。
Suneo:大歓迎だよShizuka!
Suneo:大歓迎だよGian!
悪いなNobita、このゲーム3人用なんだ。

引数の順番を変えても一緒。

$ scala ExceptNobita Shizuka Dekisugi Gian Sunetsugu Sunekichi
Suneo:僕はもちろん参加ね。
Suneo:大歓迎だよShizuka!
Suneo:大歓迎だよDekisugi!
Suneo:大歓迎だよGian!
Suneo:大歓迎だよSunetsugu!
Suneo:大歓迎だよSunekichi!

人数増えてもOK。

$ scala ExceptNobita Shizuka Dekisugi Nobita Gian Sunetsugu Sunekichi
Suneo:僕はもちろん参加ね。
Suneo:大歓迎だよShizuka!
Suneo:大歓迎だよDekisugi!
Suneo:大歓迎だよGian!
Suneo:大歓迎だよSunetsugu!
Suneo:大歓迎だよSunekichi!
悪いなNobita、このゲーム6人用なんだ。

それでものび太が入ればのけものにします。

スポンサーサイト

scalaの2Dライブラリは何がいいかしら。

CもJavaもRubyも中途半端なのに、Scalaの入門書買っちまったw

Scalaプログラミング入門Scalaプログラミング入門
(2010/03/18)
デイビッド・ポラック

商品詳細を見る

会社との往復途中と昼休みに読んでます。
趣味で弄ってるプログラムなんかで使えるのではないかと…。

Javaはやたら長ったらしくなるし中途半端なOOPだし。
Ruby大好きなのだけれど、(自分なりに)複雑に作り込んだ時にバグ埋め込んだら原因究明大変だし。

という事で最適解として、JavaとRubyの間に立つScala、始めました。
JavaのVMはRubyのそれよりかなり高速なんだったよね…?
せっかくコア6つも積んだPC持ってるので、全部活かせるプログラム作りたい。

やっぱり作るならシミュレータ。

#追記
書こうと思ってタイトルにもしてた件書くの忘れてた!

シミュレータ作る上で、下層コードから書くにしても、とりあえず動作を見ながら進めたいのだが、何か簡単で理解しやすいAPIの2Dライブラリは無いかしら。

Rubyの時はStarRuby使ってて非常に良かったのだけれど…。
Javaではcanvasに球体描きまくってたなぁ…。
初めて触ったJavaで一日かかったけどw

Scalaの2Dライブラリ、ググった範囲だとこんなものかな?

ここで見つけたもの
 Wiggle
 Piccolo2D
 SPDE #Scalaとprocessing
このへんから選ぶかー?
Javaのライブラリも使えるとはいえども、結局Javaネイティブの方法で呼び出さなきゃならないなら意味無いわな。
そのへんうまくやる方法ないか!

geditでscalaシンタックスハイライト

Ubuntuにデフォで入っているgeditで、scalaのシンタックスハイライトを設定するファイルを提供している人が居たのでご紹介。
scalaなかなか良さげなのだが、まだまだ世の中の対応は薄い…。

GEDIT AND SCALA - LousyCoder
http://lousycoder.com/blog/index.php?/archives/81-gEdit-and-Scala.html

こちらのページの、"lang file for gEdit"のリンクから"scala.lang"を保存。
それを"/usr/share/gtksourceview-2.0/language-specs"へコピーします。
Ubuntu10.10の環境ではroot権限が必要でしたので、sudoでコピーしました。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。