Java Multi Thread를 이용한 간단 게임 구현하기 - 곱셈(구구단) 맞추기
- Java Thread를 공부 하던 중 간단한 입력을 통해 시간내에 많은 문제를 풀어보는 구구단 게임을 만들게 되었다.
- Scanner 와 Thread만을 사용하여 간단하게 구현 해보자.
동작 방식 및 게임 룰 설정
문제
- 제한시간 60초 안에 많은 문제를 맞추자.
- 2자리 * 1자리 숫자가 문제로 주어진다.
- 맞추면 "정답입니다", 틀리면 "틀렸습니다. 정답은: xxx" 출력.
- 정답, 오답의 각 개수 체크하여 게임 종료시, (문제 갯수, 정답, 오답 갯수) 출력.
구현
- Timer 기능과 문제를 발생시키는 Thread 생성(GuguTimer.class)
- 문제를 내고, 입력을 받아 정,오답을 검증하는 Thread 생성(GameGugu.class)
- 제한시간(60초)가 되었다면, Timer, GameGugu Thread 종료 및 결과 출력
클래스 목록
- Thread_Game2 : Main Class, Thread 를 실행 시킴.
- GuguTImer: timer Class, Timer 작동 및 실질적 게임 로직 Thread 를 실행시킴.
- 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
반응형
'Language > Java' 카테고리의 다른 글
[Java] Java 메모리 영역(stack, heap, static), JVM, JAVA 변수 종류 (2) | 2023.02.07 |
---|---|
[Java] Java 컬렉션(Collection) (0) | 2023.02.01 |
[Java] Lombok 실제 사용법(2) (0) | 2023.01.17 |
[Java] LomBok이란? & 어노테이션 정리 (1) (0) | 2023.01.17 |
[Java] Stack 2개로 Queue 처럼 사용하기 (0) | 2023.01.13 |
댓글