컴퓨터가 난수를 생성하고, 난수를 입력해서 생성한 난수를 맞추는 게임이다.
난수를 맞추게 되면, 다시 시작할것인지 아닌지 묻는다.
다시 시작하게 될 경우 처음으로 되돌아가고, 아닐 경우 프로그램을 종료한다.
(처음에 만든 코드같은 경우, 마지막에 한번 더 코드를 재입력하는 것이 보기 싫어서, 이중 while문으로 제작함)
(1중 while문을 이용한 code)
package array03;
import java.util.Random;
import java.util.Scanner;
public class ArrayEx09 {
public static void main(String[] args) {
Random r= new Random();
int k=r.nextInt(100);
Scanner sc=new Scanner(System.in);
int i=1;
System.out.println("수를 결정했습니다. 맞추어 보세요.");
System.out.println("0-99");
while(true) {
System.out.print(i+">>");
int ans=sc.nextInt();
if(ans>k) {
System.out.println("더 낮게");
i++;
continue;
}else if(ans<k){
System.out.println("더 높게");
i++;
continue;
}else{
System.out.println("정답입니다.");
System.out.println("다시 하시겠습니까? y/n");
String a=sc.next();
if(a.equals("n")) {
System.out.println("숫자 맞추기 게임을 종료합니다.");
break;
}else {
r= new Random();
k=r.nextInt(100);
i=1;
System.out.println("수를 결정했습니다. 맞추어 보세요.");
System.out.println("0-99");
}sc.close();
}
}
}
}
다음과 같이 초반에 적은 "수를 결정했습니다." 나, i과 r, k의 변수 초기화를 다시 끝에 실행해주는 것이 보기 싫었다.
그래서 정답을 맞추면 일단 내부 while문을 벗어남 -> 프로그램의 지속/종료를 결정함 -> 지속 시 외부 while문의 처음으로 돌아감 / 종료 시 외부 while문을 벗어나며, 종료를 알리는 문구와 함께 종료하는 형태를 취하기로 했다.
(이중 while 문을 이용한 난수게임 code)
package array03;
import java.util.Random;
import java.util.Scanner;
public class ArrayEx09Another {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
Random r = new Random();
int k = r.nextInt(100);
int i = 1;
int max=99;
int min=0;
System.out.println("수를 결정했습니다. 맞추어 보세요.");
System.out.println("0-99");
while (true) {
System.out.print(i + ">>");
int ans = sc.nextInt();
if (ans > k) {
max=ans;
System.out.println("더 낮게");
System.out.println(min+"-"+max);
} else if (ans < k) {
min=ans;
System.out.println("더 높게");
System.out.println(min+"-"+max);
} else {
System.out.println("정답입니다.");
break;
}
i++;
continue;
}
System.out.println("다시 하시겠습니까? y/n");
String a = sc.next();
if (a.equals("n")) {
break;
}
}
System.out.println("숫자 맞추기 게임을 종료합니다.");
sc.close();
}
}
첫 while문에서는 난수를 생성하고, 난수 k, 최대값 max, 최소값 min, 반복할 변수 i를 선언하고, 초기화 한다.
두번째 while문에서 nextInt를 통해 정답을 입력 받는다.
받은 정답은 변수 ans로 들어가게 되고, while 문 속에 있는 if문을 통과하게 된다. 만일 정답이 아닐 경우, if문 내부의 continue 문을 통해 다시 반복문의 처음으로 되돌아가게 된다. (continue : 반복문의 시작지점으로 돌아가게 하는 문법)
답이 정답일 경우 정답이라는 문장의 출력과 함께 break문을 통해 내부 while 문을 빠져나오고, 외부 while문의 다시 하시겠습니까, 의 출력값을 제공받는다(break : 즉시 가장 가까운 반복문을 빠져나가는 문법).
"n"을 입력할 경우 외부 while문도 빠져나오면서 "숫자 맞추기 게임을 종료합니다."라는 문구와 함께 입력창도 종료가 된다. "y"를 입력할 경우 외부 while문의 시작으로 돌아가 다시 숫자 맞추기 게임을 진행한다.
만일 숫자 대신 문자를 입력하면 어떻게 될까?
원래라면 이렇게 오류가 뜰 것이다.
그러나, 예외처리라는 기법을 통해 오류를 핸들링해볼 것이다. JVM이 오류코드를 출력하기 전에 먼저 오류를 가지고 오는 것이다.
이것은 try - catch라는 문법을 통해 가능하다.
위의 코드 중 입력 부분을 조금만 수정해보자.
while (true) {
int ans=0;
System.out.print(i + ">>");
try {
ans = sc.nextInt();
} catch (Exception e) {
System.out.println("정수를 입력해주세요!");
sc.nextLine();
continue;
}
내부 while문이 시작하는 첫단계이다.
try부분에 입력창을 넣고, 입력창에 정수 대신 다른 문자를 입력하게 된 순간 경고문구와 함께 cotinue문을 통해 while문의 처음으로 되돌아가도록 하는 code이다
결과물을 보면,
정수 입력창에 문자열을 입력했음에도 불구하고, 오류의 출력 없이 앞으로 돌아가는 모습을 볼 수 있다.
'JAVA' 카테고리의 다른 글
6. 생성자 (0) | 2020.03.27 |
---|---|
클래스, 객체, 인스턴스 (0) | 2020.03.27 |
JAVA 실습 4. for문을 이용해 배열을 뒤집어서 출력하기 (0) | 2020.03.24 |
JAVA 실습 2. for문에 배열문을 합해 동전의 갯수를 구하는 프로그램 (0) | 2020.03.23 |
JAVA 실습 1. 사용자로부터 입력 받은 구구단 프로그램 완성하기. (0) | 2020.03.23 |