Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. package snake
  2. import introprog.BlockGame
  3.  
  4. abstract class SnakeGame(title: String) extends BlockGame(
  5. title, dim = (50, 30), blockSize = 15, background = Colors.Background,
  6. framesPerSecond = 50, messageAreaHeight = 3
  7. ) {
  8. var entities: Vector[Entity] = Vector.empty
  9.  
  10. var players: Vector[Player] = Vector.empty
  11.  
  12. sealed trait State
  13. case object Starting extends State
  14. case object Playing extends State
  15. case object GameOver extends State
  16. case object Quitting extends State
  17.  
  18. var state: State = Starting
  19.  
  20. def enterStartingState(): Unit = {
  21. println("Tryck SPACE för start")
  22. clearWindow()
  23. state = Starting
  24. } // rensa, meddela "tryck space för start"
  25.  
  26. def enterPlayingState(): Unit = {
  27. clearWindow()
  28. entities.foreach(_.draw())
  29. state = Playing
  30. } // rensa, rita alla entiteter
  31.  
  32. def enterGameOverState(): Unit = {
  33. println("Game Over!")
  34. state = GameOver
  35. } // meddela "game over"
  36.  
  37. def enterQuittingState(): Unit = {
  38. println("Goodbye!")
  39. pixelWindow.hide()
  40. state = Quitting
  41. }
  42.  
  43. def randomFreePos(): Pos = {
  44. var pos: Pos = Pos.random(Dim(dim))
  45.  
  46. while(entities.count(_.isOccupyingBlockAt(pos)) > 0
  47. || players.count(_.snake.isOccupyingBlockAt(pos)) > 0) pos = Pos.random(Dim(dim))
  48. pos
  49. } // dra slump-pos tills ledig plats, används av frukt
  50.  
  51. override def onKeyDown(key: String): Unit = {
  52. println(s"""key "$key" pressed""")
  53. state match {
  54. case Starting => if (key == " ") enterPlayingState()
  55. case Playing => players.foreach(_.handleKey(key))
  56. case GameOver =>
  57. if (key == " ") enterPlayingState()
  58. else if(key == "Escape") enterQuittingState()
  59. case _ =>
  60. }
  61. }
  62.  
  63. override def onClose(): Unit = enterQuittingState()
  64.  
  65. def isGameOver(): Boolean // abstrakt metod, implementeras i subklass
  66.  
  67. override def gameLoopAction(): Unit = {
  68. clearWindow()
  69.  
  70. for(entity <- entities) {
  71. if(state == Playing) entity.update()
  72. entity.draw()
  73. }
  74.  
  75. for(snake <- players.map(_.snake)) {
  76. snake.draw()
  77.  
  78. if(state == Playing) {
  79. snake.update()
  80.  
  81. for (other <- players.map(_.snake)) {
  82. if (snake != other) {
  83. if(snake.isTailCollision(other)) {
  84. snake.erase()
  85. } else if(snake.isHeadCollision(other)) {
  86. snake.erase()
  87. other.erase()
  88. }
  89. } else if (snake.isTailCollision(other)) snake.erase()
  90. }
  91. }
  92. }
  93.  
  94. if(state == Playing && isGameOver()) enterGameOverState()
  95. }
  96.  
  97. def startGameLoop(): Unit = {
  98. pixelWindow.show() // möjliggör omstart även om fönstret stängts...
  99. enterStartingState()
  100. gameLoop(stopWhen = state == Quitting)
  101. }
  102.  
  103. def play(playerNames: String*): Unit // abstrakt, implementeras i subklass
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement