이번 시간에는 주사위 게임을 만들어보도록 하겠습니다.
지금까지 한 실습 중 가장 복잡했는데요.
게임의 요구 사항을 먼저 살펴보겠습니다.
========================================================
주사위 게임 (main함수만 사용)
유저랑 컴퓨터 각각 주사위 3개를 굴려서 그 합이 높은 숫자가
나온 쪽이 이기는 게임
1번 메뉴 :
유저와 컴퓨터는 각각 주사위 3개씩 굴릴 것!
유저는 굴린 주사위의 값을 확인한 후 (주사위의 합까지)
돈을 배팅할 수 있게 해서
이기면 그 돈만큼 따고, 지면 잃게 됨
소지금보다는 많이 배팅할 수 없고, 기본 소지금 10000원 시작
한 판 끝나면 재도전 의사를 물을 것 no -> 메뉴
소지금 다 잃으면 메뉴로 돌아가기
2번 메뉴 :
전적확인 (승 / 무 / 패 / 소지금)
3번 메뉴 : 대출
4번 메뉴 : 상환
5번 메뉴: 종료
========================================================
저는 여기서 소지금을 확인하는 기능을 추가했습니다.
차근차근 시작해볼까요?
System.out.println(" ");
System.out.println("♠ WELCOME TO DICELAND ♧");
System.out.println(" ");
menu :while(true) {
System.out.println("==================================================");
System.out.println("= 1.게임 2.전적확인 3.소지금 확인 4. 대출 5. 상환 6. 종료 =");
System.out.println("==================================================");
int option = sc.nextInt();
먼저 게임 시작을 알리고
옵션을 입력 받습니다.
이 부분은 많이 했었기 때문에 넘어가겠습니다.
game : while(true) {
System.out.println(" ");
System.out.println("$ 얼마를 배팅하시겠습니까? $");
System.out.println(" ");
batting_money = sc.nextInt();
if(batting_money > user_money) {
System.out.println();
System.out.println("소지금보다 배팅 머니가 많습니다.");
System.out.println();
Thread.sleep(1000);
System.out.println();
System.out.println("다시 입력하세요.");
System.out.println();
Thread.sleep(1000);
continue game;
}
System.out.println(" ");
System.out.printf("배팅 금액 : %d원\n",batting_money );
System.out.println(" ");
for (int i = 0; i < 3; i++) {
ai_dice[i] = r.nextInt(6)+1;
user_dice[i] = r.nextInt(6)+1;
ai_sum += ai_dice[i];
user_sum += user_dice[i];
}
옵션 1번의 경우 게임을 시작하는데
얼마를 배팅할지 입력받고
소지금보다 배팅 머니가 많을경우
다시 게임을 시작하고 (continue 사용)
아니라면
배열에 사용자의 주사위 숫자와
컴퓨터의 주사위 숫자들을 넣습니다.
Thread.sleep(1500);
System.out.println(" ");
System.out.println("게임을 시작합니다!");
System.out.println(" ");
Thread.sleep(1500);
System.out.println(" ");
System.out.println("유저의 주사위 굴리는 중..");
System.out.println(" ");
Thread.sleep(1500);
System.out.println(" ");
System.out.print("유저의 주사위 눈은 : ");
for (int n : user_dice) {
Thread.sleep(1000);
System.out.printf( n + " ");
}
System.out.println(" ");
Thread.sleep(1000);
System.out.println();
System.out.println(" ");
System.out.print("유저의 주사위 합은 : ");
Thread.sleep(1000);
System.out.printf( "%d" + " ", user_sum);
Thread.sleep(1500);
System.out.println(" ");
System.out.println(" ");
System.out.println(" ");
System.out.println("컴퓨터의 주사위 굴리는 중..");
System.out.println(" ");
Thread.sleep(1500);
System.out.println(" ");
System.out.print("컴퓨터의 주사위 눈은 : ");
for (int n : ai_dice) {
Thread.sleep(1000);
System.out.printf( n + " ");
}
System.out.println(" ");
System.out.println();
Thread.sleep(500);
System.out.println(" ");
System.out.print("컴퓨터의 주사위 합은 : ");
사용자의 주사위 합과
컴퓨터의 주사위 합을
출력합니다.
Thread.sleep(1000);
System.out.printf( "%d" + " ", ai_sum);
System.out.println();
System.out.println(" ");
System.out.println(" ");
System.out.println(" ");
Thread.sleep(1000);
System.out.printf("☞ 유저의 주사위 합 : %d \t\n", user_sum );
System.out.println(" ");
Thread.sleep(1000);
System.out.printf("☞ 컴퓨터의 주사위 합 : %d \t\n", ai_sum );
System.out.println(" ");
if(user_sum > ai_sum) { //유저 승리
user_money += batting_money;
ai_money -= batting_money;
Thread.sleep(2000);
System.out.println(" ");
System.out.println("유저의 승리!");
System.out.println(" ");
System.out.println(" ");
Thread.sleep(2000);
System.out.printf("%d원을 획득하셨습니다.\n", batting_money);
System.out.println(" ");
System.out.println(" ");
win++;
}else if(user_sum < ai_sum) { //컴퓨터 승리
ai_money += batting_money;
user_money -= batting_money;
System.out.println(" ");
System.out.println(" ");
System.out.println("컴퓨터의 승리!");
System.out.println(" ");
System.out.println(" ");
System.out.printf("%d원을 잃었습니다..\n", batting_money);
System.out.println(" ");
System.out.println(" ");
lose++;
주사위의 합을 비교해서
많은쪽이 승리하고
승리 여부에 따라 승리카운트나
패배카운트를 증가시킵니다.
if(user_money <= 0) {
System.out.println(" ");
System.out.println("소지금을 전부 잃었습니다.");
System.out.println(" ");
System.out.println("메뉴로 돌아갑니다.");
System.out.println(" ");
continue menu;
}
소지금을 전부 잃을 경우 메뉴로 돌아가고
}
else {
System.out.println(" ");
System.out.println("무승부네요!\t");
System.out.println(" ");
draw++;
}
이거나 질 경우가 아닐경우
draw카운트를 증가시킵니다.
Thread.sleep(1000);
System.out.println("재도전하시겠습니까? 1.Y 2. N");
int menu = sc.nextInt();
if (menu == 1) {
continue game;
}
else if(menu == 2) {
continue menu;
}
}
}
1 또는 2를 입력받고
게임을 재실행 하거나 메뉴로 돌아갑니다.
else if(option == 2) {
System.out.println("┌────────────────┐");
System.out.println("│ 전적 ");
System.out.printf("│%d 승 / %d 패 / %d무\n", win,lose,draw);
System.out.println("└────────────────┘");
메뉴에서 2번을 입력하면 전적을 보여줍니다.
이떄는 증가시킨 카운트를 출력합니다.
else if(option == 3) {
System.out.println("┌────────────────┐");
System.out.println("│ 소지금 ");
System.out.printf("│ %d원 \n", user_money);
System.out.println("└────────────────┘");
}
3번의 경우 소지금을 보여줍니다.
else if(option == 4) {
System.out.println(" ");
System.out.println("대출 서비스입니다.");
System.out.println(" ");
System.out.println("대출 받으실 금액을 입력하세요.");
borrow = sc.nextInt();
user_money += borrow;
Thread.sleep(1000);
System.out.println(" ");
System.out.printf("%d원을 대출하셨습니다.\n", borrow);
System.out.println(" ");
System.out.println("메뉴로 돌아가는 중..");
Thread.sleep(1000);
continue menu;
}
4번은 대출해주는 기능인데
사용자에게 대출할 금액을 입력받고
얼마를 대출했는지 출력 후
메뉴로 돌아갑니다.
else if(option == 5) {
pay : while(true) {
System.out.println(" ");
System.out.println("상환 서비스입니다.");
System.out.println(" ");
Thread.sleep(1500);
System.out.printf("현재 갚으실 돈은 %d원입니다.\n", borrow);
System.out.println(" ");
Thread.sleep(1500);
if(borrow == 0) {
System.out.println("상환하실 금액이 없습니다.");
System.out.println(" ");
Thread.sleep(1500);
System.out.println("메인 메뉴로 돌아갑니다.");
System.out.println(" ");
continue menu;
}
System.out.println("상환하실 금액을 입력하세요.");
pay = sc.nextInt();
다음은 5번의 상환기능인데
빌린 금액이 0 즉, 상환 금액이 없으면
메인 메뉴로 돌아가고
아니면 상환 금액을 입력받습니다.
if(pay > borrow) {
Thread.sleep(1500);
System.out.println(" ");
System.out.println("상환 조건이 충족되지 않습니다.\n\n돌려드리겠습니다.");
System.out.println(" ");
Thread.sleep(1500);
System.out.println("상환 메뉴로 돌아갑니다.");
System.out.println(" ");
Thread.sleep(1500);
continue pay;
}
상환한 금액이 빌린 돈보다 많으면
상환 메뉴로 continue를 써서 돌아갑니다.
borrow -= pay;
user_money -= pay;
Thread.sleep(1000);
System.out.println(" ");
System.out.printf("%d원을 상환하셨습니다.\n", pay);
System.out.println(" ");
Thread.sleep(3000);
if(borrow == 0) {
System.out.println(" ");
System.out.println("빛 청산 완료!");
System.out.println(" ");
}
System.out.println("메뉴로 돌아가는 중..");
Thread.sleep(1000);
continue menu;
}
아니라면 유저의 돈을 상환한만큼 감소시키고
모두 갚으면 빛 청산 완료 메세지를 출력합니다.
기능을 실행 후 메뉴로 돌아갑니다.
else if(option == 6) {
System.out.println("게임을 종료합니다..");
Thread.sleep(1500);
return;
}
6번을 입력하면 프로그램을 종료합니다.
else {
System.out.println("메뉴의 번호를 1~3까지 다시 입력해주세요");
}
}
}
다른 숫자를 입력하면 메세지를 출력하고
처음 반복문으로 돌아갑니다.
==================================================
= 1.게임 2.전적확인 3.소지금 확인 4. 대출 5. 상환 6. 종료 =
==================================================
1
$ 얼마를 배팅하시겠습니까? $
5000
배팅 금액 : 5000원
게임을 시작합니다!
유저의 주사위 굴리는 중..
유저의 주사위 눈은 : 4 6 2
유저의 주사위 합은 : 12
컴퓨터의 주사위 굴리는 중..
컴퓨터의 주사위 눈은 : 2 6 2
컴퓨터의 주사위 합은 : 10
☞ 유저의 주사위 합 : 12
☞ 컴퓨터의 주사위 합 : 10
유저의 승리!
5000원을 획득하셨습니다.
재도전하시겠습니까? 1.Y 2. N
코드가 긴만큼 출력도 길게되네요.
잘 출력되는 모습입니다.
지금까지 썼던 반복문과
많은 수의 변수 컨트롤,
continue기능이 핵심인 실습이었습니다.
간단한 주사위 게임인데도 상환할 금액이 없거나
배팅할 금액이 없을 경우,
빌린 돈보다 상환을 많이 할 경우 등
다양한 변수들이 생길 수 있다는 점이 신기했고
신경써야 한다는 것을 알게 된 것 같습니다.
감사합니다!
'Java > 실습' 카테고리의 다른 글
[Java] N의 배수 고르기 (1) | 2024.12.05 |
---|---|
[Java] 제곱수 판별하기 (0) | 2024.12.05 |
[Java] 로또 (0) | 2024.12.05 |
[Java] 가위 바위 보 (1) | 2024.12.04 |
[Java] 배스킨라빈스 31게임 (0) | 2024.12.04 |