Problem 1

 

우선 선물을 누르면 스트레스 지수가 감소, 과제를 누르면 스트레스 지수가 증가하는 버튼 이벤트를 처리해야 한다.

 

해당 스트레스 지수의 조건을 할당하여 3이하면 파랑색, 4 ~ 7까지는 초록색, 그 이상은 빨간색으로 표정의 색을 변경시킨다.

 

또한, drawArc 메소드를 활용하여 호를 그려가며 표정을 변화시켰다.

 

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

public class SnowManFace extends JFrame {
    JLabel text;
    JButton present, takehome;
    int number = 5;

    // 눈사람 얼굴을 그리는 MyPanel 클래스 정의
    class MyPanel extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(number <= 3) {
            	g.setColor(Color.BLUE);
            }
            else if(number > 3 && number < 7){
            	g.setColor(Color.YELLOW);
            }
            else {
            	g.setColor(Color.RED);
            }
            g.fillOval(20, 30, 200, 200);
            g.setColor(Color.BLACK);
            
            int eyeArcExtent = Math.max(-180, 180 - (number * 20));
            g.drawArc(60, 80, 50, 50, 0, eyeArcExtent); 
            g.drawArc(150, 80, 50, 50, 0, eyeArcExtent);
            
            int mouthArcStart = 180; 
            int mouthArcExtent = Math.max(-180, 180 - (number * 20)); 
            g.drawArc(70, 130, 100, 70, mouthArcStart, mouthArcExtent); 
        }
    }

    // 생성자 정의
    public SnowManFace() {
        // 패널과 컴포넌트 초기화
        JPanel panel = new JPanel(new BorderLayout());
        JPanel buttonpanel = new JPanel(new GridLayout(1, 2));
        
        text = new JLabel();
        text.setText("현재 스트레스 지수 : " + number);

        present = new JButton("선물");
        takehome = new JButton("과제");
        
        buttonpanel.add(present);
        buttonpanel.add(takehome);
        
        present.addActionListener(e -> {
        	number -= 1;
        	text.setText("현재 스트레스 지수 : " + number);
        	repaint();
        });
        
        takehome.addActionListener(e -> {
        	number += 1;
        	text.setText("현재 스트레스 지수 : " + number);
        	repaint();
        });
        
        // 패널에 컴포넌트 추가
        panel.add(text, BorderLayout.NORTH);
        panel.add(new MyPanel(), BorderLayout.CENTER);
        panel.add(buttonpanel, BorderLayout.SOUTH);
        
        add(panel);

        // JFrame 설정
        setSize(300, 300);
        setTitle("눈사람 얼굴");
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    // main 메서드
    public static void main(String[] args) {
        new SnowManFace();
    }
}

 

 

 

실행결과

 

해당 버튼을 통해 얼굴 색을 변경하며 정상적으로 표정을 구현하였다.

 

 

 

Problem 2

 

우선 drawOval을 사용하여 3개의 빈 원을 생성한다.

또한, 버튼을 하단에 배치하여 클릭 시 변수에 특정 값을 저장하도록 이벤트 처리를 한다.

 

그렇게 이벤트 처리를 통한 특정값에 따라 빈 원에 색을 채워넣으면 된다.

 

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

public class TrafficLight extends JFrame {
    
    class MyPanel extends JPanel implements ActionListener {
        int light_number = 0;
        
        public MyPanel() {
            setLayout(new BorderLayout());
            JButton b = new JButton("신호 변경");
            b.addActionListener(this);
            add(b, BorderLayout.SOUTH);
        }
        
        // 신호등을 그리는 메서드
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            // 세 개의 원을 그리기
            g.setColor(Color.BLACK);
            g.drawOval(100, 30, 100, 100);
            g.drawOval(200, 30, 100, 100);
            g.drawOval(300, 30, 100, 100);
            
            // light_number 값에 따라 색을 채우기
            if (light_number == 0) {
                g.setColor(Color.RED);
                g.fillOval(100, 30, 100, 100);
            } else if (light_number == 1) {
                g.setColor(Color.YELLOW);
                g.fillOval(200, 30, 100, 100);
            } else if (light_number == 2) {
                g.setColor(Color.GREEN);
                g.fillOval(300, 30, 100, 100);
            }
        }

        // 버튼 클릭 시 호출되는 메서드
        public void actionPerformed(ActionEvent e) {
            // light_number 값을 변경하고 다시 그리기
            light_number = (light_number + 1) % 3;
            repaint();
        }
    }
    
    // 생성자 정의
    public TrafficLight() {
        add(new MyPanel());
        setSize(600, 200);
        setTitle("신호등");
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    // main 메서드
    public static void main(String[] args) {
        new TrafficLight();
    }
}

 

위처럼 light_number = 0이면 빨강, 1이면 노랑, 2면 초록으로 색을 변경하며 빈 원에 채워서 repaint()해주면 된다.

 

 

 

실행결과

 

 

 

 

Problem 3

예제 코드

 

마우스의 이벤트 처리는 2가지 경우로 나눠서 처리해야 한다. 마우스를 눌렀을 경우와 누르지 않았을 경우이다.

 

마우스를 눌렀을 때 dragging의 부울을 true로 변경해주고 별도의 이벤트를 처리한다.

 

누른 상태에서 눌렀을 때의 좌표와 움직인 후 좌표 사이를 패널에 칠해주면 된다.

 

그리고 버튼을 통해 칠하는 선의 색상을 변경해 주는 이벤트를 처리한다.

 

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

public class SimplePaint extends JFrame implements ActionListener {
    private JPanel canvas, buttonpanel;
    private JButton black, red, clear;
    private Color currentColor;
    private int prevX, prevY, currX, currY;
    private boolean dragging = false;

    // 생성자 정의
    public SimplePaint() {
        setLayout(new BorderLayout());
        setTitle("Simple Paint");
        setSize(900, 600);

        // 그리기 패널 설정
        canvas = new JPanel();

        // 마우스 이벤트 리스너 추가
        canvas.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                prevX = e.getX();
                prevY = e.getY();
                dragging = true;
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                dragging = false;
            }
        });

        // 마우스 드래그 이벤트 리스너 추가
        canvas.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (dragging) {
                    currX = e.getX();
                    currY = e.getY();
                    Graphics g = canvas.getGraphics();
                    g.setColor(currentColor);
                    g.drawLine(prevX, prevY, currX, currY);
                    prevX = currX;
                    prevY = currY;
                }
            }
        });

        add(canvas, BorderLayout.CENTER);

        // 버튼 패널 설정
        buttonpanel = new JPanel();

        // 블랙 버튼 설정
        black = new JButton("Black");
        black.addActionListener(this);

        // 레드 버튼 설정
        red = new JButton("Red");
        red.addActionListener(this);

        // 클리어 버튼 설정
        clear = new JButton("Clear");
        clear.addActionListener(this);

        // 버튼 패널에 버튼 추가
        buttonpanel.add(black);
        buttonpanel.add(red);
        buttonpanel.add(clear);
        add(buttonpanel, BorderLayout.SOUTH);

        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    // 버튼 클릭 이벤트 처리
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == black) {
            currentColor = Color.black;
        } else if (e.getSource() == red) {
            currentColor = Color.red;
        } else if (e.getSource() == clear) {
            canvas.repaint();
        }
    }

    // 메인 메서드
    public static void main(String[] args) {
        new SimplePaint();
    }
}

 

 

 

실행결과

 

 

 

Problem 4

 

우선 몬스터 클래스를 정의해야 한다. 그리고 생성한 객체는 ArrayList 배열에 저장하여 각 객체를 관리한다.

또한, 몬스터를 그릴 때 for-each문을 활용하여 ArrayList에서 꺼내 몬스터를 화면에 출력하였다.

 

10개의 랜덤한 위치에 몬스터를 배치해야 하며, 클릭 시 ArrayList에서 삭제하고 화면에서도 해당 몬스터를 제거해야 한다.

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

// 몬스터 클래스
class Monster {
    int x, y, hp; // 몬스터의 위치와 체력을 저장하는 변수들
    Image img; // 몬스터의 이미지
    int width, height; // 이미지의 너비와 높이를 저장하는 변수들
    
    
    
    // 몬스터 클래스의 생성자
    public Monster(int x, int y, int hp) {
        this.x = x;
        this.y = y;
        this.hp = hp; // 몬스터의 체력을 초기화
        // 몬스터의 이미지를 파일 경로로부터 불러옴
        ImageIcon icon = new ImageIcon("/Users/ansejun/Desktop/monster.jpg");
        img = icon.getImage();
        // 이미지의 너비와 높이를 저장
        this.width = img.getWidth(null);
        this.height = img.getHeight(null);
    }
    
    // 몬스터를 화면에 그리는 메서드
    public void draw(Graphics g) {
        g.drawImage(img, x, y, 50, 50, null); // 이미지를 몬스터의 위치에 그림 (크기는 50x50)
    }

    // 몬스터가 클릭되었는지를 확인하는 메서드
    public boolean isHit(int mouseX, int mouseY) {
        // 몬스터의 좌표와 마우스 클릭 좌표를 비교하여 몬스터가 클릭되었는지 확인
        return mouseX >= x && mouseX <= x + 50 && mouseY >= y && mouseY <= y + 50;
    }
}

// 게임 화면을 담당하는 프레임 클래스
public class MonsterCatchGame extends JFrame {
    ArrayList<Monster> list = new ArrayList<>(); // 몬스터들을 저장하는 리스트
    Random random = new Random(); // 랜덤한 좌표를 생성하기 위한 Random 객체 생성


    // 게임 화면을 그리는 패널 클래스
    class MyPanel extends JPanel {
    	JLabel label;
    	int score = 0;
        // 패널 초기화 메서드
        public MyPanel() {
            setLayout(null);
            // 몬스터를 10개 생성하여 리스트에 추가
            for (int i = 0; i < 10; i++) {
                int x = random.nextInt(600);
                int y = random.nextInt(300);
                int hp = 10;
                Monster monster = new Monster(x, y, hp);
                list.add(monster);
            }

            // 마우스 클릭 이벤트 리스너 추가
            this.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    int x = e.getX(); // 마우스 클릭한 x 좌표
                    int y = e.getY(); // 마우스 클릭한 y 좌표
                    // 몬스터 리스트를 순회하면서 클릭된 몬스터를 찾아 제거
                    Iterator<Monster> iterator = list.iterator();
                    while (iterator.hasNext()) {
                        Monster monster = iterator.next();
                        if (monster.isHit(x, y)) {
                            iterator.remove(); // 몬스터를 리스트에서 제거
                            score += 1;	// 점수 증가
                        }
                    }
                    repaint(); // 변경된 내용을 다시 그림
                }
            });
        }

        // 패널을 그리는 메서드
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            // 리스트에 있는 몬스터들을 화면에 그림
            for (Monster monster : list) {
                monster.draw(g);
            }
            g.drawString("Score: " + score, 20, 30);
        }
    }
    
    

    // 게임 프레임 생성자
    public MonsterCatchGame() {
        add(new MyPanel()); // 패널을 프레임에 추가
        setSize(800, 400); // 프레임 크기 설정
        setTitle("Monster Catch Game"); // 프레임 타이틀 설정
        setVisible(true); // 프레임 표시
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 닫기 버튼 동작 설정
    }

    // 메인 메서드
    public static void main(String[] args) {
        new MonsterCatchGame(); // 게임 프레임 인스턴스 생성
    }
}

 

 

 

실행결과

 

클릭으로 몬스터들이 모두 사라졌음을 확인할 수 있다.