Advertisement
Guest User

Untitled

a guest
Dec 7th, 2013
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. object Reddit142 {
  2.  
  3. sealed trait Material
  4. case object Rock extends Material { override def toString() = "#" }
  5. case object Sand extends Material { override def toString() = "." }
  6. case object Space extends Material { override def toString() = " " }
  7.  
  8. type Line = List[Material]
  9. val Elements = List(Rock, Space, Space, Space)
  10.  
  11. def main(args: Array[String]) {
  12. val grid = generateMap(10,10)
  13. val result = activateGravity(grid)
  14. println("Original Grid\n" + "="*20)
  15. grid map ( x => println(x mkString "" ))
  16. println("Resulting Grid\n" + "="*20)
  17. result map ( x => println(x mkString "" ))
  18.  
  19. }
  20.  
  21.  
  22. def generateMap(x: Int, y: Int): List[Line] = {
  23. @tailrec
  24. def generateMapR(x: Int, y: Int, lines: List[Line]): List[Line] = (x, y) match {
  25. case (_, 0) => List.fill(x)(Sand) :: lines
  26. case (x, y) => generateMapR(x, y-1, (Random.shuffle(Elements flatMap (m => List.fill(x){ m })) take x) :: lines)
  27. }
  28. generateMapR(x, y, List())
  29. }
  30.  
  31. def moveDown(above:Line, below: Line): (Line, Line) = {
  32. def moveDownR(above: Line, below: Line, result: Line): Line = (above, below) match {
  33. case(Nil, Nil) => result
  34. case(Sand :: aRest, Space :: bRest) => moveDownR(aRest, bRest, result :+ Sand)
  35. case(_ :: aRest, Rock :: bRest) => moveDownR(aRest, bRest, result :+ Rock)
  36. case(_ :: aRest, Space :: bRest) => moveDownR(aRest, bRest, result :+ Space)
  37. case(_,_) => throw new IllegalArgumentException
  38. }
  39. val newLine = moveDownR(above, below, List())
  40. val oldLine = above.zip(newLine) map {
  41. case(old,cur) =>
  42. if (old == Sand && cur == Rock) Sand
  43. else if (old == Sand && cur == Sand) Space
  44. else old
  45. }
  46. (oldLine, newLine)
  47. }
  48.  
  49. def activateGravity(grid: List[Line]) = {
  50. val height = grid.size
  51. val widht = grid.head.size
  52. def activateGravityR(grid: List[Line], level: Int, result: List[Line], temp: Line): List[Line] = level match {
  53. case(y) if(y < height-1)=>
  54. val (validLine, nextLine) = moveDown(temp, grid(y+1))
  55. activateGravityR(grid, y+1, result :+ validLine, nextLine)
  56. case _ => result :+ temp
  57. }
  58. activateGravityR(grid, 0, List(), grid.head)
  59. }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement