Случайный Pac-Man Ghost AI с использованием 2d массива
Я использовал 2d-массив для лабиринта игрового клона Pac-Man на Java. Я знаю, что призраки в Pac-Man не движутся случайным образом, но как бы я сделал так, чтобы призраки перемещались в лабиринте случайным образом? Ниже то, что я пытался.
private void randomGhostMovement() {
// Get the tileX for the 2d array data map.
int tileX = (int) (this.ghosts.get(0).getCenterX() / Wall.SIZE);
// Get the tileY for the 2d array data map.
int tileY = (int) (this.ghosts.get(0).getCenterY() / Wall.SIZE);
// Get the left corner x position of the ghost.
double ghostX = this.ghosts.get(0).getCenterX();
// Get the tile X coordinates where the ghost is at.
double tileXCoord = tileX * Wall.SIZE;
// Get the left corner y position of the ghost.
double ghostY = this.ghosts.get(0).getCenterY();
// Get the tile Y coordinates where the ghost is at.
double tileYCoord = tileY * Wall.SIZE;
// Create a dice to roll [0,3].
int randomMovement = (int) (Math.random() * 4);
// Create a flag to check if the ghost is able to move left, right, up, or down.
boolean moveLeft = false, moveRight= false, moveUp = false, moveDown = false;
// Check for possible movements and not in the reverse.
if(!this.ghosts.get(0).isMoveRightFlag() && (this.dataMap[tileY][tileX - 1] == 1 || this.dataMap[tileY][tileX - 1] == -1) && ((tileXCoord/ghostX) >= 0.4 && (ghostX/tileXCoord) <= 1.13) && ((tileYCoord/ghostY) >= 0.4 && (ghostY/tileYCoord) <= 1.13)) {
moveLeft = true;
}
if(!this.ghosts.get(0).isMoveLeftFlag() && (this.dataMap[tileY][tileX + 1] == 1 || this.dataMap[tileY][tileX + 1] == -1) && ((tileXCoord/ghostX) >= 0.4 && (ghostX/tileXCoord) <= 1.13) && ((tileYCoord/ghostY) >= 0.4 && (ghostY/tileYCoord) <= 1.13)) {
moveRight = true;
}
if(!this.ghosts.get(0).isMoveDownFlag() && (this.dataMap[tileY - 1][tileX] == 1 || this.dataMap[tileY - 1][tileX] == -1 ||
this.dataMap[tileY - 1][tileX] == 15) && ((tileXCoord/ghostX) >= 0.4 && (ghostX/tileXCoord) <= 1.13) && ((tileYCoord/ghostY) >= 0.4 && (ghostY/tileYCoord) <= 1.13)) {
moveUp = true;
}
if(!this.ghosts.get(0).isMoveUpFlag() && (this.dataMap[tileY + 1][tileX] == 1 || this.dataMap[tileY + 1][tileX] == -1) && ((tileXCoord/ghostX) >= 0.4 && (ghostX/tileXCoord) <= 1.13) && ((tileYCoord/ghostY) >= 0.4 && (ghostY/tileYCoord) <= 1.13)) {
moveDown = true;
}
// Roll the dice, and if the ghost is able to move in the direction then move.
if(moveLeft && randomMovement == 0) {
this.ghosts.get(0).moveLeft();
}
if(moveRight && randomMovement == 1) {
this.ghosts.get(0).moveRight();
}
if(moveUp && randomMovement == 2) {
this.ghosts.get(0).moveUp();
}
if(moveDown && randomMovement == 3) {
this.ghosts.get(0).moveDown();
}
}
2 ответа
Вы можете получить направление Ranom, когда проверите доступные направления (в этих направлениях нет стены), а затем выберите направление со случайным числом
//Anywhere in the Movementcontroller declared
const int UP = 0;
const int DOWN = 1;
const int RIGHT = 2;
const int LEFT = 3;
....
//the moveroutine
int directions[] = checkAvailabelDirections(currentPosition);
randomDirection = directions [(int) (Math.random() * directions.length)]
move(randomDirection)
Зависит от того, как вы хотите, чтобы они двигались. Я предполагаю, что вы хотите, чтобы они пошли по пути, пока он не разветвляется, а затем выбрали новый путь?
Я предполагаю, что каждый призрак - это объект (в противном случае вам придется хранить информацию о каждом призраке другим способом). Поэтому оставьте поле, чтобы указать, в каком направлении они только что сместились (чтобы запретить движение назад таким же образом (если нет другого пути)), возможно, используйте enum, но также можно использовать число.
Для каждого "раунда", проверьте, где он может идти (вверх, вниз, влево, вправо).
Если доступен только 1, следуйте по этому пути.
Если доступны 2 варианта, перейдите в противоположность тому, откуда вы пришли (исключите тот, откуда вы пришли).
Если доступно 3 или 4, сверните () между теми, из которых вы не пришли.
(Не забудьте установить направление, в котором вы двинулись, чтобы вы знали в следующем раунде, чтобы int отображал какое-то направление в коде, или использовал перечисления (или даже объекты, которые перемещают ваш объект в правильном направлении при вызове чего-то вроде direction.move(ghostObject)
).
public int roll(int possiblePaths) {
Random random = new Random();
int d = random.nextInt(possiblePaths);
return d;
}
Если вы добавили часть кода, который вы уже написали, было бы легче привести более конкретные примеры