2016-08-19 6 views
-3

私は蛇の試合をしようとしています。私はこの問題を解決したいと思います。私は食べ物に問題があります。 snakeheadの座標が食物の座標と一致するときにスコアが増分されません。私の疑問は 'foodPhysics()'メソッドにあります。私は初心者ですから、良い説明が参考になるかもしれません。食べ物に影響を与えない蛇とのコリソン

public class Game2 extends JComponent implements ActionListener, KeyListener { 

    public int x = 350, y = 350; 
    public static Game2 game; 
    public boolean up, down, left, right; 
    public int vx, vy, fx, fy, score; 

    public Random generator; 

    public static void main(String[] args) { 
     game = new Game2(); 
    } 

    public Game2() { 
     generator = new Random(); 
     fx = 7 + generator.nextInt(780); 
     fy = 7 + generator.nextInt(780); 
     JFrame window = new JFrame("Game"); 
     window.setSize(700, 700); 
     window.setResizable(false); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Timer t = new Timer(10, this); 

     window.add(this); 

     window.addKeyListener(this); 
     window.setVisible(true); 
     head = new Point(x, y); 

     t.start(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     if (up) { 
      vy = -10; 
      y = y + vy; 
     } 
     if (down) { 
      vy = 10; 
      y = y + vy; 
     } 
     if (left) { 
      vx = -10; 
      x = x + vx; 
     } 
     if (right) { 
      vx = 10; 
      x = x + vx; 
     } 
     if (x == 0 && vx == -10) { 
      x = 800; 
      vy = 0; 
     } 
     if (x == 800 && vx == 10) { 
      x = 0; 
      vy = 0; 
     } 
     if (y == 0 && vy == -10) { 
      y = 800; 
      vx = 0; 
     } 
     if (y == 800 && vy == 10) { 
      y = 0; 
      vx = 0; 
     } 

     repaint(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     int c = e.getKeyCode(); 
     if (c == KeyEvent.VK_UP) { 
      up = true; 
      down = false; 
      left = false; 
      right = false; 
     } 
     if (c == KeyEvent.VK_DOWN) { 
      up = false; 
      down = true; 
      left = false; 
      right = false; 
     } 
     if (c == KeyEvent.VK_LEFT) { 
      up = false; 
      down = false; 
      left = true; 
      right = false; 
     } 
     if (c == KeyEvent.VK_RIGHT) { 
      up = false; 
      down = false; 
      left = false; 
      right = true; 
     } 
     if (foodPhysics() == true) { 
      score++; 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(Color.BLACK); 
     g.fillRect(x, y, 15, 15); 
     foodRender(g); 
     g.setFont(new Font("Arial", 25, 25)); 
     g.drawString(Integer.toString(score), 500, 500); 
    } 

    public void foodRender(Graphics g) { 
     g.setColor(Color.RED); 
     g.fillRect(fx, fy, 15, 15); 
    } 

    public boolean foodPhysics() { 
     if (x == fx && y == fy) { 
      return true; 
     } 
     return false; 
    } 

} 
+0

コードを再フォーマットして読み込めますか? – xenteros

+1

私はそれらのコードを編集し、再フォーマットしました。すぐに表示されるはずです。 @xenteros – byxor

答えて

3

私はこの時点であなたのコードがコンパイルされないと信じています。あなたはhead変数を "new Point(x、y)"に等しく設定しているようですが、あなたはhead変数をコード内に宣言していません。それはさておき

あなたのfoodPhysics()メソッドで。

public boolean foodPhysics(){ 
    Rectangle rect = new Rectangle(fx,fy,15,15) //the size of your food. 
    if(rect.contains(head)){     //you'll need to create this variable 
     return true; 
    } 
    return false; 
} 

これは、コード内でポイントが同じピクセルを正確に渡すたびに増加するため、領域が少ししかないことになります。 actionPerformed()メソッドでも頭をリセットするようにしてください。

@Override 
public void actionPerformed(ActionEvent e) { 

    if (up) { 
     vy = -10; 
     y = y + vy; 
    } 
    if (down) { 
     vy = 10; 
     y = y + vy; 
    } 
    . 
    . 
    . 

    head = new Point(x,y); 

    repaint(); 
} 

おそらくあなたのような何かにスネークヘッドのレンダリングを変更した場合より良いでしょう:

g.fillRect(x-7,y-7,15,15); 

私は正しいんだ場合、これはヘッド=新しい点(x、y)になるだろう描画された矩形のほぼ中央にある。しかし、実際には、ピクセルを完全にヒットすると、現時点でのコードが正しく機能しているはずです。

さらにお手伝いが必要な場合は、お気軽にお問い合わせください。

+0

ありがとうございました! Rectangleクラスにcontains()というメソッドがあることはわかりませんでした。 Point宣言については、宣言しましたが、コード内に追加していませんでした。ただ、忘れてしまいました。もう一度あなたの助けと詳細な説明をいただきありがとうございます。 –

+0

私は自分の投稿を編集して、私がどのようにそれをするかを見ていきます。 –

+0

あなたの努力に感謝します。しかし、あなたの食べ物クラスにはsetRemove()メソッドがありません。また、renderメソッドは、main()メソッドではなく、paintComponent(Graphics g)メソッドでのみ使用できます。だから、主なメソッドのコード全体(あなたの宣言の変数から)paintComponent()メソッドにできませんでしたか? –

0

あなたが矢印キーを押して放すと、ヘビは動きます。これにより、ある距離を超えてヘビが「スキップ」するようになります。あなたのチェックが一致しないようにします。

サンプルコードを試してみると、「矢印キーを押しながら蛇と食べ物を衝突させる」とスコアが高くなります。 この

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.Random; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.Timer; 

public class Game2 extends JComponent implements ActionListener, KeyListener { 

    public int x = 350, y = 350; 
    public static Game2 game; 
    public boolean up, down, left, right; 
    public int vx, vy, fx, fy, score; 

    public Point head; 
    public Random generator; 

    public static void main(String[] args) { 
     game = new Game2(); 
    } 

    public Game2() { 
     generator = new Random(); 
     fx = 7 + generator.nextInt(780); 
     fy = 7 + generator.nextInt(780); 
     JFrame window = new JFrame("Game"); 
     window.setSize(700, 700); 
     window.setResizable(false); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     Timer t = new Timer(10, this); 

     window.add(this); 

     window.addKeyListener(this); 
     window.setVisible(true); 
     head = new Point(x, y); 

     t.start(); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     int speed = 1; 
     if (up) { 
      vy = -speed; 
      y = y + vy; 
     } 
     if (down) { 
      vy = speed; 
      y = y + vy; 
     } 
     if (left) { 
      vx = -speed; 
      x = x + vx; 
     } 
     if (right) { 
      vx = speed; 
      x = x + vx; 
     } 
     if (x == 0 && vx == -speed) { 
      x = 800; 
      vy = 0; 
     } 
     if (x == 800 && vx == speed) { 
      x = 0; 
      vy = 0; 
     } 
     if (y == 0 && vy == -speed) { 
      y = 800; 
      vx = 0; 
     } 
     if (y == 800 && vy == speed) { 
      y = 0; 
      vx = 0; 
     } 

     repaint(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     int c = e.getKeyCode(); 
     if (c == KeyEvent.VK_UP) { 
      up = true; 
      down = false; 
      left = false; 
      right = false; 
     } 
     if (c == KeyEvent.VK_DOWN) { 
      up = false; 
      down = true; 
      left = false; 
      right = false; 
     } 
     if (c == KeyEvent.VK_LEFT) { 
      up = false; 
      down = false; 
      left = true; 
      right = false; 
     } 
     if (c == KeyEvent.VK_RIGHT) { 
      up = false; 
      down = false; 
      left = false; 
      right = true; 
     } 
     if (foodPhysics() == true) { 
      score++; 
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(Color.BLACK); 
     g.fillRect(x, y, 15, 15); 
     foodRender(g); 
     g.setFont(new Font("Arial", 25, 25)); 
     g.drawString(Integer.toString(score), 500, 500); 
    } 

    //improve this by limiting the fx, fy in bound 
    public void foodRender(Graphics g) { 
     g.setColor(Color.RED); 
     g.fillRect(fx, fy, 15, 15); 
    } 

    public boolean foodPhysics() { 

     return Math.abs(x-fx) < 30 && Math.abs(y-fy) < 30; 
    } 

} 

つを試してみてください、私はテストするので、簡単にあなたのヘビを鈍化しました。 2つ、チェック衝突の方法を変更しました。

+0

しかし、ヘビはあまりにも遅くないでしょうか?私はそれを少し速くしたい。 –

+0

もしあなたが欲しいなら、あなたはヘビを増やし、私はそれをゆっくりとしたので、効果を見るのが簡単です。あなたのスピードを上げるには、intスピード変数をカウントアップします。 – Xiaoerge

関連する問題