2012-11-15 77 views
0

好的,我剛寫完我的乒乓球遊戲,但現在我想要一個AI讓玩家對抗。 我試過這樣做,當NPC的位置超過Y的球位時,它會移動到正確的位置試圖阻擋球。 這裏是我的帕德爾類代碼:Ai /簡單的乒乓球遊戲的電腦播放器

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 


public class Padel implements KeyListener{ 
    private Ball ball = new Ball(); 
    private boolean LeftPlayerUp=false; 
    private boolean LeftPlayerDown=false; 
    private boolean RightPlayerUp=false; 
    private boolean RightPlayerDown=false; 
    public int RightLocation=200; 
    public int LeftLocation=200; 

    public void keyPressed(KeyEvent e){ 
     int KeyPressed = e.getKeyCode(); 

     if (KeyPressed== KeyEvent.VK_W){ 
      LeftPlayerUp=true; 
     } 
     else if (KeyPressed==KeyEvent.VK_S){ 
      LeftPlayerDown=true; 
     } 
    } 
    public void keyReleased(KeyEvent e){ 
     int KeyReleased = e.getKeyCode(); 

     if (KeyReleased== KeyEvent.VK_W){ 
      LeftPlayerUp=false; 
     } 
     else if (KeyReleased==KeyEvent.VK_S){ 
      LeftPlayerDown=false; 
     } 
    } 
    public void ShouldLeftMove(){ 
     if(LeftPlayerUp==true){ 
      if(LeftLocation==50){} 
      else{ 
       LeftLocation-=2; 
      } 
     } 
     else if(LeftPlayerDown==true){ 
      if(LeftLocation==Main.Height-190){} 
      else{ 
      LeftLocation+=2; 
      } 
     } 
    } 
    public void ShouldRightMove(){ 
     if(ball.BallLocationY>=RightLocation){ 
      RightPlayerUp=false; 
      RightPlayerDown=true; 
     }else{ 
      RightPlayerUp=true; 
      RightPlayerDown=false; 
     } 
     if(RightPlayerUp==true){ 
      if(RightLocation==50){} 
      else{ 
      RightLocation-=2; 
      } 
     } 
     else if(RightPlayerDown==true){ 
      if(RightLocation==Main.Height-190){} 
      else{ 
      RightLocation+=2; 
      } 
     } 
    } 
    //This just needs to be here :P 
    public void keyTyped(KeyEvent e) {} 
} 

這段代碼的帕德爾去約2 /三分之二倒在屏幕右側,然後就停止移動,怪人的了。 我在做什麼錯?

+0

您確定您正確計算了槳的大小並正確地抵消了嗎? – yoozer8

+0

我認爲尺寸我相信,除非我想它的方式工作不正確。沒有人會有答案嗎? – Poo2thegeek

回答

0

我還沒有發現確切的問題,只有一小段代碼,我無法運行並看到問題,但我確實有一些建議。

首先,無論你檢查限制,你檢查確切的條件。如果該位置以某種方式被設置爲奇數值,或者以某種方式跳過限制,那麼您的限制代碼將無法處理它。我建議,而不是

if(LeftPlayerUp==true){ 
     if(LeftLocation==50){} 
     else{ 
      LeftLocation-=2; 
     } 
    } 

你應該使用

if (LeftPlayerUp) { 
     if (LeftLocation <= 50) { 
      LeftLocation = 50; 
     } 
     else { 
      LeftLocation-=2; 
     } 
    } 

這樣,如果LeftLocation曾經得到了重擊出瘋狂的價值,它只會被糾正。在您檢查限制的任何地方使用此模式。

我的另一點建議是,你的電腦播放器算法非常簡單。它沒有考慮球的移動方向。如果球在右邊的槳上方,但是向下移動,也許右邊的槳不應該移動......現在,你不希望電腦播放器一直播放得很好,因爲這對於只能失敗的人類;但你應該從一個完美的電腦玩家開始。要做到這一點的最好方法是計算球將穿過右槳的線。你的遊戲知道球的當前位置,以及它的正確速度和上/下速度,所以你的比賽可以預測球的走向;你甚至可以模擬球的整個運動軌跡,包括彈跳,並準確計算出球的去向。然後讓電腦播放器向該位置移動槳。一旦你有完美的電腦AI工作,然後添加隨機錯誤,或簡化它(如拿出處理反彈的代碼;也許擊敗AI的方式總是將球從牆上反彈!)。

祝你好運,玩得開心。