Open with scalafiddle for a live demo
Implementation of Langton's ant with scala-js-fiddle
Open with scalafiddle for a live demo
Implementation of Langton's ant with scala-js-fiddle
| val antSize=3 | |
| var direction: Direction = North | |
| val delayMillis=1 // increase this to slow down | |
| val loopSize=1000 // increase this to accelerate | |
| val infinite=false | |
| Fiddle.draw.fillStyle = "blue" | |
| Fiddle.draw.font= "20px Georgia" | |
| val (h, w) = (Fiddle.canvas.height, Fiddle.canvas.width) | |
| val (maxX, maxY) = (h / antSize, w / antSize) | |
| var (x, y) = (maxX/2, maxY / 2) | |
| var i = 0 | |
| val blackSpots = collection.mutable.Map.empty[(Int, Int), Boolean].withDefaultValue(false) | |
| Fiddle.schedule(delayMillis) { | |
| for (i<- 1 to loopSize) { | |
| drawIter() | |
| drawAnt() | |
| nextIter() | |
| } | |
| } | |
| def nextIter():Unit={ | |
| i += 1 | |
| direction = | |
| if (blackSpots((x, y))) direction.left | |
| else direction.right | |
| blackSpots.update((x, y), !blackSpots((x, y))) | |
| val (nx, ny) = checkBounds(direction.next(x, y)) | |
| x = nx | |
| y = ny | |
| } | |
| def checkBounds(xy:(Int,Int)) : (Int,Int) = | |
| if(infinite) xy | |
| else { | |
| val (x,y)=xy | |
| ( | |
| if(x>maxX) 0 else if (x<0) maxX else x, | |
| if(y>maxY) 0 else if (y<0) maxY else y | |
| ) | |
| } | |
| def drawIter():Unit={ | |
| Fiddle.draw.clearRect(0, 0, 100, 30) | |
| Fiddle.draw.fillText(i.toString, 20, 20) | |
| } | |
| def drawAnt() :Unit= { | |
| val antX=x*antSize | |
| val antY=y*antSize | |
| if (blackSpots((x, y))) | |
| Fiddle.draw.clearRect(antX,antY, antSize,antSize) | |
| else | |
| Fiddle.draw.fillRect(antX,antY, antSize,antSize) | |
| } | |
| } | |
| trait Direction { | |
| def left: Direction | |
| def right: Direction | |
| def next(x: Int, y: Int): (Int, Int) | |
| } | |
| object North extends Direction { | |
| val left = West | |
| val right = East | |
| def next(x: Int, y: Int) = (x, y - 1) | |
| } | |
| object South extends Direction { | |
| val left = East | |
| val right = West | |
| def next(x: Int, y: Int) = (x, y + 1) | |
| } | |
| object West extends Direction { | |
| val left = South | |
| val right = North | |
| def next(x: Int, y: Int) = (x - 1, y) | |
| } | |
| object East extends Direction { | |
| val left = North | |
| val right = South | |
| def next(x: Int, y: Int) = (x + 1, y) | |
| } // $FiddleEnd |