Skip to content

Instantly share code, notes, and snippets.

@bfb
Created October 27, 2012 03:23
Show Gist options
  • Save bfb/3962827 to your computer and use it in GitHub Desktop.
Save bfb/3962827 to your computer and use it in GitHub Desktop.
package my.company.app
import net.scage.ScageScreenApp
import net.scage.ScageLib._
import net.scage.support.{State, Vec}
import com.weiglewilczek.slf4s.Logger
import net.scage.support.tracer3.{TraceTrait, ScageTracer}
object Snake extends ScageScreenApp("Snake") {
private val log = Logger(this.getClass.getName)
val homer_tracer = new ScageTracer[Homer](solid_edges = false) {
render {
for{
x <- 0 until N_x
y <- 0 until N_y
point = point_matrix(x)(y)
if point.size > 0
snake_part = point.head
} snake_part.render()
}
}
val beer_tracer = new ScageTracer[Beer](solid_edges = false) {
render {
for{
x <- 0 until N_x
y <- 0 until N_y
point = point_matrix(x)(y)
if point.size > 0
snake_part = point.head
} snake_part.render()
}
}
private var count = 0
interface {
print("TOTAL DRANK: " + count, 20, windowHeight-20, BLACK)
}
val LAND = image("land.png", 800, 600, 0, 0, 800, 600)
backgroundColor = WHITE
render(-10) {
drawDisplayList(LAND, windowCenter)
}
private var homer_dir = Vec(1, 0)
private var beer_dir = Vec(0, -1)
private var homer = homer_tracer.addTrace(Vec(homer_tracer.N_x/4, homer_tracer.N_y/6), new Homer)
private var beer = beer_tracer.addTrace(Vec(beer_tracer.N_x/2, beer_tracer.N_y/2), new Beer)
//key(KEY_UP, onKeyDown = dir = Vec(0,1))
//key(KEY_DOWN, onKeyDown = dir = Vec(0,-1))
key(KEY_RIGHT, onKeyDown = homer_dir = Vec(1,0))
key(KEY_LEFT, onKeyDown = homer_dir = Vec(-1,0))
val game_speed = property("game.speed", 100)
action(game_speed) {
// se o Homer achar uma cerveja, deve bebe-la
// beer_tracer.tracesInPoint(beer_tracer.outsidePoint(beer.location + beer_dir)).find(!_.isHomer) match {
// case Some(part_in_point) => {
// part_in_point.changeState(beer, new State("taken"))
// count += 1
// deployNewPart()
// }
// case _ =>
// }
if(beer_tracer.outsidePoint(beer.location + beer_dir) == homer_tracer.outsidePoint(homer.location + homer_dir)){
count += 1
//deployNewPart()
val random_point = beer_tracer.randomPoint()
if(beer_tracer.tracesInPoint(random_point).isEmpty) {
log.info("Drank beer!")
beer_tracer.updateLocation(beer, random_point)
//deleteSelf()
} else log.info("wrong place! Will choose another one on next turn")
}
//beer_tracer.tracesInPoint(beer_tracer.outsidePoint(beer.location + beer_dir))
// homer_tracer.tracesInPoint(homer_tracer.outsidePoint(homer.location + homer_dir)).find(!_.wasTaken) match {
// case Some(part_in_point) => {
// part_in_point.changeState(homer, new State("taken"))
// count += 1
// deployNewPart()
// }
// case _ =>
// }
//nextMove(head, head.location + dir)
beer_tracer.updateLocation(beer, beer.location + beer_dir)
homer_tracer.updateLocation(homer, homer.location + homer_dir)
}
// def nextMove(part:SnakePart, new_position:Vec) {
// if(tracer.tracesInPoint(tracer.outsidePoint(new_position)).isEmpty) {
// val previous_position = part.location.copy
// tracer.updateLocation(part, new_position)
// if(part.nextPart != null) nextMove(part.nextPart, previous_position)
// }
// }
def deployNewPart() {
action(game_speed) {
val random_point = beer_tracer.randomPoint()
if(beer_tracer.tracesInPoint(random_point).isEmpty) {
log.info("Drank beer!")
beer_tracer.updateLocation(beer, random_point)
deleteSelf()
} else log.info("wrong place! Will choose another one on next turn")
}
}
deployNewPart()
}
import Snake._
class Beer extends TraceTrait {
protected var was_taken = false
def wasDrank = was_taken
def state = new State()
type ChangerType = Beer
def changeState(changer:Beer, s:State) {
s.neededKeys {
case ("taken", true) =>
was_taken = true
changer.changeState(this, new State("drank"))
}
}
def render() {
drawFilledRectCentered(beer_tracer.pointCenter(location), beer_tracer.h_x, beer_tracer.h_y, GREEN)
}
}
class Homer extends TraceTrait {
protected var was_taken = false
def isHomer = was_taken
def state = new State()
type ChangerType = Homer
def changeState(changer:Homer, s:State) {
s.neededKeys {
case ("taken", true) =>
was_taken = true
changer.changeState(this, new State("drank"))
}
}
def render() {
drawFilledRectCentered(homer_tracer.pointCenter(location), homer_tracer.h_x, homer_tracer.h_y, RED)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment