Advertisement
Guest User

Untitled

a guest
Nov 14th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.45 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.   var players: Vector[Player] = Vector.empty
  10.  
  11.   sealed trait State
  12.   case object Starting extends State
  13.   case object Playing  extends State
  14.   case object GameOver extends State
  15.   case object Quitting extends State
  16.  
  17.   var state: State = Starting
  18.  
  19.   def enterStartingState(): Unit = {
  20.     pixelWindow.clear()
  21.     drawTextInMessageArea("Tryck space för start", 0, 0)
  22.     state = Starting
  23.   } // rensa, meddela "tryck space för start"
  24.  
  25.   def enterPlayingState(): Unit = {
  26.     pixelWindow.clear()
  27.     entities.foreach(e => e.draw())
  28.     state = Playing
  29.   } // rensa, rita alla entiteter
  30.  
  31.   def enterGameOverState(): Unit = {
  32.     drawCenteredText("Game Over!")
  33.     state = GameOver
  34.   } // meddela "game over"
  35.  
  36.   def enterQuittingState(): Unit = {
  37.     println("Goodbye!")
  38.     pixelWindow.hide()
  39.     state = Quitting
  40.   }
  41.  
  42.   def randomFreePos(): Pos = {
  43.  
  44.     var occupied = true
  45.     var randomPos: Pos = null
  46.  
  47.     while (occupied) {
  48.       randomPos = Pos.random(dim.asInstanceOf[Dim])
  49.       entities.foreach(e => if (!e.isOccupyingBlockAt(randomPos)) occupied = false )
  50.     }
  51.  
  52.     randomPos
  53.   } // dra slump-pos tills ledig plats, används av frukt
  54.  
  55.   override def onKeyDown(key: String): Unit = {
  56.     println(s"""key "$key" pressed""")
  57.     state match {
  58.       case Starting => if (key == " ") enterPlayingState()
  59.       case Playing => players.foreach(_.handleKey(key))
  60.       case GameOver =>
  61.         if (key == " ") enterPlayingState()
  62.         else if(key == "Escape") enterQuittingState()
  63.       case _ =>
  64.     }
  65.   }
  66.  
  67.   override def onClose(): Unit = enterQuittingState()
  68.  
  69.   def isGameOver(): Boolean  // abstrakt metod, implementeras i subklass
  70.  
  71.   override def gameLoopAction(): Unit = {
  72.     entities.foreach(e => {
  73.       e.erase()
  74.       e.update()
  75.       e.draw()
  76.     })
  77.     players.foreach(p => {
  78.       p.snake.move()
  79.       p.snake.draw()
  80.     })
  81.     // Vad jag tror gameLoopAction gör xD
  82.   }
  83.  
  84.   def startGameLoop(): Unit = {
  85.     pixelWindow.show()  // möjliggör omstart även om fönstret stängts...
  86.     enterStartingState()
  87.     gameLoop(stopWhen = state == Quitting)
  88.   }
  89.  
  90.   def play(playerNames: String*): Unit // abstrakt, implementeras i subklass
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement