2011-12-23 6 views
0

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の方法で記述するようにこのコードを書き直していただければ幸いです。

+2

あなたのより一般的な質問のいくつかをカバーする記事「[Purely Functional Retrogames]」(http://prog21.dadgum.com/23.html)に興味があるかもしれません。 – Howard

+0

うわー、ありがとう!私は今それを読むでしょう! – noncom

+1

コードレビューのためのより良い場所はhttp://codereview.stackexchange.com/です。 –

答えて

1

オブジェクトが初期化される前にそのオブジェクトに対してメソッドを呼び出すことはできないため、buildを別の場所に移動する必要があります。そのための自然な場所は、コンパニオンオブジェクトです。 buildbuildを呼び出すときに初期化されていないnumを使用するため、パラメータとして渡す必要があります。

+0

さて、私は事を書き直して、stackexchangeのcodereviewを訪ねます! – noncom

関連する問題