2017-07-02 67 views
0

我一直在做我的第一個項目:一個蛇遊戲。我看過一個視頻,我做了這個。然而它不起作用,當我運行它時,我的蛇不動。有人能幫助我如何讓它工作。有人可以幫助我讓我的蛇移動

package game; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 
import java.util.ArrayList; 

import javax.swing.JPanel; 

public class GamePanel extends JPanel implements Runnable, KeyListener { 

    public static final int WIDTH = 400; 
    public static final int HEIGHT = 400; 

    //Render 
    private Graphics2D g2d; 
    private BufferedImage image; 

    //Game Loop 
    private Thread thread; 
    private boolean running; 
    private long targetTime; 

    //Game Stuff 
    private final int SIZE = 10; 
    private Entity head, apple; 
    private ArrayList<Entity> snake; 
    private int score; 
    private int level; 
    private boolean gameover; 

    //Movement 
    private int dx,dy; 
    //key input 
    private boolean up,down,right,left,start; 

    public GamePanel() { 
     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     setFocusable(true); 
     requestFocus(); 
     addKeyListener(this); 
    } 
    @Override 
    public void addNotify() { 
     super.addNotify(); 
     thread = new Thread(this); 
     thread.start(); 
    } 
    private void setFPS(int fps) { 
     targetTime = 1000/fps; 
    } 
    // Toetsenbord input --> beweging van de snake 
    @Override 
    public void keyPressed(KeyEvent e) { 
     int k = e.getKeyCode(); 

     if (k == KeyEvent.VK_UP) up = true; 
     if (k == KeyEvent.VK_DOWN) down = true; 
     if (k == KeyEvent.VK_LEFT) left = true; 
     if (k == KeyEvent.VK_RIGHT) right = true; 
     if (k == KeyEvent.VK_ENTER) start = true; 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     int k = e.getKeyCode(); 

     if (k == KeyEvent.VK_UP) up = false; 
     if (k == KeyEvent.VK_DOWN) down = false; 
     if (k == KeyEvent.VK_LEFT) left = false; 
     if (k == KeyEvent.VK_RIGHT) right = false; 
     if (k == KeyEvent.VK_ENTER) start = false; 

    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 

    } 
    //Snelheid van de snake 
    @Override 
    public void run() { 
     if (running) return; 
     init(); 
     long startTime; 
     long elapsed; 
     long wait; 
     while (running) { 
      startTime = System.nanoTime(); 
      update(); 
      requestRender(); 

      elapsed = System.nanoTime() - startTime; 
      wait = targetTime - elapsed/1000000; 
      if (wait>0) { 
       try{ 
        Thread.sleep(wait); 
       } catch(Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    private void init() { 
     image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); 
     g2d = image.createGraphics(); 
     running = true; 
     setUplevel(); 
    } 
    //Hoe het level eruit ziet 
    private void setUplevel() { 
     snake = new ArrayList<Entity>(); 
     head = new Entity(SIZE); 
     head.setPosition(WIDTH/2, HEIGHT/2); 
     snake.add(head); 
     for (int i = 1;i < 3; i++) { 
      Entity e = new Entity(SIZE); 
      e.setPosition(head.getX() + (i * SIZE), head.getY()); 
      snake.add(e); 
     } 
     apple = new Entity(SIZE); 
     score = 0; 
     gameover = false; 
     level = 1; 
     dx = dy = 0; 
     setFPS(level*10); 
    } 
    //Waar het fruit komt 
    public void setApple() { 
     int x = (int)(Math.random() * (WIDTH - SIZE)); 
     int y = (int)(Math.random() * (HEIGHT - SIZE)); 
     x = x - (x%SIZE); 
     y = y - (y%SIZE); 
     apple.setPosition(x,y); 
    } 
    private void requestRender() { 
     render(g2d); 
     Graphics g = getGraphics(); 
     g.drawImage(image, 0,0,null); 
     g.dispose(); 
    } 
    //Hoe dat ding beweegt 
    private void update() { 
     if (gameover) { 
      if (start) { 
       setUplevel(); 
      } 
      return; 
     } 

     if (up && dy == 0) { 
      dy = -SIZE; 
      dx = 0; 
     } 
     if (down && dy == 0) { 
      dy = SIZE; 
      dx = 0; 
     } 
     if (left && dx == 0) { 
      dy = 0; 
      dx = -SIZE; 
     } 
     if (right && dx == 0 && dy != 0) { 
      dy = 0; 
      dx = -SIZE; 
     } 
     if (dx !=0 || dy != 0) { 

      for (int i = snake.size() - 1; i>0; i--) { 
       snake.get(i).setPosition(snake.get(i - 1).getX(), snake.get(i - 1).getY()); 
      } 
      head.move(dx, dy); 
     } 

     for (Entity e : snake) { 
      if (e.isCollision(head)) { 
       gameover = true; 
       break; 
      } 
     } 
     //Punten erbij en langer worden als de snake fruit eet 
     if (apple.isCollision(head)) { 
      score++; 
      setApple(); 

      Entity e = new Entity(SIZE); 
      e.setPosition(-100, -100); 
      snake.add(e); 
      if (score % 10 == 0) { 
       level++; 
       if (level > 10) level = 10; 
       setFPS(level*10); 
      } 
     } 
     if (head.getX() < 0) head.setX(WIDTH); 
     if (head.getY() < 0) head.setY(HEIGHT); 
     if (head.getX() > 0) head.setX(0); 
     if (head.getY() > 0) head.setY(0); 
    } 

    public void render(Graphics2D g2d) { 
     g2d.clearRect(0, 0, WIDTH, HEIGHT); 
     g2d.setColor(Color.GREEN); 
     for (Entity e : snake) { 
      e.render(g2d); 
     } 
     g2d.setColor(Color.red); 
     apple.render(g2d); 
     //Tekst voor en na je doodgaat 
     g2d.setColor(Color.WHITE); 
     g2d.drawString("Score :" + score + "Level : " + level, 10, 10); 
    } 
} 

實體類

package snake; 

import java.awt.Graphics2D; 
import java.awt.Rectangle; 

public class Entity { 
    private int x,y,size; 

    public Entity(int size) { 
     this.size = size; 
    } 
    public int getX() { 
     return x; 
    } 
    public int getY() { 
     return y; 
    } 
    public void setX(int x) { 
     this.x = x; 
    } 
    public void setY(int y) { 
     this.y = y; 
    } 
    public void setPosition(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void move(int dx, int dy) { 
     x += dx; 
     y += dy; 
    } 
    public Rectangle getBound() { 
     return new Rectangle(x, y, size, size); 
    } 
    public boolean isCollision(Entity o) { 
     if(o == this) return false; 
     return getBound().intersects(o.getBound()); 
    } 
    public void render(Graphics2D g2d) { 
     g2d.fillRect(x + 1, y + 1, size - 2, size - 2); 
    } 
} 
+1

'它不working'?你能更具體一點嗎? – Cyclonecode

+0

你需要至少嘗試一些調試自己,讓我們知道:您可以檢測/記錄按鍵?顯示器是否在您期望的情況下更新?等等...而且,這個標題有些冒犯。 – kabanus

+0

您可以請您發佈代碼實體類 – urag

回答

0

我知道這是對堆棧溢出你的第一個問題,所以歡迎。即使這不是通常的在此處需要的問題的類型,我想指出一個小蟲子在你的代碼導致蛇停留在0,0平方米。這是當你與牆壁碰撞檢查:

if (head.getX() > 0) head.setX(0); 
if (head.getY() > 0) head.setY(0); 

它應該是:

if (head.getX() > WIDTH) head.setX(0); 
if (head.getY() > HEIGHT) head.setY(0); 

我已經回答了這個問題,只是因爲我知道的是新開發的世界上的痛苦。希望你繼續玩代碼,並且有很多好玩的時間。