Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.85 KB | None | 0 0
  1. package snake
  2.  
  3. class Snake (
  4.   val initPos: Pos,
  5.   val initDir: Dir,
  6.   val headColor: java.awt.Color,
  7.   val tailColor: java.awt.Color,
  8.   val game: SnakeGame,
  9.   var points: Int = 0
  10. ) extends CanMove {
  11.   var dir: Dir = initDir
  12.  
  13.   val initBody: List[Pos] = List(initPos + initDir, initPos)
  14.  
  15.   val body: scala.collection.mutable.Buffer[Pos] = initBody.toBuffer
  16.  
  17.   val initTailSize: Int = 10 // välj själv vad som är lagom svårt
  18.  
  19.   var nbrOfSteps = 1
  20.   val growEvery = 100
  21.  
  22.  
  23.   def reset(): Unit = {   // återställ starttillstånd, ge rätt svanslängd
  24.     while (body.length > initBody.length) shrink()
  25.   }
  26.  
  27.   def grow(): Unit = body.prepend(body.head + dir)  // väx i rätt riktning med extra svansposition
  28.  
  29.   def shrink(): Unit = if (body.length > 2) body.remove(body.length - 1) // krymp svansen om kroppslängden är större än 2
  30.  
  31.   def isOccupyingBlockAt(p: Pos): Boolean = body contains p      // kolla om p finns i kroppen
  32.  
  33.   def isHeadCollision(other: Snake): Boolean = body.head == other.body.head
  34.   def isTailCollision(other: Snake): Boolean = other.body.tail.contains(body.head)
  35.  
  36.   def move(): Unit = {
  37.     grow()
  38.     shrink()
  39.  
  40.     if (nbrOfSteps % growEvery == 0) grow(); nbrOfSteps += 1
  41.  
  42.     game.entities.foreach{
  43.       ent => if (ent.isOccupyingBlockAt(body.head)) {
  44.         ent match {
  45.           case c: CanTeleport => grow(); points += 1; ent.reset()
  46.           case _ =>
  47.         }
  48.       }
  49.     }
  50.   }
  51.  
  52.    // väx och krymp enl. regler; action om äter frukt
  53.  
  54.   def draw(): Unit =
  55.     body.foreach(pos => if (pos == body.head) game.drawBlock(pos.x, pos.y, headColor) else game.drawBlock(pos.x, pos.y, tailColor))
  56.  
  57.   def erase(): Unit = game.eraseBlock(body.last.x, body.last.y)
  58.  
  59.   override def toString: String =  // bra vid println-debugging
  60.     body.map(p => (p.x, p.y)).mkString(">:)", "~", s" going $dir")
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement