Javaから来て、私はScalaを学んでいます。私はゲームや仮想世界のプログラミングに興味があるので、私は最初のプログラムを小さなゲーム世界シミュレータに決定しました。私の考えでは、すべてのゲーム要素は通常、作成、更新、削除という次の段階で生きています。 Javaや他のOOPで私にとって絶対に明白です。今私はScalaに来ました...私がこれまで実装してきたことは、あらゆるサイクルを突き詰めるべきである多くの細胞のための単なるコンテナです。ここでは、コードは次のようになります。Scala - ゲームワールドを更新する
まず//init
val rand : Random = new Random
//mutation variations
def mutF(f:Int=>Int, v: Int) : Int = {f(v)}
def mutFA(v:Int) : Int = mutF(x => x, v)
def mutFB(v:Int) : Int = mutF(x => x + x, v)
def mutFC(v:Int) : Int = mutF(x => x - x, v)
//mutation variance
val mutFS : List[Int=>Int] = List(mutFA, mutFB, mutFC)
//cycle through mutation functions
def mutFF(f:Int=>Int) : Int=>Int = {
val i = mutFS.indexOf(f)
if(i < mutFS.length) mutFS(i + 1)
else mutFS(0)
}
//objects
class Cell(value:Int)(f:Int => Int){ //TODO: what will be without currying???
def mutate() : Cell = new Cell(f(value))(f)
def output() {
print("[" + value + "]")
}
}
//the main class
class Breed(generation:Int, num:Int, margins:Int, cells: List[Cell]) {
def this(num:Int, margins:Int) = this(0, num, margins, build()) //<<<<<
//make 1 cell
def makeCell() : Cell = {
val mutF:Int=>Int = mutFS(rand.nextInt(mutFS.length))
val v = rand.nextInt(margins)
println("BREED: making cell " + v)
new Cell(v)(mutF)
}
//fill with random cells
def build() : List[Cell] = {
def addCell(acc:Int, list:List[Cell]) : List[Cell] = {
println("BREED: build(), acc= " + acc + " list=" + list)
if(acc <= 0) list
else addCell(acc - 1, makeCell :: list)
}
addCell(num, List())
}
// val cells : List[Cell] = build()
//go several generations ahead, print every generation
def mutate(generations:Int) {
def mutateF(acc:Int, breed : Breed) : Breed = {
if (acc == 0) breed
else {
print("BREED: mutating, ")
breed.output()
mutateF(acc - 1, mutate(breed))
}
}
mutateF(generations, this)
}
//mutate this breed
def mutate(breed : Breed) : Breed = {
def mutateF(l : List[Cell]) : List[Cell] = {
l match {
case Nil => Nil
case y :: yx => y.mutate() :: mutateF(yx)
}
}
new Breed(generation, num, margins, mutateF(build))
}
def output() {
print("BREED: [" + generation + "] ")
for(i <- 0 to num - 1) cells(i).output()
println()
}
}
- 私の質問は - AUXコンストラクタで「ビルド()」関数の作業をmakуする方法? Javaでは問題ありませんでした。これを解決するためのScalaの方法は何ですか?第二に、Scalaの機能的アプローチの観点から、私の間違いについてコメントしていただけますか?
更新:純粋なScalaの方法で記述するようにこのコードを書き直していただければ幸いです。
あなたのより一般的な質問のいくつかをカバーする記事「[Purely Functional Retrogames]」(http://prog21.dadgum.com/23.html)に興味があるかもしれません。 – Howard
うわー、ありがとう!私は今それを読むでしょう! – noncom
コードレビューのためのより良い場所はhttp://codereview.stackexchange.com/です。 –