2016-08-19 3 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

노력해 주셔서 감사합니다. 그러나 당신의 food 클래스에 setRemove() 메소드가 보이지 않으며 render 메소드는 main() 메소드가 아니라 paintComponent (Graphics g) 메소드에서만 사용할 수 있습니다. 그래서 main 메소드의 전체 코드 (당신이 선언 한 시간 변수에서)를 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; 
    } 

} 

하나를 시도, 나는 테스트를 너무 쉽게 뱀을 둔화. 둘째, 귀하의 수표 충돌 방법을 변경했습니다.

+0

하지만 뱀은 너무 느려? 나는 그것을 조금 빨리 원한다. –

+0

원한다면 당신의 뱀을 늘려라. 나는 그것을 느리게 만들었으므로 효과를보기가 더 쉽다. 속도를 높이려면 int 속도 변수를 계산하십시오. – Xiaoerge

관련 문제