public override int getTargetJ() { if (Form1.manhattanDistance(Form1.pacman.I, Form1.pacman.J, i, j) > 8) { return(Form1.pacman.J); } else { return(-100); } }
// Voće se smije pojaviti na kvadratima na kojima nije // zid i neko drugo voće. public bool viableLocation(int i, int j) { bool noWall = Form1.grid.getSquareValue(i, j) != '#'; bool noStrawberry = Form1.strawberry.i != i || Form1.strawberry.j != j; bool noRottenStrawberry = Form1.rottenStrawberry.i != i || Form1.rottenStrawberry.j != j; bool noPear = Form1.pear.i != i || Form1.pear.j != j; bool noRottenPear = Form1.rottenPear.i != i || Form1.rottenPear.j != j; bool noCherry = Form1.cherry.i != i || Form1.cherry.j != j; bool noRottenCherry = Form1.rottenCherry.i != i || Form1.rottenCherry.j != j; bool noGoldenApple = Form1.goldenApple.i != i || Form1.goldenApple.j != j; // Pacman mora biti udaljen od voća. bool pacmanFarAway = Form1.manhattanDistance(Form1.pacman.I, Form1.pacman.J, i, j) > 8; return(noWall && noGoldenApple && noStrawberry && noRottenStrawberry && noPear && noRottenPear && noCherry && noRottenCherry && pacmanFarAway); }
public override void moveCharacter() { // Ako duh i dalje čeka u kući. if (waitElapsed < waitTreshold) { // Timer se ne povećava ako traje super kolačić. // if (s == State.Chase) waitElapsed += 1; // Duh uvjek pokušava izaći. waitElapsed += 1; } // Ako je duh u procesu izlaženja iz kuće. else if (exitingBox < 3) { currentDirection = Direction.Up; exitingBox += 1; i -= 1; // Svi duhovi se penju gore da bi izašli iz kuće. loadStandardImage(); } // Ako je duh na portalu. // Lijevi portal se nalazi na indeksu [16, 0], a desni na [16, 27]. // Isto kao i u movableCharacter klasi. else if (i == 16 && j == 0 && currentDirection == Direction.Left) { j = 27; } else if (i == 16 && j == 27 && currentDirection == Direction.Right) { j = 0; } else // Ako duh nalazi na normalnom dijelu ploče. { int ti, tj; if (s == State.Chase) { ti = getTargetI(); tj = getTargetJ(); } else // U ovom slučaju duhovi se random ponašaju. { ti = rand.Next(2) * 200 - 100; // -100 ili 100 tj = rand.Next(2) * 200 - 100; // -100 ili 100 } Direction bestDir = Direction.None; int bestDist = 1000000; // "Beskonačnost". foreach (Direction newDir in orderedDirections) { // Duhovi se ne smiju okretati. if (newDir == oppositeDirection(currentDirection)) { continue; } if (!movePossible(newDir)) { continue; } int ni = i, nj = j; switch (newDir) { case Direction.Left: nj -= 1; break; case Direction.Right: nj += 1; break; case Direction.Up: ni -= 1; break; case Direction.Down: ni += 1; break; } // Euklidska udaljenost. int newDist = Form1.manhattanDistance(ti, tj, ni, nj); if (newDist < bestDist) { bestDist = newDist; bestDir = newDir; } } currentDirection = bestDir; switch (bestDir) { case Direction.Left: j -= 1; break; case Direction.Right: j += 1; break; case Direction.Up: i -= 1; break; case Direction.Down: i += 1; break; } loadStandardImage(); } // Ako je duh ušao, tj. izašao iz tunela od portala. // Duhovi se miču duplo sporije u portalu. if (i == 16 && (j == 5 || j == 22)) { enterTunnel(); } else if (i == 16 && (j == 6 || j == 21)) { exitTunnel(); } }