Statistical Programming

Solitaireしたいな…

なんか最近ゲームしとらんなーとか思ってふとソリティアがしたくなったのでソリティアを作ろうと思います。ソリティアって打とうとすると粗リディアって打っちゃうのをなんとかしたい今日この頃。

開発言語はScala一択で、Scala IDE for Eclipse, Play framework, SBT(Simple Build Tool) を利用してWebアプリ作成を目指す。どういう設計にしようかな〜とか思ったけどとりあえずはじめてみよっかなということターミナルを起動。あ、自分Mac派です。

パッケージ管理ソフトであるHomebrewにPlayは既にインストールされてるので

play new Solitaire


と入力しPlayを利用した新規フォルダを作成。
ちなみにPlayをインストールしてなかったら brew install play で簡単インストールできまする
Homebrewをインストールするにはターミナルを起動し以下をコピペしてあげれば勝手に動く。蠢く。

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"


んで話が戻って、

cd Solitaire


と打ちディレクトリを移動。

play と打ち込みplayを起動させ、
eclipse コマンドでeclipseにimportできるようにする。

次にダウンロードしてあるScala IDE for Eclipseを開き

File -> Import -> Existing File(確かそんなかんじ) -> フォルダのある場所を選択しimport。


これでEclipseとPlayを使って開発する準備完了。

それでは開発すたーとおおお。。。
まずはカードの定義から。

当たり前ながらSolitaireがルートディレクトリなんでその下にあるappフォルダへ行き modelsパッケージを作成。
んでそん中にcardsトレイト作成。

cards.scalaファイル作成っすね


package models

trait cards {
val color:String
val mark:String
val number:Int
}

trait red extends cards{
val color="red"
}
trait black extends cards{
val color="black"
}

//make classes below 'private' finally

class D(n:Int) extends cards with red{
val mark="d"
val number=n
}
class H(n:Int) extends cards with red{
val mark="H"
val number=n
}
class S(n:Int) extends cards with black{
val mark="s"
val number=n
}
class C(n:Int) extends cards with black{
val mark="c"
val number=n
}



いきなりドワーってなってなにやってん?って感じなので説明しますと、まずこのcards.scalaファイルの中にあるのは cards trait, red trait, black trait, D class, H class, S class, C classなんすね。んでもってcards traitがそのトップに位置し、red traitとblack traitがそれをmixin。D=Dia, H=Heart, S=Spade, C=Cloverを意味し、DとHはredをmixin、SとCがblackをmixin。cards traitは3つの不変(immutable)な値, color, mark, numberを持ちそれらがトランプの要素を形作っていくんす。お察しの通りred traitはそのcolorがredとなり、black traitはblackとなります。それぞれのtraitをmixinしている(D,H)と(S,C)のクラスのcolorは常にそれぞれred、blackとなるので一々記述する手間が省けるというわけです。そしてそれらクラスではmarkの値がクラス名と一致するようになってます。ですのでそれぞれのクラスを作成する際に数字だけコンストラクタへいれてあげればあとは自動的にcolorとmarkも適切に決められるというわけです。