ryugate #5641(2008/02/02 12:46 GMT) [ Scala ] Rating0/0=0.00
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 } }
Rating0/0=0.00-0+
[ reply ]
ryugate
#5641()
[
Scala
]
Rating0/0=0.00
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 } }Rating0/0=0.00-0+
[ reply ]