Mercurial > repos > icfp2014
view code/ghost0.gq @ 76:47eb447a74cc
Don't chase ghosts we can't catch
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 28 Jul 2014 02:57:56 -0700 |
parents | 8a0f1447c034 |
children |
line wrap: on
line source
#{ up <- 0 right <- 1 down <- 2 left <- 3 getDirX <- :dir startX { if: dir = right { startX <- startX + 1 } else: { if: dir = left { startX <- startX - 1 } } startX } getDirY <- :dir startY { if: dir = up { startY <- startY - 1 } else: { if: dir = down { startY <- startY + 1 } } startY } opDir <- :dir { if: dir < 2 { dir <- dir + 2 } else: { dir <- dir - 2 } dir } goTowardsX:Y <- :targetX targetY { myIdx <- (me: ) myX <- ghostPos: myIdx myY <- yCoord myVit <- ghostStatus: myIdx myDir <- direction firstChoice <- 0 secondChoice <- 0 if: myX > targetX { //ghost is to the right of target if: myY > targetY { //ghost is below target if: (myX - targetX) > (myY - targetY) { //target is more left than up firstChoice <- left secondChoice <- up } else: { firstChoice <- up secondChoice <- left } } else: { //ghost is above or directly to the right of target if: (myX - targetX) > (targetY - myY) { //target is more left than down firstChoice <- left secondChoice <- down } else: { //target is more down than left firstChoice <- down secondChoice <- left } } } else: { //ghost is to the left of or directly above/below target if: myY > targetY { //ghost is below target if: (targetX - myX) > (myY - targetY) { //target is more right than up firstChoice <- right secondChoice <- up } else: { firstChoice <- up secondChoice <- right } } else: { //ghost is above or directly to the left of target if: (targetX - myX) > (targetY - myY) { //target is more right than down firstChoice <- right secondChoice <- down } else: { //target is more down than right firstChoice <- down secondChoice <- right } } } if: myVit = 1 { //currently in fright mode, try to run away firstChoice <- opDir: firstChoice secondChoice <- opDir: secondChoice } tmp <- 0 i <- 0 while: { i < 3} do: { targetX <- getDirX: firstChoice myX targetY <- getDirY: firstChoice myY if: (mapContentsAt: targetX targetY) - 1 > 4 { //first choice is a wall or ghost start pos tmp <- firstChoice firstChoice <- secondChoice secondChoice <- opDir: firstChoice i <- i + 1 } else: { if: firstChoice = (opDir: myDir) { //first choice is backwards tmp <- firstChoice firstChoice <- secondChoice secondChoice <- opDir: firstChoice i <- i + 1 } else: { i <- 3 } } } direction!: firstChoice 0 } //chases lambda man main <- { lambdamanPos: goTowardsX: xCoord Y: yCoord } }