2012-02-03 2 views
0

Я пытаюсь создать ИИ для игры в понг, но контролируемая ИИ лопатка сильно задирается, когда она пытается ударить по мячу.Почему мой панг AI сильно дрожит?

Вот раздел AI моего кода:

function calculateAI() { 
if (paddleA.AI) { 
    if (ball.x + (ball.width/2) <= ctx.canvas.width * 0.4 && ball.directionX == -1) { 
     if (ball.y + (ball.height/2) >= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.75) && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) { 
      paddleA.y += paddleA.speed + paddleA.speedModifier; 
     } 
     else if (ball.y + (ball.height/2) <= paddleA.y + (paddleA.height + paddleA.heightModifier * 0.25) && paddleA.y > 0) { 
      paddleA.y -= paddleA.speed + paddleA.speedModifier; 
     } 
    } 
    else { 
     if (paddleA.y + ((paddleA.height + paddleA.heightModifier)/2) <= (ctx.canvas.height/2) - 50 && paddleA.y + paddleA.height + paddleA.heightModifier < ctx.canvas.height) { 
      paddleA.y += paddleA.speed + paddleA.speedModifier; 
     } 
     else if (paddleA.y + ((paddleA.height + paddleA.heightModifier)/2) >= (ctx.canvas.height/2) + 50 && paddleA.y > 0) { 
      paddleA.y -= paddleA.speed + paddleA.speedModifier; 
     } 
    } 
} 
} 

Вы можете найти .zip полного кода здесь: http://dl.dropbox.com/u/23225581/Pong.zip

Мой вопрос, как я мог бы реструктурировать это так ИИ не дрожит так много? Если у кого-то есть другие предложения для ИИ вообще, я бы хотел их услышать.

+0

Посмотрите на псевдо двойной буферизации в HTML5. http://stackoverflow.com/questions/2795269/does-html5-canvas-support-double-buffering – xbonez

+1

@xbonez Это не имеет значения, почему ИИ дрожит. Я знаю, что это связано с быстрым движением весла, а не с мерцанием холста, когда оно появляется. –

ответ

3

Я предполагаю, что вы хотите, чтобы ИИ преследовал мяч более плавно. Вот некоторые предложения:

медленно двигаться, когда лопасть находится рядом с мячом

Say скорость ИИ равно 8. Если мяч движется со скоростью 2, лопатка не должен прыгать вниз 8, затем прыгайте обратно. Вместо этого установите положение y равным мячу.

сделать весло только гоняют мяч, когда это действительно необходимо

Вы, возможно, уже реализованы в этом, и я просто не заметил. В принципе, если мяч попадет на край весла, не беспокойтесь о движении.

Я пересмотрел ваш код немного, чтобы сделать эти вещи:

function calculateAI() { 
if (paddleA.AI) { 

    //ball's x position 
    var bx = ball.x + (ball.width/2); 

    //Get half he paddle's height and its y position 
    var hD2 = (paddleA.height + paddleA.heightModifier)/2; 
    var py = paddleA.y; 

    //speed 
    var speed = paddleA.speed + paddleA.speedModifier; 

    //by is either the center of the screen or the ball's y position, 
    //depending on what the paddle wants to do. 
    var by = ctx.canvas.height/2; 
    if (bx <= ctx.canvas.width * 0.4 && ball.directionX == -1) { 
     by = ball.y + (ball.height/2) - hD2; 
    } 

    //Attempt to move toward 'by' (if I 'have' to) 
    if (by > py+hD2) { 

     //Jump to position if close enough 
     //(Commented out to retain speed) 
     /* 
     if(by - speed < py) 
      py = by; 
     else 
     */ 
      py += speed; 

    } 
    else if (by < py-hD2) { 

     //Jump to position if close enough 
     //(Commented out to retain speed) 
     /* 
     if(by + speed > py) 
      py = by; 
     else 
     */ 
      py -= speed; 
    } 

    //Border range check goes here 


    paddleA.y = py; 
} 
} 

Это неполный, но все должно работать.

Для более вони идей искусственного интеллекта, вы можете проверить источник моей понг игры: http://jsweeneydev.net84.net/apps.php

http://jsweeneydev.net84.net/apps/pong/game/script.js

+0

Это похоже на то, что я хотел! Я приму ответ, как только немного проведу код. –

+1

Дайте мне знать, если есть какие-либо проблемы (здесь возможны два варианта: весло не будет идти прямо к середине, и оно может пересекать верхние/нижние границы). Код - это просто пример, и поскольку у нас разные стили кодирования, вы можете перепрограммировать его по своему вкусу;) –

+0

Это работает отлично, но у меня есть 2 запроса на дополнения к нему. 1. Сделайте весло возможным для этого без изменения скорости, так как в игре есть бонусы, которые изменяют скорость весла; и имеет смысл, что ИИ не сможет нормально замедляться, так как игрок не может. 2. Заставьте ИИ попытаться получить бонусы в качестве второго приоритета (если мяч не находится в диапазоне весла, 40% холста). Есть ли у вас идеи о том, что я могу сделать для достижения этих целей? –

Смежные вопросы