자바

자바 소스코드: 스네이크 움직이기

드린 2016. 11. 23. 21:04
반응형
package javaapplication35;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

class Ex9 extends JFrame{
    GamePanel p;
    Ex9(){
        this.setTitle("스네이크 움직이기");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p=new GamePanel();
        this.setLocationRelativeTo(null);
        this.setSize(400,400);
        this.setVisible(true);
        this.add(p);
        p.requestFocus();
        Thread s=new Thread(p);
        s.start();
    }
    
    class GamePanel extends JPanel implements Runnable{
        static final int LEFT=0;
        static final int RIGHT=1;
        static final int UP=2;
        static final int DOWN=3;
        static final int DELAY=200;//0.2초마다 움직인다.
        int direction;//방향 설정
        SnakeBody snakebody;
        
        GamePanel(){
            this.setLayout(null);
            snakebody=new SnakeBody();
            snakebody.addIn(this);
            direction=LEFT;//초기방향
            this.addKeyListener(new MyKeyListener());
        }
        
        public void paintComponent(Graphics g){//배경을 위한 메소드
            super.paintComponent(g);
            ImageIcon icon= new ImageIcon("bg.jpg");
            Image img=icon.getImage();
            g.drawImage(img, 0, 0, this.getWidth(),this.getHeight(),null);
        }
        
        class MyKeyListener implements KeyListener{
            @Override
            public void keyTyped(KeyEvent ke) {}
            
            @Override
            public void keyPressed(KeyEvent ke) {//방향설정 키 리스너
                switch(ke.getKeyCode()){//입력된 키에 따른 방향 설정
                    case KeyEvent.VK_LEFT:
                        direction=LEFT; break;
                    case KeyEvent.VK_RIGHT:
                        direction=RIGHT; break;
                    case KeyEvent.VK_UP:
                        direction=UP; break;
                    case KeyEvent.VK_DOWN:
                        direction=DOWN; break;
                }
            }
            
            @Override
            public void keyReleased(KeyEvent ke) {}
        }
        
        public void run(){
            while(true){
                try{//딜레이 만큼 기다렸다가 입력된방향으로 이동
                    Thread.sleep(DELAY);
                    snakebody.move(direction);
                }
                catch(Exception e){
                    return;
                }
            }
        }
    }
    

    class SnakeBody{
        Vector<JLabel> v = new Vector<JLabel>();//스네이크의 형태의 위치들을 기억하기 위함
        
        public SnakeBody(){
            //머리부분 생성
            ImageIcon head = new ImageIcon("head.jpg");
            JLabel la =new JLabel(head);
            la.setSize(head.getIconWidth(),head.getIconHeight());//이미지크기만큼 크기를 설정
            la.setLocation(100, 100);
            v.add(la);
            
            //몸체부분 생성
            ImageIcon body=new ImageIcon("body.jpg");
            for(int i=1; i<10; i++){//몸체 10개 생성
                la=new JLabel(body);
                la.setSize(body.getIconWidth(),body.getIconHeight());
                la.setLocation(100+i*20, 100);
                v.add(la);
            }
        }
        
        public void addIn(JPanel panel){//몸체를 패널에 추가
            for(int i=0; i<v.size(); i++)
                panel.add(v.get(i));
        }
        
        public void move(int direction){//각 몸체부분을 전에 있던 몸체 위치로 옮긴다.
            for(int i=v.size()-1;i>0;i--){
                JLabel b=v.get(i);
                JLabel a=v.get(i-1);
                b.setLocation(a.getX(), a.getY());
            }
            
            JLabel head=v.get(0);
            switch(direction){//입력된 방향만큼 20픽셀씩 이동한다.
                case GamePanel.LEFT:
                    head.setLocation(head.getX()-20, head.getY());
                    break;
                case GamePanel.RIGHT:
                    head.setLocation(head.getX()+20, head.getY());
                    break;
                case GamePanel.UP:
                    head.setLocation(head.getX(), head.getY()-20);
                    break;
                case GamePanel.DOWN:
                    head.setLocation(head.getX(), head.getY()+20);
                    break;
            }
        }
    }
}
public class JavaApplication35 {
    public static void main(String[] args) {
        new Ex9();
    }
}

<결과>

2016/11/23 - [자바] - 자바 소스코드: 369게임 둘이서 하기

2016/11/23 - [자바] - 자바 소스코드: 369게임 혼자하기

2016/11/23 - [자바] - 자바 소스코드: 버블 게임(비눗방울 같은)

#자바 #자바 소스코드 #스네이크 움직이기 #명품자바 프로그래밍 13장 9번 #키 리스너 #Vector #실습 예제

반응형