使用2d阵列的随机吃豆人鬼AI

时间:2016-12-21 08:45:54

标签: java pacman

我在Java中使用2d数组作为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 个答案:

答案 0 :(得分:0)

当你检查可用的方向时(这些方向没有墙),你可以得到一个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)

答案 1 :(得分:0)

取决于您希望他们如何移动。我假设你希望他们遵循一条路径,直到它分支然后选择一条新路径?

每个幽灵都是我假设的对象(否则你必须以其他方式存储关于每个幽灵的信息)。因此,请保留一个字段以指示它们刚从哪个方向移动(以禁止以相同的方式向后移动(除非没有其他路径可用)),可能使用枚举,但也可以使用数字。

对于每个&#34;回合&#34;,检查它可能去的地方(上,下,左,右)。

如果只有1,那就这样。

如果有2个选项可用,请选择与您相关的选项(排除您来自的地方)。

如果有3个或4个可用,则在你未来的那些之间滚动()。

(请记住设置你移动的方向,以便在下一轮中知道,通过代码将int映射到某个方向,或者使用枚举(甚至是在调用某些东西时将对象移动到正确方向的对象)比如direction.move(ghostObject))。

public int roll(int possiblePaths) {
   Random random = new Random();
   int d = random.nextInt(possiblePaths);
   return d;
}

如果您添加了一些您已经编写的代码,那么提供更具体的示例会更容易