Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package snake
- class Snake (
- val initPos: Pos,
- val initDir: Dir,
- val headColor: java.awt.Color,
- val tailColor: java.awt.Color,
- val game: SnakeGame,
- var points: Int = 0
- ) extends CanMove {
- var dir: Dir = initDir
- val initBody: List[Pos] = List(initPos + initDir, initPos)
- val body: scala.collection.mutable.Buffer[Pos] = initBody.toBuffer
- val initTailSize: Int = 10 // välj själv vad som är lagom svårt
- var nbrOfSteps = 1
- val growEvery = 100
- def reset(): Unit = { // återställ starttillstånd, ge rätt svanslängd
- while (body.length > initBody.length) shrink()
- }
- def grow(): Unit = body.prepend(body.head + dir) // väx i rätt riktning med extra svansposition
- def shrink(): Unit = if (body.length > 2) body.remove(body.length - 1) // krymp svansen om kroppslängden är större än 2
- def isOccupyingBlockAt(p: Pos): Boolean = body contains p // kolla om p finns i kroppen
- def isHeadCollision(other: Snake): Boolean = body.head == other.body.head
- def isTailCollision(other: Snake): Boolean = other.body.tail.contains(body.head)
- def move(): Unit = {
- grow()
- shrink()
- if (nbrOfSteps % growEvery == 0) grow(); nbrOfSteps += 1
- game.entities.foreach{
- ent => if (ent.isOccupyingBlockAt(body.head)) {
- ent match {
- case c: CanTeleport => grow(); points += 1; ent.reset()
- case _ =>
- }
- }
- }
- }
- // väx och krymp enl. regler; action om äter frukt
- def draw(): Unit =
- body.foreach(pos => if (pos == body.head) game.drawBlock(pos.x, pos.y, headColor) else game.drawBlock(pos.x, pos.y, tailColor))
- def erase(): Unit = game.eraseBlock(body.last.x, body.last.y)
- override def toString: String = // bra vid println-debugging
- body.map(p => (p.x, p.y)).mkString(">:)", "~", s" going $dir")
- }
Advertisement
Add Comment
Please, Sign In to add comment