2012-07-27 5 views
3

나는 (나에게 적어도) 이라는 이상한 상황이있다.
뱀을 다시 쓰려고하는데, 이동이 아주 잘되고, 1 세그먼트를 지우고 1 (x + 1 - 1 = x?)을 추가했지만 뱀이 사라지는 반면 뱀은 사라집니다. Arraylist는 동일한 크기를 유지합니다 (인쇄).스네이크 재 작성 시도 - 스네이크 자체가 먹는다

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.*; 
import java.util.ArrayList; 

class Snake extends JPanel implements Runnable { 
    int x,y; 
    boolean horizontal; 
    ArrayList<Point> position = new ArrayList<Point>(); 
    byte dir = 3; 

    public Snake(JFrame parent) { 
     for(int i = 0; i < 5; i++) 
      position.add(new Point(i*5 + 10, 10)); 

     parent.addKeyListener(new KeyAdapter() { 
      public void keyPressed(KeyEvent e) { 
       byte change = dir; 
       switch (e.getKeyCode()) { 
        case KeyEvent.VK_DOWN: 
         change = 4; 
         break; 
        case KeyEvent.VK_UP: 
         change = 1; 
         break; 
        case KeyEvent.VK_LEFT: 
         change = 2; 
         break; 
        case KeyEvent.VK_RIGHT: 
         change = 3; 
         break; 
       } 

       changeDirection(change); 
      } 
     }); 
     System.out.println("starting thread"); 
     new Thread(this).start(); 
    } 

    private void changeDirection(byte change) { 
     if(change != dir && (change - 2 != dir || change + 2 != dir)) { 
      dir = change; 
     } 
    } 

    public void run() { 
     for(int i = 0; i != -1; i++){ 
      try { 
       move(); 
       this.repaint(); 
       Thread.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       System.out.println("INTERRUPTED"); 
      } 
     } 
    } 

    private void move() { 
     System.out.println(position.size()); 
     Point toAdd = position.get(position.size() - 1); 
     position.remove(0); 
     if(dir == 1) 
      toAdd.y -= 5; 
     else if(dir == 2) 
      toAdd.x -= 5; 
     else if(dir == 3) 
      toAdd.x += 5; 
     else if(dir == 4) 
      toAdd.y += 5; 

     if(toAdd.x < 0) toAdd.x = 150; 
     else if(toAdd.x > 150) toAdd.x = 0; 

     if(toAdd.y < 0) toAdd.y = 150; 
     else if(toAdd.y > 150) toAdd.y = 0; 
     position.add(toAdd); 
    } 

    public void paintComponent(Graphics g) { 
     g.clearRect(0,0,150,150); 
     for(Point p : position) 
      g.drawRect(p.x, p.y, 5, 5); 
    } 

    public static void main(String[] args) { 
     Snake snake; 
     JFrame f = new JFrame("Snake"); 
     f.setSize(150, 150); 
     f.add((snake = new Snake(f))); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setResizable(false); 
     f.setVisible(true); 
    } 
} 

: 그것을 짧은, 콘도, 올바른 예를 만들기 위해,

private void move() { 
    System.out.println(position.size()); 
    Point toAdd = position.get(position.size() - 1); 
    position.remove(0); 
    if(dir == 1) 
     toAdd.y -= 5; 
    else if(dir == 2) 
     toAdd.x -= 5; 
    else if(dir == 3) 
     toAdd.x += 5; 
    else if(dir == 4) 
     toAdd.y += 5; 

    if(toAdd.x < 0) toAdd.x = 150; 
    else if(toAdd.x > 150) toAdd.x = 0; 

    if(toAdd.y < 0) toAdd.y = 150; 
    else if(toAdd.y > 150) toAdd.y = 0; 
    position.add(toAdd); 
} 

그러나 :

뱀의 위치를 ​​계산하는 기능 (나는 그것을 일으키는 생각) 운동이 내가 구현하려고 시도한 첫 번째 사건이었습니다. 아직 충돌 감지/음식에 이르지 않았으므로 여기에 의문의 여지가 없습니다.

내 질문은 :

왜 뱀은 ArrayList에없는 동안 감소하고 나는 그것을 고칠 수있는 방법, 즉 전면 세그먼트를 제외하고 사라지는 뱀을 중지한다?

+3

@downvoter 설명 부탁드립니다. – 11684

+2

누군가 이것이 내게 왜 진짜 질문이 아닌지 설명해 주시겠습니까? 마지막 단락은 매우 명확한 질문입니다. 생각하기에, 그것을 찾기가 어렵지 않고, 지나치게 넓지도 않고, 단지 '너무 지역화되어있을 수 있습니다.'그러나 많은 사람들이 여기에있을 것입니다. 멀리있는 질문이 있습니다. 그래서 더 많은 현지화. – 11684

+1

나는 수사적이거나 불완전하다고하지는 않을 것이다. 심지어 SSCCE를 제공했다. 그리고 그것은 현재의 형태로, 내 코드를보고 의심 할 바없이 어리석은 실수를하는 사람이 합리적으로 대답 할 수있다. – 11684

답변

6

확인. 이것은 간단합니다!

이미 목록에있는 지점을 변경하고 과 같은을 추가하면 끝납니다. 결국 같은 위치에있는 (참조 기준) 요소가 점점 더 많아집니다.

Point의 새 인스턴스를 만들어 목록에 추가해야합니다.

Point lastPoint = position.get(position.size() - 1); 
    Point toAdd = new Point(lastPoint.x, lastPoint.y); 
+0

작업 중! 정말 고맙습니다! – 11684