스네이크 게임의 뱀의 움직임을 구현한 프로그램. 뱀 모양을 만들고 이동시키는 알고리즘을 직접 짰었는데 다음과 같다.
○ 뱀의 머리와 꼬리의 마디 하나하나는 크기는 같지만 모두 다른 정사각형 모양의 객체이다.
○ 첫 번째 객체(머리)를 위치시킨 후, 다음 객체는 이전 객체의 높이만큼 y좌표를 증가시켜 위치시킨다. 이 작업을 반복하여 세로로 정렬된 초기의 뱀 모습을 형성한다.
○ 뱀은 direction 변수에 의해 이동한다. 최초의 direction은 "up"이며 키보드로 변경할 수 있다.
○ 오직 머리 객체만이 direction을 읽어 움직인다. 나머지 마디는 이전 객체의 위치를 가져와 자신의 위치를 그곳으로 이동시키는 것 뿐이다.
글을 작성하며 코드를 다시 보니 쓰레드 함수 부분에 쓸데없는 반복을 없애면 훨씬 좋을 것 같다.

코드
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class seven extends JFrame{
private MyPanel panel=new MyPanel();
public seven() {
setTitle("스네이크 움직이기");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c=getContentPane();
c.addKeyListener(new MyKeyListener());
c.add(panel);
c.setFocusable(true);
// panel.requestFocus();
setSize(1000,800);
setVisible(true);
}
class MyPanel extends JPanel implements Runnable{
private JLabel testLabel;
private String direction="up";
private ImageIcon icon=new ImageIcon("images/26.jpg");
private Image img=icon.getImage();
private ImageIcon icon1=new ImageIcon("images/head.jpg");
private Image img1=icon1.getImage();
private Image smallImg1=img1.getScaledInstance(35, 35, Image.SCALE_SMOOTH);
private ImageIcon smallIcon1=new ImageIcon(smallImg1);
private ImageIcon icon2=new ImageIcon("images/body.png");
private Image img2=icon2.getImage();
private Image smallImg2=img2.getScaledInstance(35, 35, Image.SCALE_SMOOTH);
private ImageIcon smallIcon2=new ImageIcon(smallImg2);
private JLabel []label=new JLabel[10];
private Vector <Point> v=new Vector<Point>();
public MyPanel() {
setLayout(null);
snake();
Thread th=new Thread(this);
th.start();
}
public void snake() {
label[0]=new JLabel(smallIcon1);
label[0].setSize(35,35);
label[0].setPreferredSize(new Dimension(100,100));
label[0].setLocation(100,100);
add(label[0]);
for(int i=1;i<label.length;i++) {
label[i]=new JLabel();
label[i].setIcon(smallIcon2);
label[i].setSize(35,35);
label[i].setLocation(100,100+35*i);
add(label[i]);
}
}
public void setDirection(int keyCode) {
switch(keyCode) {
case 38: direction="up";break;
case 40: direction="down";break;
case 37: direction="left";break;
case 39: direction="right";
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, getWidth(), getHeight(), 0, 0, 1920, 1080, this);
}
public void run() {
while(true) {
try {
v.removeAllElements();
for(int i=0;i<label.length;i++) {
v.add(label[i].getLocation());
}
int x=label[0].getX();
int y=label[0].getY();
switch(direction) {
case"up":y-=35;label[0].setLocation(x,y);
for(int i=1;i<label.length;i++) {
int x1=v.get(i-1).x;
int y1=v.get(i-1).y;
label[i].setLocation(x1,y1);
}
break;
case"down":y+=35;label[0].setLocation(x,y);
for(int i=1;i<label.length;i++) {
int x1=v.get(i-1).x;
int y1=v.get(i-1).y;
label[i].setLocation(x1,y1);
}
break;
case"left":x-=35;label[0].setLocation(x,y);
for(int i=1;i<label.length;i++) {
int x1=v.get(i-1).x;
int y1=v.get(i-1).y;
label[i].setLocation(x1,y1);
}
break;
case"right":x+=35;label[0].setLocation(x,y);
for(int i=1;i<label.length;i++) {
int x1=v.get(i-1).x;
int y1=v.get(i-1).y;
label[i].setLocation(x1,y1);
}
}
Thread.sleep(200);
}catch(InterruptedException e) {return;}
}}
}
class MyKeyListener extends KeyAdapter{
public void keyPressed(KeyEvent e) {
panel.setDirection(e.getKeyCode());
}
}
public static void main(String[]args) {
new seven();
}
}
'JAVA > 개발' 카테고리의 다른 글
[JAVA] 산성비 게임 (0) | 2023.02.18 |
---|---|
[JAVA] 슬롯 머신 (0) | 2023.02.17 |
[JAVA] 파이 차트 (0) | 2022.10.04 |
[JAVA] 간단 순발력 테스트 (0) | 2022.08.12 |
[JAVA] 가위바위보 (0) | 2022.08.12 |