我正在为一个嵌入式ARM微控制器编写一个pong游戏(该板是Keil MCBSTM32C,任何感兴趣的人都可以使用),目前我正在尝试实现一个人工智能。基本功能相当简单,因为我只是将player 2控制器的位置映射到球的位置。不过,这显然不太理想,因为我希望人工智能犯错误,这样玩家才能获胜。
所以,我试着在人工智能的动作中实现一个随机的错误量。然而,现在的人工智能拨片在屏幕周围“抖动”了很多,抖动量大于误差量。我想我理解为什么会发生这种情况(这是因为每次重新绘制桨时,随机难度偏移都会发生变化),但我不完全确定如何修复它。我试着让它朝球的方向移动,而不是直接映射到球上,但这似乎没有多大帮助。
划桨的代码是:

void draw_player2(enum pMode mode) {
    int adcValue;
    static int lastValue = 0;
    int direction;
    switch (mode)
  {
  default:
                break;
    case DUAL:
                adcValue = (ADC1->DR & 0x0FFF) >> 4;    /* AD value (8 bit) */
                if (lastValue != adcValue) {
                    thisGame.p2.y = (unsigned int) adcValue * (HEIGHT-BAR_H)/256;
                    LCDupdatePaddle(thisGame.p2);
                    lastValue = adcValue;
                }
                break;
    case AI:
                direction = thisGame.ball.y-lastValue;
                adcValue = thisGame.ball.y;     /* AD value (8 bit) */
                if (lastValue != adcValue) {
                    thisGame.p2.y = (lastValue + direction + selectDiffMod()) * (HEIGHT-BAR_H)/256;
                    LCDupdatePaddle(thisGame.p2);
                    lastValue = adcValue;
                }
                break;
    }
}

(高度=240,杆高=48,btw)
selectDiffMod()的代码是:
int selectDiffMod() {
    int r;
    if(thisGame.delay == T_SLOW) {
        r = rand() % 100;
    }
    if(thisGame.delay == T_MEDIUM) {
        r = rand() % 50;
    }
    if(thisGame.delay == T_FAST) {
        r = rand() % 20;
    }
    return r;
}

我目前的想法是减少生成难度修正/偏移的频率,但我不确定这是否能真正解决问题,我想知道是否有人有更好的解决方案?

最佳答案

我会给2号选手指定一个可以移动的速度。在较低的困难下,它会移动得较慢。根据需要,可以在此基础上添加较小的随机波动。它看起来像(未经测试,根据需要修改以适用于您的特定案例):

int get_new_value_ai (const int currentValue, const int ballY)
{
    int direction;
    int speed = 2;
    int newValue;

        //basic sign calc: -1, 0, 1
    direction = (currentValue < ballY) - (ballY < currentValue);

        //Adjust speeds as needed
    if (thisGame.delay == T_SLOW)
        speed = 1;
    else if (thisGame.delay == T_MEDIUM)
        speed = 2;
    else if (thisGame.delay == T_FAST)
        speed = 3;

    if (abs(currentValue - ballY) < speed) //Prevent overshooting
        newValue =  ballY;
    else
        newValue =  currentValue + direction * speed;

    newValue += (rand() % 3) - 2; //Random mod of -1, 0, +1

    return newValue;
}

并称之为:
thisGame.p2.y = get_new_value_ai(thisGame.p2.y, thisGame.ball.y);

除此之外,当桨叶改变方向时,你可以通过引入加速度/动量使它变得更加复杂。

关于c - 平滑C中乒乓球的运动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26641703/

10-11 17:17