package p20230706쓰레드지렁이머리;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
//지렁이 게임을 동작 시키는 원리
//타이머가 동작한다. 예 1초에 한번씩
//MyPanel에 동작시킬수 있는 메소드를 호출한다.
//MyPanle.control()메소드
//2. MyTimer클래스와 MyPanel 객체와 연결 관계를 만든다.
//3. 지렁이의 이동방법 변경: 방향만 설정하면 된다. direction
// case 37: // 왼쪽 화살표키
// case 39: // 오른쪽
// case 38: // 위쪽
// case 40: // 아래쪽
//4. 키의 입력에 따라 방향을 바꾸어야 한다.
// keyListener
// 1. MyTimerEvent 클래스 생성
// 4.1 리스너 등록
// 4.2 키에 따라 방향을 설정한다.
// 4.3 control메소드를 수정 (키 방향에 따라 헤드 수정)
// 5. 이전 머리를 배경색으로 변경
class MyTimerEvent extends TimerTask {
// 2. MyTimer클래스와 MyPanel 객체와 연결 관계를 만든다.
MyPanel myPanel;
public MyTimerEvent(MyPanel a) {
myPanel = a;
}
static int count = 0;
@Override
public void run() {
System.out.println("홍길동" + count++);
myPanel.control();
}
}
class MyRect {
// 한 점을 저장
int x, y;
// Width, height
int width, height;
// 색깔 정보
Color color;
public MyRect() {
}
public MyRect(int x, int y, int width, int height, Color color) {
super();
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.color = color;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public void draw(Graphics g) {
g.setColor(this.color);
g.fillRect(x, y, width, height);
}
}
// 4 4.1 KeyListener인터페이스 상속 받고 추상메소드 구현
class MyPanel extends JPanel implements KeyListener{
MyRect[][] rects;
// 지렁이 머리의 위치를 위한 필드
int head_x;
int head_y;
// 3. 지렁이의 이동방향
int direction;
final static int MAX_X = 20;
final static int MAX_Y = 20;
final static int BASE_X = 100;
final static int BASE_Y = 100;
final static int WIDTH = 40;
final static int HEIGHT = 40;
final static int INTERVAL_X = 1;
final static int INTERVAL_Y = 1;
public MyPanel() {
// 2.타이머 쓰레드 객체를 생성하여 타이머를 동작시킨다.
MyTimerEvent myTimerEvent = new MyTimerEvent(this);
Timer timer = new Timer();
timer.schedule(myTimerEvent, 1000, 300);
// case 37: // 왼쪽 화살표키
// case 39: // 오른쪽
// case 38: // 위쪽
// case 40: // 아래쪽
direction = 38;
rects = new MyRect[MAX_X][MAX_Y];
// 지렁이 머리의 위치를 지정( X행, Y열의 위치)
head_x = MAX_X / 2;
head_y = MAX_Y / 2;
for (int i = 0; i < MAX_X; i++) {
for (int j = 0; j < MAX_Y; j++) {
// 테두리에 속하면 빨강, 그렇지 않으면 검정
if (i == 0 || i == MAX_X - 1 || j == 0 || j == MAX_Y - 1) {
rects[i][j] = new MyRect(BASE_X + (WIDTH + INTERVAL_X) * j, BASE_Y + (HEIGHT + INTERVAL_Y) * i,
WIDTH, HEIGHT, new Color(255, 0, 0));
} else {
rects[i][j] = new MyRect(BASE_X + (WIDTH + INTERVAL_X) * j, BASE_Y + (HEIGHT + INTERVAL_Y) * i,
WIDTH, HEIGHT, new Color(0, 0, 0));
}
}
}
}
// 4.3 control메소드를 수정 (키 방향에 따라 헤드 수정)
public void control() {
// TODO Auto-generated method stub
// 5. 이전 머리를 배경색으로 변경
rects[head_x][head_y].setColor(Color.BLACK);
// 4.3 control메소드를 수정 (키 방향에 따라 헤드 수정)
switch ( direction) {
case 37:
head_y--;
break; // 왼쪽 화살표키
case 39:
head_y++;
break; // 오른쪽
case 38:
head_x--;
break; // 위쪽
case 40:
head_x++;
break; // 아래쪽
}
repaint();
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
g.setColor(Color.BLUE);
g.setFont(new Font("굴림", Font.BOLD, 50));
g.drawString("영진전문대학교 컴퓨터정보계열", 150, 50);
g.setColor(Color.MAGENTA);
g.drawString("AI빅데이터응용소프트웨어과", 180, 100);
g.setColor(Color.BLACK);
g.setFont(new Font("굴림", Font.BOLD, 80));
g.drawString("임", (MAX_X + 1) * WIDTH + BASE_X, (MAX_Y - 4) / 2 * HEIGHT + BASE_Y);
g.drawString("덕", (MAX_X + 1) * WIDTH + BASE_X, MAX_Y / 2 * HEIGHT + BASE_Y);
g.drawString("성", (MAX_X + 1) * WIDTH + BASE_X, (MAX_Y + 4) / 2 * HEIGHT + BASE_Y);
g.drawString("2", 30, (MAX_Y / 2 - 6) * HEIGHT + BASE_Y);
g.drawString("2", 30, (MAX_Y / 2 - 4) * HEIGHT + BASE_Y);
g.drawString("0", 30, (MAX_Y / 2 - 2) * HEIGHT + BASE_Y);
g.drawString("1", 30, MAX_Y / 2 * HEIGHT + BASE_Y);
g.drawString("2", 30, (MAX_Y / 2 + 2) * HEIGHT + BASE_Y);
g.drawString("3", 30, (MAX_Y / 2 + 4) * HEIGHT + BASE_Y);
g.drawString("4", 30, (MAX_Y / 2 + 6) * HEIGHT + BASE_Y);
for (int i = 0; i < rects.length; i++) {
for (int j = 0; j < rects[0].length; j++) {
rects[i][j].draw(g);
}
}
// 지렁이의 머리를 칠하자.
rects[head_x][head_y].setColor(Color.yellow);
rects[head_x][head_y].draw(g);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// 4.2 키에 따라 방향을 설정한다.
switch (e.getKeyCode()) {
case 37:
direction = 37;
break; // 왼쪽 화살표키
case 39:
direction = 39;
break; // 오른쪽
case 38:
direction = 38;
break; // 위쪽
case 40:
direction = 40;
break; // 아래쪽
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
class MyFrame extends JFrame {
// 생성자 - 패널 추가
public MyFrame() {
setSize(600, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 패널 객체 생성
MyPanel myPanel = new MyPanel();
this.add(myPanel);
// 4.1 리스너 등록
myPanel.addKeyListener(myPanel);
myPanel.setFocusable(true);
setVisible(true);
}
}
public class Main {
public static void main(String[] args) {
MyFrame myFrame = new MyFrame();
}
}