본문 바로가기
Language/Java

[Java] Multi Thread를 이용한 간단 게임 구현(구구단)

by lucas_owner 2023. 1. 26.

Java Multi Thread를 이용한 간단 게임 구현하기 - 곱셈(구구단) 맞추기

 

- Java Thread를 공부 하던 중 간단한 입력을 통해 시간내에 많은 문제를 풀어보는 구구단 게임을 만들게 되었다.

- Scanner 와 Thread만을 사용하여 간단하게 구현 해보자. 


동작 방식 및 게임 룰 설정

문제 

  1. 제한시간 60초 안에 많은 문제를 맞추자. 
  2. 2자리 * 1자리 숫자가 문제로 주어진다.
  3. 맞추면 "정답입니다", 틀리면 "틀렸습니다. 정답은: xxx" 출력.
  4. 정답, 오답의 각 개수 체크하여 게임 종료시, (문제 갯수, 정답, 오답 갯수) 출력.

구현

  1. Timer 기능과 문제를 발생시키는 Thread 생성(GuguTimer.class)
  2. 문제를 내고, 입력을 받아 정,오답을 검증하는 Thread 생성(GameGugu.class)
  3. 제한시간(60초)가 되었다면, Timer, GameGugu Thread 종료 및 결과 출력 

클래스 목록

  1. Thread_Game2 : Main Class, Thread 를 실행 시킴.
  2. GuguTImer: timer Class, Timer 작동 및 실질적 게임 로직 Thread 를 실행시킴.
  3. GameGugu: 문제를 내고, 정답, 오답 확인 하여 연산. 

구현은 생각보다 간단하다. Thread 의 시작과 종료, 타겟 Thread에 대하여 정지 요청만 할 수 있으면 만들 수 있다.

 

각 동작 클래스를 나누어서 확인해보자.


Code

1.Main

- timer Thread 를 실행, 정답, 오답, 문제 갯수를 공유자원으로 갖고있음.

2. Timer

- 60초를 카운팅하며, GAME(Thread) 실행,  60초가 지났다면 timer 종료, GAME 종료. 

- Game Thread 를 실행 시키기 때문에, 종료 시그널 또한 주어야 한다.

  -> 종료 시그널 -> game.interrupt(); (interrupt 메소드는 안전하게 정지시키는 방법이 아니다.)

3. Game

- 문제를 생성해서 출력. 

- Scanner 로 들어온 input 값을 통해 정,오답 체크 및 연산.

- 연산 도중 종료 시그널(interrupt)가 호출 된다면 

  Game 쓰레드의 interrupt = true 가 된다. 

  if문을 통하여 종료 시그널이 들어오면 Thread를 종료 시켜주자.

3.  코드 실행 결과 


전체 코드

package example;

import java.util.Random;
import java.util.Scanner;

/************
 * @info : Thread 게임 2 - 시간내에 구구단 문제 풀기
 * @name : Thread_Game2
 * @version : 1.0.0
 * @Description :
 ************/
public class Thread_Game2 {

    static int correct = 0; // 정답갯수
    static int wrong = 0; // 틀린 갯수
    static int proNum = 0; // 문제 갯수

    public static void main(String[] args) {
        GuguTimer timer = new GuguTimer();
        timer.start();
    }

private static class GuguTimer extends Thread {
    @Override
    public void run() {
        GameGugu game = new GameGugu();

        System.out.println("구구단 게임 시작! 제한시간 60초!");
        game.start();
        for(int i=60; i>0; i--) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("게임 종료!");
        System.out.println("총 문제 갯수: " + Thread_Game2.proNum);
        System.out.println("맞춘 갯수: " + Thread_Game2.correct);
        System.out.println("틀린 갯수: " + Thread_Game2.wrong);
        System.exit(0); //THread 종료.

        game.interrupt();
    }
} //class - timer


private static class GameGugu extends Thread {
    @Override
    public void run() {
        Scanner sc = new Scanner(System.in);

        System.out.println("시작!");
        while (true) {
            Random random = new Random();
            int fir = random.nextInt(100);
            int sec = random.nextInt(10);
            int result = fir * sec;

            System.out.println((Thread_Game2.proNum+1)+ "번" + "--->" + fir + " X " + sec + " 정답은?");
            int inRes = sc.nextInt();

            if(inRes == result) {
                System.out.println("정답입니다!");
                Thread_Game2.correct ++; // 정답 갯수
            }else {
                System.out.println("틀렸습니다! 정답은: " + result);
                Thread_Game2.wrong ++; // 틀린 갯수
            }

            Thread_Game2.proNum++; // 문제 갯수

            if(isInterrupted()) {
                System.exit(0);
            }
        }//while
    }
}// class - game

}// class

 

반응형

댓글