2012-02-03 143 views
0

我想爲我的pong遊戲製作一個AI,但是AI控制的槳在試圖擊中球時抖動了很多。爲什麼我的乒乓球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

我的問題是我怎麼能重組這讓AI不會抖動那麼多?如果任何人對AI總體上有其他建議,我很樂意聽到他們。

+0

看一看在HTML5僞雙緩衝。 http://stackoverflow.com/questions/2795269/does-html5-canvas-support-double-buffering – xbonez 2012-02-03 17:55:41

+1

@xbonez這與AI爲什麼不穩定無關。我知道這與槳快速移動有關,而不是畫布在呈現時閃爍。 – 2012-02-03 18:04:35

回答

3

我假設你想讓AI更順利的追球。下面是一些建議:

緩緩移動時,槳葉球附近

說AI的速度是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; 
} 
} 

這是不完整的,但一切都應該工作。

更多的乒乓球AI的想法,你可以檢查出源到我的乒乓球比賽: http://jsweeneydev.net84.net/apps.php

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

+0

這看起來正是我想要的!一旦我測試了一下代碼,我會接受答案。 – 2012-02-03 19:40:42

+1

讓我知道是否有任何問題(這裏有兩個可能的問題:槳不會直接到中間,它可以通過頂部/底部邊界)。代碼實際上只是一個例子,並且由於我們有不同的編碼風格,您可能需要重新編程以適應您的喜好;) – 2012-02-03 19:45:02

+0

這很好,但我有2個添加要求。 1.讓槳可以在不改變速度的情況下做到這一點,因爲遊戲中有通電改變槳的速度; AI是不會正常減速的,因爲玩家不能。 2.讓人工智能嘗試將通電作爲第二優先級(如果球不在槳的範圍內,則爲畫布的40%)。你有什麼想法可以做些什麼來實現這些目標? – 2012-02-03 21:52:19