Spde を使う 4

適当にだらだらと貼っつけます。

        • -

最初のランダムなパターンを生成する関数と、現世代のパターンから次世代のパターンを生成する関数に分けてみる。
(次世代パターン生成関数はまだランダムに生成してるだけ)

val screenW = 400;
val screenH = 200;

val cellSize = 4;

// 縦横のセルの数
val cellNumX = screenW / cellSize
val cellNumY = screenH / cellSize

size(screenW, screenH)
frameRate(4)

var count = 0

// true or false がランダムに詰まった cellNumX * cellNumY の二次元配列を生成
def generateRandomMatrix(): Array[Array[Boolean]] = {
  new Array[Int](cellNumX).map{ x =>
    new Array[Int](cellNumY).map{ y =>
      random(2) > 1
    }
  }
}

// 現世代のパターンから次世代のパターンを生成
def generateNextMatrix(matrix: Array[Array[Boolean]]): Array[Array[Boolean]] = {
  generateRandomMatrix
}

// matrix の内容に従って描画(trueならセルを描画)
def drawMatrix(matrix: Array[Array[Boolean]]) = {
  stroke(0)
  for (yi <- 0 to cellNumY - 1){
    val y = yi * cellSize
    for (xi <- 0 to cellNumX - 1){
      val x = xi * cellSize
      if( matrix(xi)(yi) ){
        rect(x, y, cellSize - 2, cellSize - 2)
      }
    }
  }
}

var matrix = generateRandomMatrix

def draw {
  fill(255)
  rect(0, 0, screenW, screenH)

  drawMatrix(matrix)
  matrix = generateNextMatrix(matrix)

  count += 1
  if(count > 10){ System.exit(0) }
}
        • -

generateNextMatrix の中身を書いてみた。現世代の生死を反転させるだけ。

val screenW = 400;
val screenH = 200;

val cellSize = 4;

// 縦横のセルの数
val cellNumX = screenW / cellSize
val cellNumY = screenH / cellSize

size(screenW, screenH)
frameRate(4)


// true or false がランダムに詰まった cellNumX * cellNumY の二次元配列を生成
def generateRandomMatrix(): Array[Array[Boolean]] = {
  new Array[Int](cellNumX).map{ x =>
    new Array[Int](cellNumY).map{ y =>
      random(2) > 1
    }
  }
}

// 現世代のパターンから次世代のパターンを生成
def generateNextMatrix(matrix: Array[Array[Boolean]]): Array[Array[Boolean]] = {
  var x = -1
  var y = -1

  matrix.map{ row =>
    y = -1
    x += 1
    row.map{ col =>
      y += 1
      ! matrix(x)(y)
    }
  }
}

// matrix の内容に従って描画(trueならセルを描画)
def drawMatrix(matrix: Array[Array[Boolean]]) = {
  stroke(0)
  for (yi <- 0 to cellNumY - 1){
    val y = yi * cellSize
    for (xi <- 0 to cellNumX - 1){
      val x = xi * cellSize
      if( matrix(xi)(yi) ){
        rect(x, y, cellSize - 2, cellSize - 2)
      }
    }
  }
}

/********************************/

var count = 0

// 最初のランダムなパターンを生成
var matrix = generateRandomMatrix

def draw {
  fill(255)
  rect(0, 0, screenW, screenH)

  drawMatrix(matrix)

  // 現世代のパターンから次世代のパターンを生成
  matrix = generateNextMatrix(matrix)

  count += 1
  if(count > 10){ System.exit(0) }
}