본문 바로가기
IT/프로그래밍

명품 JAVA Programming 연습문제 13장

by nutrient 2020. 11. 30.
728x90
728x170

명품 JAVA Programming 연습문제 13장

 

1. 이론문제 8번을 참고하여 콘솔창에 1에서 100까지 출력 한 뒤 종료하는 스레드를 Runnable 인터페이스를 이용하여 작성하라.

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;



class Frame1 extends JFrame

{

        JPanel p = new JPanel();

        JLabel la = new JLabel();

        Frame1()

        {

                this.setTitle("test");

                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                runnable thread = new runnable(la);

                Thread th = new Thread(thread);

                p.add(la);

                this.add(p);

                this.setVisible(true);

                this.setSize(300, 300);

                th.start();

        }

}



class runnable implements Runnable

{

        JLabel la = new JLabel();

        runnable(JLabel la)

        {

                this.la = la;

        }

        public void run()

        {

                while(true)

                {

                        try

                        {

                                for(int i = 1; i<= 100; i++)

                                {

                                        la.setText(Integer.toString(i));

                                        Thread.sleep(1000);

                                        if(i ==100)return;

                                }

                        }

                        catch(InterruptedException e)

                        {

                                return;

                        }

                }

        }

}



public class m1

{



        public static void main(String[] args)

        {

                new Frame1();

        }



}

 

2. 예제 13-1의 소스를 참고하여 화면에 하나의 레이블만 가진 스우이 프레임을 구성하라. 처음에 레이블의 문자열을 0으로 설정한다. 레이블을 한 번 클릭하면 0.1초에 1씩 증가하는 카운팅이 시작되며, 다시 한 번 클릭하면 카운팅을 중단한다. 다시 클릭하면 처음부터 시작한다. 스레드를 중지시키기 위해 Thread.interrupt() 메소드를 사용하고, 스레드가 살아 있는지 확인 하기 위해 Thread.isAlive() 메소드를 이용하라.

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;



class Frame1 extends JFrame

{

        JPanel p = new JPanel();

        JLabel la = new JLabel("0");

        runnable thread

        Thread th

        Frame1()

        {

                this.setTitle("test");

                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                la.setFont(new Font("Arial", Font.PLAIN, 50));

                la.addMouseListener(new My());

                thread = new runnable();

                th = new Thread(thread);

                p.add(la);

                this.add(p);

                this.setVisible(true);

                this.setSize(300, 300);

                }

        class My implements MouseListener

        {

                public void mouseClicked(MouseEvent e)

                {

                        if(th.isAlive())

                        {

                                th.interrupt();

                                th = new Thread(thread);

                        }

                        else

                        {

                                th.start();

                        }

                }



                public void mouseEntered(MouseEvent arg0) {}



                public void mouseExited(MouseEvent arg0) {}



                public void mousePressed(MouseEvent arg0) {}



                public void mouseReleased(MouseEvent arg0) {}



        }



        class runnable implements Runnable

        {



                public void run()

                {

                        while(true)

                        {

                                try

                                {

                                        for(int i = 1; i<= 100; i++)

                                        {

                                                la.setText(Integer.toString(i));

                                                Thread.sleep(100);

                                        }

                                }

                                catch(InterruptedException e){return}

                        }

                }

        }

}









public class m1

{



        public static void main(String[] args)

        {

                new Frame1();

        }



}


3.현재 시간 값으로부터 시작하는 디지털시계를 만들어라. 시계는 시,분,초 값을 가진다.

import java.awt.*;

import java.awt.event.*;

import java.util.Calendar

import javax.swing.*;



class Frame3 extends JFrame

{

        JPanel p = new JPanel();

        JLabel[] la = new JLabel[3];

        runnable thread;

        Thread th;

        Frame3()

        {

                this.setTitle("test");

                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                for(int i = 0; i<3; i++)

                {

                        la[i] = new JLabel("0");

                        la[i].setFont(new Font("Arial", Font.PLAIN, 50));

                        p.add(la[i]);

                }

                thread = new runnable();

                th = new Thread(thread);

                this.add(p);

                this.setVisible(true);

                this.setSize(300, 300);

                th.start();



        }



        class runnable implements Runnable

        {



                public void run()

                {



                        while(true)

                        {

                                try

                                {

                                        Calendar c = Calendar.getInstance();

                                        int h = c.get(Calendar.HOUR_OF_DAY);

                                        int m = c.get(Calendar.MINUTE);

                                        int s = c.get(Calendar.SECOND);



                                        String H = Integer.toString(h);

                                        String M = Integer.toString(m);

                                        String S = Integer.toString(s);

                                        la[0].setText(H +":");

                                        la[1].setText(M +":");

                                        la[2].setText(S);

                                        Thread.sleep(1000);



                                }

                                catch(InterruptedException e){return}

                        }

                }

        }

}











public class m3

{



        public static void main(String[] args)

        {

                new Frame3();

        }



}

 

4. JFrame을 상속받아 VibratingFrame을 만들어라. 이 프레임은 화면에 출력되자마자 심하게 진동한다.

 

진동을 표현하기 위해서는 프레임에 스레드를 만들고 스레드가 프레임의 위치에 상하좌우 조금씩 반복하여 이동시키면 된다. 프레임 F의 위치를 (100,100)에 지정하는 방법은 f.setLocation(100,100)이다. 진동하는 프레임을 만들 수 있다면 진동하는 컴포넌트도 만들 수 있다. 

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;



class Frame4 extends JFrame

{

        JFrame f = this;

        JPanel p = new JPanel();

        runnable thread;

        Thread th;

        Frame4()

        {

                this.setTitle("test");

                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                thread = new runnable();

                th = new Thread(thread);

                this.setLocation(100, 100);

                this.add(p);

                this.setVisible(true);

                this.setSize(300, 300);

                th.start();



        }



        class runnable implements Runnable

        {

                public void run()

                {

                        while(true)

                        {

                                try

                                {

                                        f.setLocation(90, 100);

                                        Thread.sleep(1);

                                        f.setLocation(100, 100);



                                }

                                catch(InterruptedException e){return}

                        }

                }

        }

}









public class m4

{



        public static void main(String[] args)

        {

                new Frame4();

        }



}

 

5.그림과 같이 아래에 총알을 발사하는 발사대가 있으며, 위에는 목표물이 왼쪽에서 오른쪽으로 지나간다. 사용자가 < Enter> 키를 입력하여 총알을 발사하여 목표물을 맞추는 게임을 스윙으로 작성하라. 목표물의 움직이는 시간은 20ms 당 5픽셀이다. 목표물이 오른쪽으로 벗어나면 다시 왼쪽에서 시작되며 총알이 움직이는 속도 역시 20ms당 5픽셀이다. 총알은 한번에 한 개 씩만 발사 되며, 목표물을 명중하든지 위로 올라가 실패하여야 다음 발사가 가능하다. 목표물을 명중하면 목표물은 다시처음 위치로 돌아가서 다시움직이기 시작한다.

 

 

6. 프레임 내에 임의의 위치를 마우스로 찍으면 그 위치부터 하나의 버블이 만들어지고 이 버블이 위로 움직인다. 버블이 완전히 프레임을 벗어나면 프로그램에서 삭제된다. 버블은 20ms마다 5픽셀씩 위로 이동한다. 마우스로 찍을 때 마다 버블이 만들어지는 스윙 프로그램을 완성하라. 버블은 이미지 레이블로 구현하여도 되고, 그래픽으로 구현하여도 된다. 다음은 이미지 레이블로 구현한 것이다.

 

 

7. 369 게임을 혼자 하는 PC 게임 버전으로 작성해보자. 숫자의 범위는 1~99로만 한정하며 숫자에 3,9,31,62처럼 숫자에 3,6,9가 하나 있으면 숫자 위에 마우스로 한 번 클릭을 하고, 33,36,63,93처럼 숫자에 3,6,9 가 두 개 있으면 더블클릭을 한다. 그 외의 경우 클릭을 하면 안 된다. 아래의 실행 사례를 보면 숫자 1이 보이고 “ start”버튼이 눌러지면 숫자는 자동으로 증가하면서 게임이 시작된다. 사용자는 369게임의 법칙에 따라 마우스를 클릭하면 된다. 99까지 가면 “”Win!!“을 출력하고, 한번 클릭해야 할 때 틀리면 ”Fail^“을, 더블 클릭 해야 할 때 틀리면 ”Fail^^“을 출력한다. 게임 진행 속도는 700ms로 하면 적당하다. 게임은 계속 반복되게 하라.

 



8.2명이 키보드로 하는 369 게임을 만들어 보자. 실습문제 7번을 수정하여 만들면 된다. 아래의 예시 프로그램은 박지성과 이청룡이 369게임을 하는 모습니다. 노란 바탕의 두 개 카드가 보이고 이고셍는 숫자가 자동으로번갈아 증가한다. 사용자는 자신의 카드에 숫자가 출력되면 369게임에 맞추어 키를 입력해야 한다. 박지성의 경우 369중 숫자 하나가 나타난 경우 A키를, 두 개가 나타난 경우 S키를 누른다. 이청룡의 경우는 키 K와 L이다. 아래 예시의 마지막 화면은 박지성이 숫자 23에 대해 A키를 눌렀어야 했는지 누르지 못하였기 때문에 게임에 진 것을 나타낸 것이다. 자기 차례가 아닐 때 키를 눌러도 게임에서 지게 된다. 게임은 1~99까지만 진행하며 모두 끝까지 간 경우 카드에 “Win!!”을 출력한다. 게임이 반복되도록 작성하라
.

 


9.스네이크(뱀)게임에 사용되는 움직이는 스네이크를 만들어 보자. 그림과 같이 프레임이ㅡ 배경에 이미지를 출력한다. 스네이크는 총 10개의 마디로 구성하고 상,하,좌,우 키에 의해 움직인다. 스네이크는 200ms마다 5픽셀씩 자동으로 움직인다.


10.스레드를 이용하여 아래와 같이 화면에 눈이 내리도록 연출하라. 화면의 바탕 이미지는 독자가 좋은 것으로 선택하면 된다.



11. 10장의 Open Challenge 겜블링 게임에 스레드를 달아보자. 아래 그림과 같이 3개의 레이블 컴포넌트가 있다. 이 컴포넌트에는 0~4까지의 한 자리수가 출력된다. 마우스를 누를 때 마다 3개의 수를 랜덤하게 발생시키고 각 수를 레이블에 출력한다. 이 때 스레드를 이용하여 3개의 수를 왼쪽에서부터 200ms 간격으로 하나씩 출력한다. 그러고나서 모두 동일한 수인지 판단하고 동일하면 “ 축하합니다!!”를, 아니면 “아쉽군요”를 출력한다.


12.다음 설명과 같이 작동하는 스윙 프로그램을 작성하라(짝수지만 정답 공개됨), 패널에 사용자가 마우스를 올리면 랜덤한 크기와 위치에 타원 그리기가 시작된다. 타원은 300ms 간격으로 다른 위치로 옮기면서 그려진다. 사용자가 마우스를 패널엣 ㅓ내리면 타원 그리기는 일시 멈추고, 다시 마우스를 올리면 그리리가 계속된다. 이 문제를 푸릭 위해서 wait-notify를 사용하는 것이 좋다.

 
 
 
 
728x90
그리드형

댓글