2012-10-09 62 views
2

你好,我最近開始開發一款貪吃蛇遊戲。我正處於開始階段,我有一個移動的物體和一個圓點,但我的主要問題是如何檢查蛇是否「吃」了點,以及如何讓它消失?
任何幫助將不勝感激。貪吃蛇Java Gui

這裏是下面的代碼:第一

import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.awt.event.KeyEvent;  
import java.awt.event.KeyListener;  
import javax.swing.*;  
import java.awt.*;  
import java.util.Random;  
import javax.swing.JPanel; 

public class Gui extends JPanel implements ActionListener,KeyListener{ 

    Random rnd= new Random(); 

int pointx=100 + (int)(Math.random() * ((400- 100) + 1));; 

int pointy=100 + (int)(Math.random() * ((300 - 100) + 1)); 

private String text; 

    Timer tm = new Timer(5, this); 

    int x = 300, y = 178, velx = 0, vely = 0; 


     public Gui() 
     { 
      tm.start(); 

      addKeyListener(this); 

      setFocusable(true); 

     } 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.green); 
      g.fillRect(x, y, 35, 15); 
      g.setColor(Color.BLACK); 
      g.fillOval(pointx,pointy, 20,20); 

     } 

     public void keyPressed(KeyEvent e) 
     { 
      int c = e.getKeyCode(); 
      if (c == KeyEvent.VK_LEFT) 
      { 
       velx = -1; 
       vely = 0; 
      } 
      if (c == KeyEvent.VK_UP) 
      { 
       velx = 0; 
       vely = -1; 
      } 
      if (c == KeyEvent.VK_RIGHT) 
      { 
       velx = 1; 
       vely = 0; 
      } 
      if (c == KeyEvent.VK_DOWN) 
      { 
       velx = 0; 
       vely = 1; 
      } 
     } 

     public void actionPerformed(ActionEvent e) 
     { 
      x += velx; 
      y += vely; 
      repaint(); 
      borders(e); 

     } 
     public void borders(ActionEvent e) { 
      if (x < 0) { 
       velx = 0; 
       x = 0; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 
      } 
      if (x > 530) { 
       velx = 0; 
       x = 530; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 
      } 
      if (y < 0) { 
       velx = 0; 
       y = 0; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 
      } 
      if (y > 330) { 
       velx = 0; 
       y = 330; 
       JOptionPane 
         .showMessageDialog(null, "you hit the borders you lost!"); 
       System.exit(0); 

      } 
     } 
     public static void main(String[] args) 
     { 
     JFrame frame = new JFrame("gui"); 
      frame.add(new Gui()); 
      frame.setVisible(true); 
      frame.setSize(600, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     } 
+2

您需要保留對蛇的「頭部」和「目標」的引用。如果頭部和目標位於同一點,則它吃了它,一旦吃完,您將重置「治療」到新位置或將其設置爲「空」,並允許下一個繪製週期更新圖形。您將需要使用類似的技術來檢測蛇是否自行進入。 – MadProgrammer

+1

我讀得很快,看來你讀了蛇的x和y,爲什麼不把它們與點的x和y進行比較?如果它們是相同的,那麼你知道蛇正在通過這個點。 順便說一下,你的代碼有點混亂,我看不到你在哪裏使用pointx和pointy來創建點... 我想你應該停下來,重新考慮一下結構項目。 您可以創建一個類「點」,代表蛇的「食物」。 然後,你需要一個類蛇,由許多點形成,並且將其移動(搭末點,並把它的頭後) 等.. – Gianmarco

回答

5

第一件事:你的GUI應該是從你的遊戲邏輯獨立。

基本上,你想要一個或多個類來封裝遊戲狀態。這個GameState類有一個函數,它返回一個要繪製的圓形列表,以及另一個函數來接受輸入。 GUI類處理設置面板和執行繪製請求。然後事情變得非常簡單。要使點消失,只需將其從列表中刪除即可。要檢查兩件事是否相撞,請比較它們的位置。

實際上,我在Java中做了一個貪吃蛇遊戲。以下是我擁有的課程列表。請記住,這只是一個建議:根據個人喜好和遊戲的複雜程度,您需要更多或更少的課程。

  • GameInstance - 保持所述遊戲邏輯
  • GameWindow - GUI部分
  • MainLoop語句 - 設置事件循環
  • 蛇 - 保存有關 蛇
  • PNT2 - 一個2D點,與邏輯加法, 減法,距離測試等

很顯然,這是j只有一種做事的方式,但這是我推薦的做法。

+0

非常感謝你,但在我的遊戲我的蛇實際上是一種方法,被填充到幀等等矩形是我的點,因此問題是如何使disappear.i認爲,如果蛇會觸及的點,我將它上色白色的,但它不是很effictive,你怎麼能去掉一個矩形從一個乾淨的方式從一個jframe? – david1597

+0

我剛剛清除了整個框架並重新繪製了每個勾號。這比試圖手動查找與前一幀的差異並僅繪製更改的部分要容易得多。 – Antimony

+0

不錯,IL盡我所能,使其工作。並再次感謝你 – david1597