본문 바로가기

컴퓨터언어/JAVA(자바)

[JAVA강좌] 20강 자바기본문법으로 게임제작하기 - 업다운게임

728x90
반응형

 

 

 

 

 

 

 

- 이번에는 기존에 배웠던 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]을 통해서 계속 변화를 주고 확인해 보세요.

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

 

 

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을 누르면 프로그램을 종료합니다. 

 

 

 

 

 

 

 

 

728x90
반응형