상세 컨텐츠

본문 제목

홀짝 맞추기 게임을 자바로 구현해 보자!!(feat.오징어게임)

프로그래밍 언어/Java(자바)

by nyongtae 2022. 12. 2. 15:06

본문

※ 본 게시글은 자바 프로그래밍을 좀 더 흥미있게 다루기 위한 주제일뿐 사행성 조장이 아님을 미리 밝힙니다 :)

 


여러분들!
어렸을 때 친구들과 많이 해봤을 거라고 생각됩니다. (저랑 같은 연배시라면..)
상대방이 동전들을 손에 넣고 주먹을 쥐고 있으면
홀! 짝! 이라는 구령(?)과 함께 본인이 거는 돈을 쥐고 친구의 손에 가져다 댑니다.
동전의 갯수가 홀인지 짝인지 맞췄다면 건 돈의 2배를!! 아니라면 건 돈을 모두 잃는...

넷플릭스 드라마 오징어게임에서도 관련된 에피소드가 있었죠

(오일남 曰 내가.. 방금... 뭐...라고.. 했더라..?)

 

 

이걸 자바로 구현해 보고자 합니다! 

여러분이 직접 플레이 해 보고
부족한점이나 더 추가하고 싶은 것들을 추가해 가면서
더 나은 프로그램으로 만들어 보는 것도 추천 드립니다. :)


 

서론이 길었습니다.
바로 구현해 보도록 하죠 :)

import java.util.InputMismatchException;
import java.util.Scanner;

public class OddOrEven {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);  //입력받기 위한 Scanner 객체 생성
		int account = 0;  //시작하는 Gold 액수

		System.out.println(">>프로그램 시작!");

		//사용자에게 시작 원금을 입력받습니다.(Gold 단위)
		boolean isString = true; //사용자가 Gold입력시 정수가 아닌 문자열을 입력하는지 확인할 flag
		while(isString) {
			try {
	 			System.out.print("*시작 원금(Gold): ");
				account = sc.nextInt();
				sc.nextLine();     //버퍼에 남아있는 Enter(개행) 제거
				isString = false; //nextInt()에서 예외가 발생하지 않았다면 정수이므로 
			} catch(InputMismatchException e) {
				sc.nextLine();  //예외발생시에도 Enter 제거. 안할시 무한루프.
				System.out.println("Gold를 정수로 입력하세요!!");
			}
		}

		int money = account; //이기고 짐에 따라 변하게 될 금액

		String choice = null;     // 홀인지 짝인지 선택
		int bet = 0;             // 베팅할 금액
		int num = 0;            // 홀(1) or 짝(2)을 저장할 변수
		String choS = null;    // 선택한 홀, 짝을 한글로 저장
		String result = null; // 랜덤(홀,짝)의 결과

		// 무한반복 : 1.메뉴 선택시 0번 입력으로 종료
		//           2.money가 0Gold -> 재도전(y/n)? y 이외의 문자 입력으로 종료
		while(true) {
			System.out.println("*현황 : " + money + "Gold");

			// 메뉴 출력
			System.out.print("1)홀 2)짝 입력 (0:프로그램종료): ");

			// 1(홀), 2(짝), 0(프로그램 종료)번 중 입력 받음
			choice = sc.nextLine();

			// 1, 2, 0번에 맞게 분기
			switch(choice) {
			case "1": choS = "홀"; break;
			case "2": choS = "짝"; break;
			case "0":
				System.out.println(">>프로그램 종료!");
				return;
			default: 
				System.out.println(">>다시 입력하세요."); 
				continue; //1,2,0 외의 다른 문자를 입력했을때 메뉴로 돌아가기
			}
            
			//베팅 : 몇 Gold를 걸것인가?
			//이경우는 위와 다르게 NumberFormatException 발생!!!
			isString = true;
			while(isString) {
				try {
					System.out.print("*bet: ");
					//따로 enter키를 버퍼에서 제거하는 것이 번거러울 경우 
					//아래와 같은 방법도 있습니다.
					bet = Integer.parseInt(sc.nextLine());
					isString = false;
				} catch(NumberFormatException e) {
					System.out.println("Gold를 정수로 입력하세요!!");
				}
			}

			//가지고 있는 Gold보다 많이 걸 경우 다시 메뉴로
			if(money < bet) {
				System.out.println(">>돈이부족하다.");
				continue;
			}

			//가지고 있는 Gold에서 베팅한 Gold만큼 차감
			money -= bet;

			//random() 메서드를 이용해서 홀(1) or 짝(2) 가져와 num에 정수 저장 
			num = (int)(Math.random()*2) + 1;

			//랜덤 결과를 한글로 저장
			result = (num == 1) ? "홀" : "짝";

			//홀짝 결과 출력
			System.out.println("*결과: " + result);

			//본인이 베팅한 것과 결과가 맞으면!!
			if(choS.equals(result)) {
				System.out.println("*Success!");
				//베팅한 Gold의 2배를 현재 가지고 있는 Gold에 더해줌
				money += bet * 2;
			}
			//결과가 다르다면!! 그대로 베팅한 Gold를 잃는다.
			else {
				System.out.println("*Fail!");
			}

			//가지고 있던 Gold가 0이 되면
			if(money == 0) {
				System.out.println(">>game set!");
				//재도전 여부를 물어보고
				System.out.println(">>재도전?(y/n): ");
				String str = sc.nextLine();
				//y를 입력했다면 초기 정했던 시작 Gold로 게임을 재시작
				if(str.equals("y")) {
					money = account;
					continue;
				}
				//y이외의 값을 입력했다면 게임 종료
				System.out.println(">>게임종료!");
				break;
			}
		}
	}
}

주석을 이용해서 코드를 설명해 놓았습니다. 

 


결과를 "홀" 또는 "짝"으로 생성하는 방법은 위와 같은 방법도 있지만

다른 방법도 있습니다.

String[] oae = {"홀", "짝"};
double random = Math.random();
int num = (int)Math.round(random * (oae.length-1));

System.out.println(oae[num]);

자 이렇게도 랜덤값(홀 or 짝)을 가져 올 수 있습니다.

위의 소스에 적용시켜서 바꿔보고 정상작동 하는지도 확인해 보세요 :)

 

또 하나! 

Gold가 많아질 경우 얼마를 보유하고 있는지 한 눈에 보기가 쉽지 않죠.

자 세자리마다 콤마(,)를 찍어 봅시다! (ex: 1,000,000Gold)

//금액 3자리마다 콤마(,) 표시
DecimalFormat formatter = new DecimalFormat("###,###");

System.out.println("*현황 : " + formatter.format(money) + "Gold");

 

진짜 마지막으로 하나만 더!

int형으로 받을 수 있는 정수는 한계가 있습니다. (양수 기준 2,147,483,647까지)

더 큰 범위의 숫자로 플레이하고 싶은 분들은 int형으로 사용했던 변수들을 long형으로 바꿔 보세요 :)

 


 

실행 결과입니다.
* 스크롤링 해가면서 확인해 보세요 :) 


(처참한 결과..)

 

자! 여기서 마무리 하고 다음에 또 흥미있는 코드로 찾아 오겠습니다~~ :)

관련글 더보기

댓글 영역