2013-07-16 22 views
1

因此,我的AI乒乓球槳有問題。現在,AI非常簡單而愚蠢。它所做的只是以連續的速度上下移動。我不想完善這個項目,因爲它只是向我介紹LWJGL,所以我絕不會爲這個系統創建一個直觀的AI。但是,我遇到槳的AI問題。當遊戲開始時,槳從中間開始直線上升,直至撞上天花板。它碰到天花板,然後停下來,而不是下去,直到它可以重複運動。我想知道爲什麼槳停止而不是繼續,並遵循它的意思 - 要槳。在Java中移動AI pong槳的問題LWJGL/OpenGL

啓動類:(這個類是爲啓動顯示和渲染,包括槳)

import org.lwjgl.LWJGLException; 
import org.lwjgl.input.Keyboard; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 
import org.lwjgl.opengl.GL11; 

import com.evanklein.pong.entitity.CPUPlayer; 
import com.evanklein.pong.entitity.Player; 
import com.evanklein.pong.entitity.Ball; 

public class Startup { 

    // set up display 
    public void start() { 
     try { 
      Display.setDisplayMode(new DisplayMode(600, 400)); 
      Display.setTitle("Pong"); 
      Display.create(); 
     } catch (LWJGLException e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 

     GL11.glMatrixMode(GL11.GL_PROJECTION); 
     GL11.glLoadIdentity(); 
     GL11.glOrtho(0, 600, 400, 0, 1, -1); 

     while (!Display.isCloseRequested()) { 
      // render OpenGL here 
      GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 

      // render player 
      GL11.glBegin(GL11.GL_QUADS); 
      GL11.glVertex2d(player.startX, player.startY); 
      GL11.glVertex2d(player.startX + 20, player.startY); 
      GL11.glVertex2d(player.startX + 20, player.startY + 70); 
      GL11.glVertex2d(player.startX, player.startY + 70); 
      GL11.glEnd(); 

      // player controls 
      if (Keyboard.isKeyDown(Keyboard.KEY_UP)) { 
       player.moveUp(); 
      } 
      if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) { 
       player.moveDown(); 
      } 

      // render AI 
      GL11.glBegin(GL11.GL_QUADS); 
      GL11.glVertex2d(ai.startX, ai.startY); 
      GL11.glVertex2d(ai.startX + 20, ai.startY); 
      GL11.glVertex2d(ai.startX + 20, ai.startY + 70); 
      GL11.glVertex2d(ai.startX, ai.startY + 70); 
      GL11.glEnd(); 

      // set ai 
      ai.move(); 

      // render Ball 
      GL11.glBegin(GL11.GL_LINE_LOOP); 

      GL11.glEnd(); 

      Display.update(); 
      Display.sync(60); 

     } 

     Display.destroy(); 
    } 

    // Let's start this beyotch up! 
    Player player = new Player(); 
    CPUPlayer ai = new CPUPlayer(); 
    Ball ball = new Ball(); 

    public static void main(String[] args) { 
     new Startup().start(); 
    } 
} 

CPUPlayer類:

public class CPUPlayer { 

    public int startX = 550; // starting positions (x, y), always locked 
    public int startY = 150; 

    private int moveSpeed = 2; 
    public int score = 0; // init 

    public void move() { 
     startY -= moveSpeed; 
     if (startY <= -10) { 
      startY += moveSpeed; // switch directions 
     } else if (startY >= 338) { 
      startY -= moveSpeed; 
     } 
    } 

} 

我的問題很簡單,就是槳拒絕切換方向,而是堅持顯示器的頂部。爲什麼會發生這種情況,我該如何解決這個問題?如果您有任何其他問題或需要其他具體細節,請不要猶豫,讓我知道。

回答

3

問題在於,當它到達頂端時,你只是告訴它向下移動一次。之後,它仍然試圖向上移動,而不是一次。爲了解決這個問題,你需要有一個'方向'變量,告訴它是否應該向上或向下移動,並在到達頂部/底部時更改變量。

例如:

public class CPUPlayer { 

    public int startX = 550; // starting positions (x, y), always locked 
    public int startY = 150; 

    private int moveSpeed = 2; 
    private boolean movingUp = true; 
    public int score = 0; // init 

    public void move() { 
     if(movingUp) { 
      startY -= moveSpeed; 
      if (startY <= -10) 
       movingUp = false; // switch directions 
     } else {      // Should be moving down 
      startY += moveSpeed; 
      if (startY >= 338) 
       movingUp = true; // switch directions 
     } 
    } 

} 
+0

不錯,清晰,易於理解和有組織。謝謝!現在讓球... – user2398233

+0

沒問題,祝你好運! :) – SharkofMirkwood

2

你總是減去moveSpeed,那麼你要添加MOVESPEED回切換方向。導致淨變化爲0.

當您需要爲startY <= -10更改路線時,您需要添加moveSpeed*2。您的代碼將如下工作:

public void move() { 
    startY -= moveSpeed; 
    if (startY <= -10) { 
     startY += (moveSpeed*2); // switch directions 
    } else if (startY >= 338) { 
     startY -= moveSpeed; 
    } 
} 

Viola!固定! 但是,我可以建議一種更復雜的方法。有槳不同的方式運行,像這樣:

boolean movingDown = false; 
public void move() { 
    int moveDir = movingDown?-moveSpeed:moveSpeed; 
    startY += moveSpeed; 
    if (startY <= -10 || startY>=338){ 
     movingDown = !movingDown; 
    } 
} 

這將切換爲槳移動過低或過高的正或負增量是否適用於你的槳位置。

編輯: 我的代碼和鯊魚代碼做了基本相同的事情。 Mine使用turnery操作符,他使用if/else語句。

+1

嗨@William,是的,我們的代碼做同樣的事情,而你的做法可能是更好的方式,所以我看到了我們在同一時間回答的答案。不過,我認爲你需要糾正你的變量。我認爲你已經多次使用'moveUp'來代替'movingDown',我想;) – SharkofMirkwood

+0

啊,很好的電話,謝謝@SharkofMirkwood。我很失望,我錯過了這一點,但我同意結果。我更喜歡你的答案。做得好! turnery是有用的,但更新的程序員不喜歡它。我一直在試圖停止使用它,單線船員打擾我。第二次我在2天內錯過了同一個用戶的問題。 –

+0

啊是的,我猜有時可讀性更重要。下次更好運氣,嘿。 – SharkofMirkwood

0

這裏是你的問題:

startY -= moveSpeed; // here, startY is -moveSpeed; 


if (startY <= -10) { 
     startY += moveSpeed; // switch directions (here, startY is 0) because 
          // -moveSpeed + moveSpeed = 0 
} else if (startY >= 338) { 
     startY -= moveSpeed ; 
} 

因此增加moveSpeedstartY-moveSpeed + moveSpeed = 0

要修正,添加的moveSpeed兩倍量:

if (startY <= -10) { 
     startY += 2 * moveSpeed; // switch directions         
} else if (startY >= 338) { 
     startY -= 2 * moveSpeed ; 
} 
+0

我明白你爲什麼認爲-moveSpeed + moveSpeed = 0,但這並不能解決問題。槳現在在屏幕的底部出現。這可能是其他問題嗎? – user2398233

1

你的移動方法首先扣除來自startY然後檢查其是否應當添加或扣除進一步。在應該添加到startY的情況下,該值在移動調用之前簡單地返回到原始值。所以,一旦它降到-10以下,startY就不會改變。

我認爲你的方法有缺陷。您無法準確確定槳板從當前位置朝向哪個方向。相反,使用布爾類似「isMovingUp」並基於此扣除/添加到startY。滿足邊界條件時更改布爾值。