Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package snake
- import introprog.BlockGame
- abstract class SnakeGame(title: String) extends BlockGame(
- title, dim = (50, 30), blockSize = 15, background = Colors.Background,
- framesPerSecond = 50, messageAreaHeight = 3
- ) {
- var entities: Vector[Entity] = Vector.empty
- var players: Vector[Player] = Vector.empty
- sealed trait State
- case object Starting extends State
- case object Playing extends State
- case object GameOver extends State
- case object Quitting extends State
- var state: State = Starting
- def enterStartingState(): Unit = {
- println("Tryck SPACE för start")
- clearWindow()
- state = Starting
- } // rensa, meddela "tryck space för start"
- def enterPlayingState(): Unit = {
- clearWindow()
- entities.foreach(_.draw())
- state = Playing
- } // rensa, rita alla entiteter
- def enterGameOverState(): Unit = {
- println("Game Over!")
- state = GameOver
- } // meddela "game over"
- def enterQuittingState(): Unit = {
- println("Goodbye!")
- pixelWindow.hide()
- state = Quitting
- }
- def randomFreePos(): Pos = {
- var pos: Pos = Pos.random(Dim(dim))
- while(entities.count(_.isOccupyingBlockAt(pos)) > 0
- || players.count(_.snake.isOccupyingBlockAt(pos)) > 0) pos = Pos.random(Dim(dim))
- pos
- } // dra slump-pos tills ledig plats, används av frukt
- override def onKeyDown(key: String): Unit = {
- println(s"""key "$key" pressed""")
- state match {
- case Starting => if (key == " ") enterPlayingState()
- case Playing => players.foreach(_.handleKey(key))
- case GameOver =>
- if (key == " ") enterPlayingState()
- else if(key == "Escape") enterQuittingState()
- case _ =>
- }
- }
- override def onClose(): Unit = enterQuittingState()
- def isGameOver(): Boolean // abstrakt metod, implementeras i subklass
- override def gameLoopAction(): Unit = {
- clearWindow()
- for(entity <- entities) {
- if(state == Playing) entity.update()
- entity.draw()
- }
- for(snake <- players.map(_.snake)) {
- snake.draw()
- if(state == Playing) {
- snake.update()
- for (other <- players.map(_.snake)) {
- if (snake != other) {
- if(snake.isTailCollision(other)) {
- snake.erase()
- } else if(snake.isHeadCollision(other)) {
- snake.erase()
- other.erase()
- }
- } else if (snake.isTailCollision(other)) snake.erase()
- }
- }
- }
- if(state == Playing && isGameOver()) enterGameOverState()
- }
- def startGameLoop(): Unit = {
- pixelWindow.show() // möjliggör omstart även om fönstret stängts...
- enterStartingState()
- gameLoop(stopWhen = state == Quitting)
- }
- def play(playerNames: String*): Unit // abstrakt, implementeras i subklass
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement