2012-06-15 3 views
0

이 뱀 게임 코드. 이 게임에 시스템 점수를 추가하고 싶습니다. 그래서 매번 그의 점수를 먹는 뱀이 늘어날 것입니다. 그러나 뱀이 음식 점수를 얻지 않는 경우에 증가하지 않을 것이다.뱀 게임 점수

현재 점수 표시 방법은 무엇입니까?

입니다 :

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import javax.swing.ImageIcon; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
public class Board extends JPanel implements ActionListener { 

private final int WIDTH = 300; 
private final int HEIGHT = 300; 
private final int DOT_SIZE = 10; 
private final int ALL_DOTS = 900; 
private final int RAND_POS = 29; 
private final int DELAY = 140; 

private int x[] = new int[ALL_DOTS]; 
private int y[] = new int[ALL_DOTS]; 

private int dots; 
private int apple_x; 
private int apple_y; 

private boolean left = false; 
private boolean right = true; 
private boolean up = false; 
private boolean down = false; 
private boolean inGame = true; 

private Timer timer; 
private Image ball; 
private Image apple; 
private Image head; 


public Board() { 
    addKeyListener(new TAdapter()); 

    setBackground(Color.black); 

    ImageIcon iid = new ImageIcon(this.getClass().getResource("dot.png")); 
    ball = iid.getImage(); 

    ImageIcon iia = new ImageIcon(this.getClass().getResource("apple.png")); 
    apple = iia.getImage(); 

    ImageIcon iih = new ImageIcon(this.getClass().getResource("head.png")); 
    head = iih.getImage(); 

    setFocusable(true); 
    initGame(); 
} 


public void initGame() { 

    dots = 3; 

    for (int z = 0; z < dots; z++) { 
     x[z] = 50 - z*10; 
     y[z] = 50; 
    } 

    locateApple(); 

    timer = new Timer(DELAY, this); 
    timer.start(); 
} 


public void paint(Graphics g) { 
    super.paint(g); 

    if (inGame) { 

     g.drawImage(apple, apple_x, apple_y, this); 

     for (int z = 0; z < dots; z++) { 
      if (z == 0) 
       g.drawImage(head, x[z], y[z], this); 
      else g.drawImage(ball, x[z], y[z], this); 
     } 

     Toolkit.getDefaultToolkit().sync(); 
     g.dispose(); 

    } else { 
     gameOver(g); 
    } 
} 


public void gameOver(Graphics g) { 
    String msg = "Game Over"; 
    Font small = new Font("Helvetica", Font.BOLD, 14); 
    FontMetrics metr = this.getFontMetrics(small); 

    g.setColor(Color.white); 
    g.setFont(small); 
    g.drawString(msg, (WIDTH - metr.stringWidth(msg))/2, 
       HEIGHT/2); 
} 


public void checkApple() { 

    if ((x[0] == apple_x) && (y[0] == apple_y)) { 
     dots++; 
     locateApple(); 
    } 
} 


public void move() { 

    for (int z = dots; z > 0; z--) { 
     x[z] = x[(z - 1)]; 
     y[z] = y[(z - 1)]; 
    } 

    if (left) { 
     x[0] -= DOT_SIZE; 
    } 

    if (right) { 
     x[0] += DOT_SIZE; 
    } 

    if (up) { 
     y[0] -= DOT_SIZE; 
    } 

    if (down) { 
     y[0] += DOT_SIZE; 
    } 
} 


public void checkCollision() { 

     for (int z = dots; z > 0; z--) { 

      if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) { 
       inGame = false; 
      } 
     } 

    if (y[0] > HEIGHT) { 
     inGame = false; 
    } 

    if (y[0] < 0) { 
     inGame = false; 
    } 

    if (x[0] > WIDTH) { 
     inGame = false; 
    } 

    if (x[0] < 0) { 
     inGame = false; 
    } 
} 

public void locateApple() { 
    int r = (int) (Math.random() * RAND_POS); 
    apple_x = ((r * DOT_SIZE)); 
    r = (int) (Math.random() * RAND_POS); 
    apple_y = ((r * DOT_SIZE)); 
} 

public void actionPerformed(ActionEvent e) { 

    if (inGame) { 
     checkApple(); 
     checkCollision(); 
     move(); 
    } 

    repaint(); 
} 


private class TAdapter extends KeyAdapter { 

    public void keyPressed(KeyEvent e) { 

     int key = e.getKeyCode(); 

     if ((key == KeyEvent.VK_LEFT) && (!right)) { 
      left = true; 
      up = false; 
      down = false; 
     } 

     if ((key == KeyEvent.VK_RIGHT) && (!left)) { 
      right = true; 
      up = false; 
      down = false; 
     } 

     if ((key == KeyEvent.VK_UP) && (!down)) { 
      up = true; 
      right = false; 
      left = false; 
     } 

     if ((key == KeyEvent.VK_DOWN) && (!up)) { 
      down = true; 
      right = false; 
      left = false; 
     } 
    } 
} 
+0

그래서 유일한 질문은 : 현재 점수를 표시하려면 어떻게해야합니까? 그의 점수를 먹는 뱀이 증가 할 때마다 당신은 해 봤습니까? 그러나 뱀이 음식 점수를 얻지 않는 경우에 증가하지 않을 것인가? 이 질문에 대한보다 명확한 설명은 –

+2

"스윙 프로그램은'paint()'를 오버라이드하는 대신'paintComponent()'를 오버라이드시켜야한다."- [* AWT와 스윙의 페인팅 : 페인트 방법 *] (http : //java.sun .com/products/jfc/tsc/articles/painting/index.html # callbacks); 이 [대답] (http://stackoverflow.com/a/10965273/230513)도 참조하십시오. – trashgod

답변

4

당신은 두 가지가 필요합니다

1) 코드 점수를 추가 - 이동이 뱀의 머리가 같은 좌표에 있는지 여부를 확인 후 확인한다 사과, 그렇다면 점수에 추가하십시오.

2) 플레이어의 점수 값을 저장할 JLabel을 만듭니다. ActionPerformed가 호출 된 각 타이머에서이 JLabel의 텍스트를 업데이트하십시오. 멀티 쓰레딩에 대해 걱정할 필요가 없으며, 타이머에 의해 호출 된 액션 이벤트 핸들러는 별도의 스레드에서 처리됩니다.