- 이번에는 기존에 배웠던 1~19강까지 배웠던 내용을 가지고 게임을 제작해 보겠습니다.
- 변수, Scanner, String, 조건문, 반복문 정도로만 제작하는 게임이니 참고해 주시길 바랍니다.
1. UpDown게임
- 술자리나 예능에서 본 적 있던 게임입니다.
- 1~100 사이 숫자 중 랜덤한 숫자를 받은 후, 사용자가 부른 숫자보다 높으면 [UP], 낮으면 [DOWN]을 반환하고 몇 번만에 맞추는지 확인하는 게임을 제작해보겠습니다.
1) Math.random()
- 아직 배운 적이 없기 때문에 랜덤한 숫자를 어떻게 구하는지 보겠습니다.
- Math 클래스는 추후 클래스를 자세히 배운 후 디테일하게 보겠습니다.
- 간단하게 설명하자면 수학적 계산을 쉽게 해 주도록 제공해 주는 클래스라고 보면 됩니다.
- 이번 강좌에서는 랜덤 한 숫자를 구하는 것만 보도록 하겠습니다.
- 아래에서는 직접 실습으로 확인해 보겠습니다.
- 패키지(ch13_basic_game)과 클래스(Ex01_MathRandom.java)를 추가해 주세요.
- 기초적 작업을 모르는 분은 아래 주소를 클릭하고 보고 오세요.
https://ossam5.tistory.com/613
## Math random 실습1 - Ex01_MathRandom.java
package ch13_basic_game;
public class Ex01_MathRandom {
public static void main(String[] args) {
//랜덤한 숫자를 0~1사이 실수로 반환
System.out.println(Math.random());
}
}
- Math.random()을 출력해 보겠습니다.
## Math random 결과1 - Ex01_MathRandom.java
- 위에 나온 숫자는 항상 같지 않습니다.
- 0~1사이의 실수가 나올 겁니다.
## Math random 실습2 - Ex01_MathRandom.java
package ch13_basic_game;
public class Ex01_MathRandom {
public static void main(String[] args) {
//랜덤한 숫자를 0~1사이 실수로 반환
System.out.println(Math.random());
//랜덤한 정수의 범위를 지정하는 변수
int min = 1, max = 5;
//원래 실수여서 (int)로 형변환해야 정수로 반환
int random = (int)(Math.random() * (max - min + 1) + min);
//랜덤한 수 출력
System.out.println("랜덤한 수 : " + random);
}
}
- 코드에 주석을 달아놨습니다.
- 랜덤한 정수의 범위는 최소값을 1, 최대값을 5로 처리했습니다.
- 랜덤한 수는 정수여야 하므로 int를 통해서 형변환을 해줍니다.
- 정수의 범위를 지정하는 코드는 공식처럼 외워주면 좋겠습니다.
- [ (int)(Math.random() * (max - min + 1) + min); ] 라고 작성하면 됩니다.
## Math random 결과2 - Ex01_MathRandom.java
- 랜덤한 수는 1~5 사이의 정수가 나오는 것을 확인할 수 있습니다.
- [Ctrl]+[F11]을 통해서 계속 변화를 주고 확인해 보세요.
2) 반복문과 메뉴 출력
- 일단 게임의 기본 메뉴 출력과 반복문을 통해 프로그램을 종료하는 것까지 확인을 해보겠습니다.
## UpDown 게임 실습1 - Ex02_UpDownGame.java
package ch13_basic_game;
import java.util.Scanner;
public class Ex02_UpDownGame {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); //스캐너 출력
int menu; //메뉴를 입력받을 변수
//반복문 시작
do {
//메뉴 출력
System.out.println("=====게임 메뉴=====");
System.out.println("1. 업다운게임 실행");
System.out.println("2. 최고기록 확인");
System.out.println("3. 프로그램 종료");
//메뉴 입력받기
System.out.print("메뉴 선택 : ");
menu = scan.nextInt();
}while(menu != 3); //menu가 3과 같지 않으면 계속 반복
scan.close(); //스캐너 종료
}
}
- 간단하게 스캐너를 통해 사용자에게 정수를 입력받을 수 있도록 Scanner 클래스를 사용했습니다.
- 반복문을 통해 메뉴출력을 계속 반복적으로 실행할 건데, 3번 메뉴를 선택하면 프로그램을 종료합니다.
## UpDown 게임 결과1 - Ex02_UpDownGame.java
- 게임메뉴 선택 시 1을 누르면 또 반복, 2를 눌러도 또 반복됩니다.
- 3을 누르면 더 이상 반복되지 않는 것을 확인할 수 있습니다.
3) switch문을 통해 메뉴에 따른 명령 작성
- 그럼 메뉴를 1~3 선택했을 때의 명령을 작성하기 위해 switch문을 쓰겠습니다.
- if문을 써도 되지만, switch문이 정확한 값에 대한 배당이므로 더 효과적입니다.
- 그리고 1~3이 아닌 값을 입력해도 잘못입력했다고 반환해야겠죠?
## UpDown 게임 실습2 - Ex02_UpDownGame.java
package ch13_basic_game;
import java.util.Scanner;
public class Ex02_UpDownGame {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); //스캐너 출력
int menu; //메뉴를 입력받을 변수
//반복문 시작
do {
//메뉴 출력
System.out.println("=====게임 메뉴=====");
System.out.println("1. 업다운게임 실행");
System.out.println("2. 최고기록 확인");
System.out.println("3. 프로그램 종료");
//메뉴 입력받기
System.out.print("메뉴 선택 : ");
menu = scan.nextInt();
//메뉴 선택에 따른 명령 메뉴
switch(menu) {
case 1:
//업다운게임 실행
break;
case 2:
//최고기록 확인
break;
case 3:
//알림 문구만 출력
System.out.println("프로그램을 종료합니다.");
break;
default:
//알림 문구만 출력
System.out.println("잘못입력하였습니다.");
System.out.println("메뉴는 1~3사이 정수로 입력하세요.");
break; //마지막이라 생략해도 문제가 없음
}
}while(menu != 3); //menu가 3과 같지 않으면 계속 반복
scan.close(); //스캐너 종료
}
}
- 그럼 입력받은 메뉴 선택에 따른 명령 메뉴를 switch문으로 작성했습니다.
- 아직 메뉴 1과 메뉴 2에 대한 명령은 작성하지 않았습니다.
- 3을 누르면 반복문이 종료하지만, 사용자에게 알림 문구를 주는 것이 더 효율적이어서 작성했습니다.
- 그리고 default구문을 통해 다른 것을 누르면 잘못입력했다고 역시 알림 문구를 줍니다.
## UpDown 게임 결과2 - Ex02_UpDownGame.java
- 없는 메뉴인 4를 누르면 잘못되었다는 알림 문구가 뜨고, 다시 메뉴를 반복합니다.
- 3을 누르면 프로그램 종료를 알리는 문구가 뜨고, 메뉴를 다시 반복하지 않습니다.
4) 업다운게임과 최고기록확인
- 그럼 1을 눌렀을 때 업다운 메뉴를 실행하고, 2를 누르면 최고기록을 확인해 보겠습니다.
## UpDown 게임 실습3 - Ex02_UpDownGame.java
package ch13_basic_game;
import java.util.Scanner;
public class Ex02_UpDownGame {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); //스캐너 출력
int menu; //메뉴를 입력받을 변수
//다른 반복문에서 같이 사용해서 밖에 선언
int count = 0; //몇번만에 업다운게임의 랜덤한 숫자를 맞춰는지 횟수담는 변수
int bestCount = -1; //업다운 게임 중 가장 작은 횟수(count)를 담을 변수
//반복문 시작
do {
//메뉴 출력
System.out.println("=====게임 메뉴=====");
System.out.println("1. 업다운게임 실행");
System.out.println("2. 최고기록 확인");
System.out.println("3. 프로그램 종료");
//메뉴 입력받기
System.out.print("메뉴 선택 : ");
menu = scan.nextInt();
//메뉴 선택에 따른 명령 메뉴
switch(menu) {
case 1:
//업다운게임 실행
//랜덤 수 범위 : 1~100
int min = 1, max = 100;
//랜덤한 수 받는 변수
int r = (int)(Math.random() * (max - min + 1) + min);
//사용자가 입력한 정수를 받을 변수
int num = 0;
count = 0; //게임 시작전에 초기화처리 - 게임할 때 누적이 안되도록 처리
//업다운 게임 반복적 실행
do {
//정수입력
System.out.print("입력 : ");
num = scan.nextInt();
//입력한횟수를 1증가
count++;
//입력한 정수와 랜덤한 수 비교후 Up/Down/정답 출력
if(num > r) {
System.out.println("Down!");
}else if(num < r) {
System.out.println("Up!");
}else {
System.out.println("정답!");
}
}while(num != r); //사용자가 랜덤한 수를 맞추지 못하면 계속 실행
System.out.println("기록 : " + count); //현재 기록을 출력
//현재 횟수가 기존 값 -1이거나 최고기록 횟수보다 좋으면
if(bestCount == -1 || count < bestCount) {
//최고 기록횟수를 현재 횟수로 수정
bestCount = count;
}
break;
case 2:
if(bestCount == -1) { //최고기록 확인 후 -1이면
//알림 문구 출력 후
System.out.println("플레이한 기록이 없습니다.");
break; //현재 케이스, 최고기록확인 벗어나기
}
//최고기록을 출력
System.out.println("최고기록 : " + bestCount);
break;
case 3:
//알림 문구만 출력
System.out.println("프로그램을 종료합니다.");
break;
default:
//알림 문구만 출력
System.out.println("잘못입력하였습니다.");
System.out.println("메뉴는 1~3사이 정수로 입력하세요.");
break; //마지막이라 생략해도 문제가 없음
}
}while(menu != 3); //menu가 3과 같지 않으면 계속 반복
scan.close(); //스캐너 종료
}
}
- 코드 관련된 설명은 주석으로 달아놨으니 잘 확인해 주시길 바랍니다.
- 변수 count와 bestCount는 반복문 내부에서 다른 case에서 사용하기 때문에 반복문 밖에 미리 선언해 놓습니다.
- case1인 경우에는 랜덤한 숫자를 반환받고, 사용자에게 입력값을 받은 후 업다운 게임을 실행합니다.
- case2인 경우는 case1에서 bestCount값을 조절한 후 최고 기록을 담아줍니다.
- 이때 case1을 실행한 경우가 없는 경우도 대비해서 알림 문구를 만들어 줍니다.
## UpDown 게임 결과 3 - Ex02_UpDownGame.java
- 처음부터 메뉴 2인 최고기록은 확인하면 플레이한 기록이 없다고 뜨는 것을 확인할 수 있습니다.
- 메뉴 1로 업다운 게임을 실행하고 랜덤 수를 맞춰 봅니다.
- 저는 5번 만에 맞췄네요. 녹색은 사용자가 직접 연결을 해보는 겁니다.
- 다시 메뉴 1로 최고기록을 확인해 보니 아까의 기록이 5로 나옵니다.
- 메뉴 3을 누르면 프로그램을 종료합니다.
'컴퓨터언어 > JAVA(자바)' 카테고리의 다른 글
[JAVA강좌] 22강 메서드와 게터세터 (0) | 2024.01.17 |
---|---|
[JAVA강좌] 21강 클래스와 객체 (0) | 2024.01.16 |
[JAVA강좌] 19강 반복문관련 - break와 continue (0) | 2024.01.15 |
[JAVA강좌] 18강 반복문 - for문 (0) | 2024.01.11 |
[JAVA강좌] 17강 반복문 - while과 do while (0) | 2024.01.11 |