재미로 직접 작성했는데 매우 간단합니다. 한번 시도해 보세요...
저는 주로 javax.swing.Timer 클래스를 사용합니다:
import java.awt.*;
import javax.swing.*;
@SuppressWarnings("serial")
공용 클래스 MainClass 확장 JFrame { p >
ControlSnake 컨트롤;
툴킷 키트;
차원 크기;
public static void main(String[] args) {
< p> new MainClass("나의 뱀");}
public MainClass(String s) {
super(s);
< p> control = new ControlSnake();control.setFocusable(true);
kit = Toolkit.getDefaultToolkit();
dimen = 키트. getScreenSize ();
add(control);
setLayout(new BorderLayout());
setLocation(dimen.width / 3, dimen.height / 3 );// dimen.width/3,dimen.height/3
setSize(FWIDTH, FHEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setRessible(false);
setVisible(true);
}
public static final int FWIDTH = 315;
public static final int FHEIGHT = 380;
}
java.util.* 가져오기;
java.awt.* 가져오기;
가져오기 java .awt.event.*;
javax.swing.* 가져오기;
javax.swing.Timer 가져오기;
java.util.Random 가져오기;
@SuppressWarnings("serial")
공용 클래스 ControlSnake는 JPanel을 확장하여 ActionListener를 구현합니다. {
Random rand;
ArrayList
문자열 str, str1;
정적 부울 키;
int x, y, dx, dy, fx, fy, flag;< /p> p>
int snakeBody;
int speed;
public ControlSnake() {
sn
akeBody = 1;
str = "위, 아래, 왼쪽 및 오른쪽 화살표 키는 P 키를 제어하여 일시 중지합니다...";
str1 = "현재 길이는 다음과 같습니다. " + snakeBody;
키 = true;
플래그 = 1;
속도 = 700;
rand = new Random() ;
list = new ArrayList
listBody = new ArrayList
x = 5;
y = 5;< /p>
list.add(new Point(x, y));
listBody.add(list.get(0));
dx = 10;< /p>
dy = 0;
fx = rand.nextInt(30) * 10 + 5;// 2
fy = rand.nextInt(30) * 10 + 5;// 2
setBackground(Color.WHITE);
setSize(new Dimension(318, 380));
최종 타이머 시간 = new Timer(speed, this);
time.start();
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {< /p>
if (e.getKeyCode() == 37) {
dx = -10;
dy = 0;< /p>
} else if (e.getKeyCode() == 38) {
dx = 0;
dy = -10;
} else if (e.getKeyCode( ) == 39) {
dx = 10;
dy = 0;
} else if (e.getKeyCode () == 40) {< /p>
dx = 0;
dy = 10;
} else if (e.getKeyCode() == 80) {
if (플래그 % 2 == 1) {
time.stop();
}
if (플래그 % 2 == 0) {
time.start();
}
플래그++;
}
}
});
}
public void 페인트(그래픽 g) {
g.setColor(Color.WHITE);
g .fillRect(0, 0, 400, 400);
g.setColor(Color.DARK_GRAY);
g.drawLine(3, 3 , 305, 3);
p>g.dra
wLine(3, 3, 3, 305);
g.drawLine(305, 3, 305, 305);
g.drawLine(3, 305, 305, 305) ;
g.setColor(Color.PINK);
for (int i = 0; i < listBody.size(); i++) {
g .fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9);
}
g.fillRect(x, y, 9 , 9);
g.setColor(Color.ORANGE);
g.fillRect(fx, fy, 9, 9);
g.setColor (Color.DARK_GRAY);
str1 = "현재 길이:" + snakeBody;
g.drawString(str, 10, 320);
g.drawString(str1, 10, 335);
}
public void actionPerformed(ActionEvent e) {
x += dx;
y += dy;
if (makeOut() == false) {
JOptionPane.showMessageDialog(null, "다시 시작...")
>속도 = 700;
snakeBody = 1;
x = 5;
y = 5;
목록. clear();
list.add(new Point(x, y));
listBody.clear();
listBody.add(list. get(0));
dx = 10;
dy = 0;
}
addPoint(x, y);
if (x == fx && y == fy) {
speed = (int) (speed * 0.8);//속도 증가 매개변수
if (속도 < 200) {
속도 = 100;
}
fx = rand.nextInt(30) * 10 + 5;/ / 2< /p>
fy = rand.nextInt(30) * 10 + 5;// 2
snakeBody++;// 2
} // 2 p>< p> repaint();
}
public void addPoint(int xx, int yy) {
// 최신 이벤트를 동적으로 기록 50 이내의 좌표로 이동 steps
// 최신 snakeBody를 그립니다.
if (list.size() < 100) {//가장 긴 뱀 몸 길이는 100입니다.
list .add(new Point(xx, yy));
} else {
목록
.remove(0);
list.add(new Point(xx, yy));
}
if (snakeBody == 1) {< /p>
listBody.remove(0);
listBody.add(0, list.get(list.size() - 1));
} else {
listBody.clear();
if (list.size() < snakeBody) {
for (int i = list.size() - 1 ; i > 0; i--) {
listBody.add(list.get(i));
}
} else {
for (int i = list.size() - 1; listBody.size() < snakeBody; i--) {
listBody.add(list.get(i));< /p>
}
}
}
}
public boolean makeOut() {
if ((x < 3 || y < 3) || (x > 305 || y > 305)) {
false 반환;
}
< p> for (int i = 0; i < listBody.size() - 1; i++) {for (int j = i + 1; j < listBody.size(); j++) {< /p>
if (listBody.get(i).equals(listBody.get(j))) {
return false;
}
}
}
true를 반환합니다.
}
}