ライフゲーム
Posted feedbacks - Scala
Scala実装がなかったので、作ってみました。 まだまだ、Scalaになれてないので、 ツッコミどころ満載とおもいます。(バグもあるかも・・・) ばしばし、ご指摘いただければ幸いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | object lifegame {
def main(args:Array[String]) {
println("make field")
val size = 10
val fields = new Array[Lifefield](2)
fields.update(0, new Lifefield(size))
fields.update(1, new Lifefield(size))
println("init cell")
val f = fields.apply(0)
f.rndinit
// glider
//f.setcell(0,1,1)
//f.setcell(1,0,1)
//f.setcell(2,0,1)
//f.setcell(2,1,1)
//f.setcell(2,2,1)
println(fields.apply(0))
println("start")
Iterator.range(0,1000).foreach {i =>
val fi = i % 2
val nfi = if (fi == 0) 1 else 0
fields.apply(fi).makenext(fields.apply(nfi))
println("age = " + i.toString)
println(fields.apply(nfi))
Thread.sleep(200)
}
}
}
class Lifefield {
var sx:int = 0
var sy:int = 0
var field:Array[Array[int]] = null
def this(x:int, y:int) {
this()
sx = x; sy = y
field = new Array[Array[int]](sx)
field.indices.foreach {i => field.update(i, new Array[int](sy)) }
field.foreach {line =>
line.indices.foreach {i =>
line.update(i, 0)
}
}
}
def this(size:int) = this(size,size)
def setcell(x:int,y:int,value:int) = field.apply(y).update(x, value)
def makenext(newfield:Lifefield) = {
Iterator.range(0,sy).foreach {y =>
Iterator.range(0,sx).foreach {x =>
val cellvalue = field.apply(y).apply(x)
val num = checkaround(x,y)
if (cellvalue == 0 && num == 3)
newfield.setcell(x,y, 1)
else
if (cellvalue == 1 && (num == 2 || num == 3))
newfield.setcell(x,y, 1)
else
newfield.setcell(x,y, 0)
}
}
}
def checkaround(x:int,y:int) = {
val r = Iterator.range(-1,2)
var n:int = 0
r.foreach {i1 =>
r.foreach {i2 =>
if(i1==0 && i2==0)
null
else
n += cellvalue(x + i1, y + i2)
}
}
n
}
def cellvalue(x:int, y:int) = {
val xx = if (x < 0) x + sx else x % sx
val yy = if (y < 0) y + sy else y % sy
field.apply(yy).apply(xx)
}
def rndinit {
val rnd = new Random()
field.foreach {line =>
line.indices.foreach {i =>
if (rnd.nextInt(3) == 0)
line.update(i, 1)
else
line.update(i, 0)
}
}
}
override def toString() = {
var ret = ""
field.foreach {line =>
line.foreach {cell =>
ret += (if (cell == 1) "[*]" else "[ ]")
}
ret += "\n"
}
ret
}
}
|


saws
#5330()
Rating7/13=0.54
see: Wikipedia:ライフゲーム
[ reply ]