# HG changeset patch # User Michael Pavone # Date 1406533319 25200 # Node ID 920f02a880fca8b4d9a516079c3593a39438b291 # Parent 5f44ac1bcbd6b90f82f1b3d32043497d2b62f519 Added interceptor ghost diff -r 5f44ac1bcbd6 -r 920f02a880fc code/ghost1.gq --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code/ghost1.gq Mon Jul 28 00:41:59 2014 -0700 @@ -0,0 +1,158 @@ +#{ + up <- 0 + right <- 1 + down <- 2 + left <- 3 + lastX <- 0 + lastY <- 0 + + 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 + } + + //tries to intercept lambda man by targeting a + //position two cells ahead of his current position + main <- { + lmX <- lambdamanPos: + lmY <- yCoord + diffX <- 0 + diffY <- 0 + + if: notFirst? = 1 { + diffX <- lmX - lastX + diffY <- lmY - lastY + } + lastX <- lmX + lastY <- lmY + + lmX <- (lmX + diffX) + diffX + lmY <- (lmY + diffY) + diffY + + goTowardsX: lmX Y: lmY + + } +} \ No newline at end of file