2014-04-04 42 views
0

我需要使遊戲無法取勝,所以我使用此代碼來移動AI槳。乒乓遊戲 - AI槳搖搖欲墜

我的代碼起初可能有點難以理解,所以這裏有一個理論背後的原理:除非球比邊緣長度的一半更靠近邊緣,否則槳總是以中點擊球,然後槳停止以其一端接觸頂部或底部窗框移動。

if (ball.getY() < getHeight() - HEIGHT/2 
        && ball.getY() > HEIGHT/2) { 
       paddleRight.setLocation(getWidth() - 3 * WIDTH, ball.getY() 
         - HEIGHT/2); 
       image2.setLocation(getWidth() - 3 * WIDTH, ball.getY() - HEIGHT 
         /2); 
       image2.sendToFront(); 
      } else if (ball.getY() < HEIGHT/2) { 
       paddleRight.setLocation(getWidth() - 3 * WIDTH, 0); 
       image2.setLocation(getWidth() - 3 * WIDTH, 0); 
       image2.sendToFront(); 
      } else { 
       paddleRight.setLocation(getWidth() - 3 * WIDTH, getHeight() 
         - HEIGHT); 
       image2.setLocation(getWidth() - 3 * WIDTH, getHeight() - HEIGHT); 
       image2.sendToFront(); 
      } 

我的球也是遊戲中隨機加速:

boolean bool = rand.nextBoolean(); 
      if (bool) 
       if (dx > 0) 
        dx += 1; 
       else 
        dx -= 1; 
      else if (dy > 0) 
        dy += 0.5; 
       else 
        dy -= 0.5; 

球運動包括X和Y軸移動

而在一些特定的速度,如果槳獲取到的一個角落開始在頂部和底部角落之間來回閃爍。我在代碼中找不到原因。

Full code here

+1

偏離主題,但是'bool'是這個變量的可怕名稱;例如,像'moveX'這樣的東西會更清晰一些。 –

+0

'Ball.getY()'返回'int'嗎?你確定你的球位置報告正確嗎?如果'Ball.getY()'返回一個'float'或'double',你確定它永遠不會因爲其他地方的數學錯誤而意外地被設置爲Infinite/NaN? –

+0

@JasonC是啊,我知道這是不好的,但我只會用它一次。 'ball.getY()'返回'double'。我應該將其轉換爲「int」嗎? – Asalas77

回答

0

if說法並不正確處理球的位置正好在條件之間的邊界條件。您有:

if (ball.getY() < getHeight()-HEIGHT/2 && ball.getY() > HEIGHT/2) { 
    ... 
} else if (ball.getY() < HEIGHT/2) { 
    ... 
} else { 
    ... 
} 

但是ball.getY() == HEIGHT/2會發生什麼?在這種情況下,它會回落到第三塊,但這不是所需的行爲 - 當ball.getY() == HEIGHT/2時,它會短暫跳到第三個條件,因此當球的Y位置在該邊緣時閃爍。相反,請對第二個條件進行簡單更改:

if (ball.getY() < getHeight()-HEIGHT/2 && ball.getY() > HEIGHT/2) { 
    ... 
} else if (ball.getY() <= HEIGHT/2) { // note <= instead of < 
    ... 
} else { // ball.getY() >= getHeight()-HEIGHT/2 
    ... 
} 

這應該照顧過渡情況。


順便說一句,不相關的,你應該在嵌套if語句中使用大括號一樣,你有,如:

if (bool) { 
    if (dx > 0) 
     dx += 1; 
    else 
     dx -= 1; 
} else { 
    if (dy > 0) 
     dy += 0.5; 
    else 
     dy -= 0.5; 
} 

雖然原來的邏輯恰好在這種情況下同樣的效果,你的原代碼,儘管它有些誤導壓痕,竟然出現了這樣的結構:

if (bool) 
    ... 
else if (dy > 0) 
    ... 
else // !bool && dy <= 0 
    ... 

這可能並不反映的是0的實際意圖,即使碰巧在這裏工作,添加花括號也是一個好習慣,因爲它可以防止更復雜的代碼中潛在的細微邏輯錯誤。