将速度应用于无与伦比的AI Paddle以进行简单的Pong游戏

时间:2017-05-05 00:06:31

标签: java android artificial-intelligence 2d-games pong

我在Android Studio上为大学课程创建了一个简单的经典Pong游戏。在这一点上,几乎所有东西都准备好了,除了我为敌人的桨创造了一个无与伦比的AI。我使用默认的RectF课程创建了拨片和球,并根据球的当前位置更改了我的AI球拍位置(由于我的拨片长度,我减去/加上65)是130像素,它与球的中心相比,球。这基本上允许敌人的桨以无限的速度移动,因为它匹配球的速度/位置(球的速度随着每个新的水平而增加)。这是方法:

public void AI(Paddle paddle) {
    RectF paddleRect = paddle.getRect();
    RectF ballRect = ball.getRect();
    if (ballRect.left >= 65  && ballRect.right <= screenX - 65) {
        paddleRect.left = (ballRect.left - 65);
        paddleRect.right = (ballRect.right + 65);
    }
    if (ballRect.left < 65) {
        paddleRect.left = 0;
        paddleRect.right = 130;
    }
    if (ballRect.right > screenX - 65) {
        paddleRect.left = screenX - 130;
        paddleRect.right = screenX;
    }
}

供参考,以下是我Paddle课程的相关部分:

public Paddle(float screenX, float screenY, float xPos, float yPos, int defaultSpeed){
    length = 130;
    height = 30;
    paddleSpeed = defaultSpeed;
    // Start paddle in the center of the screen
    x = (screenX / 2) - 65;
    xBound = screenX;
    // Create the rectangle
    rect = new RectF(x, yPos, x + length, yPos + height);
}

// Set the movement of the paddle if it is going left, right or nowhere
public void setMovementState(int state) {
    paddleMoving = state;
}

// Updates paddles' position
public void update(long fps){
    if(x > 0 && paddleMoving == LEFT){
        x = x - (paddleSpeed / fps);
    }
    if(x < (xBound - 130) && paddleMoving == RIGHT){
        x = x + (paddleSpeed / fps);
    }
    rect.left = x;
    rect.right = x + length;
}

上述fps方法中的update(long fps)是通过run()类中的View方法传递的:

public void run() {
    while (playing) {
        // Capture the current time in milliseconds
        startTime = System.currentTimeMillis();
        // Update & draw the frame
        if (!paused) {
            onUpdate();
        }
        draw();
        // Calculate the fps this frame
        thisTime = System.currentTimeMillis() - startTime;
        if (thisTime >= 1) {
            fps = 1000 / thisTime;
        }
    }
}

我的拨片和球在onUpdate()课程的View方法中不断更新。

public void onUpdate() {
    // Update objects' positions
    paddle1.update(fps);
    ball.update(fps);
    AI(paddle2);
}

如何使用我为每个新球拍定义的球拍速度将速度限制附加到AI球拍?我已经尝试修改AI(Paddle paddle)方法以合并+/- (paddleSpeed / fps),但它似乎根本不会影响划桨。也许我只是错误地实施了它,但任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

为了让AI以稳定的速度移动球拍而不是跳到正确的位置,只需尝试将球拍线的中间部分放在球的中间位置:

public void AI(Paddle paddle) {
    RectF paddleRect = paddle.getRect();
    RectF ballRect = ball.getRect();
    float ballCenter = (ballRect.left + ballRect.right) / 2;
    float paddleCenter = (paddleRect.left + paddleRect.right) / 2;
    if (ballCenter < paddleCenter) {
        setMovementState(LEFT);
    }
    else {
        setMovementState(RIGHT);
    }
}

然后在AI(paddle2)内拨打onUpdate后,请致电paddle2.update(fps)。这样您就不会重复绘图代码。你会注意到,如果球比桨快得多,那么AI桨可能不会完美。在这种情况下,你可以使用数学来预测球的最终位置并努力到达那里。