본문 바로가기

JAVA/개발

[JAVA] 스네이크 게임

스네이크 게임의 뱀의 움직임을 구현한 프로그램. 뱀 모양을 만들고 이동시키는 알고리즘을 직접 짰었는데 다음과 같다.

 

○ 뱀의 머리와 꼬리의 마디 하나하나는 크기는 같지만 모두 다른 정사각형 모양의 객체이다.

첫 번째 객체(머리)를 위치시킨 후, 다음 객체는 이전 객체의 높이만큼 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