코딩항해기

[Team] UpDown 게임 만들기 본문

Project

[Team] UpDown 게임 만들기

miniBcake 2024. 6. 29. 17:12

 

 

UpDown 게임 만들기

java / Eclipse

4인참여

240626 ~ 240701

 

java 제어문 연습을 위한 팀 프로젝트를 진행하였다.


 

[요구사항 ]

  1. 1~100사이의 정수가 랜덤으로 정답 설정됩니다.
  2. 사용자는 업다운 게임을 합니다.
  3. ( 50down후 70이 입력되어선 안됨 49에서 1 사이의 값이 입력되어야함/ 26 정답입니다! :D)
  4. 정답을 5번 안에 맞추게 되면 명예의 전당에 기록됩니다.
  5. 이름을 입력하세요 >> 작은 티모
  6. 다음 게임을 할 때 [명예의 전당 : 작은 티모]
  7. 명예의 전당보다 빨리 맞추면
  8. 새로 이름을 입력받습니다.

 

[게임설명]

  1. 컴퓨터가 1~100 중에서 임의의 수를 랜덤으로 정하면, 플레이어가 해당 수를 맞히는 게임입니다.
  2. 컴퓨터가 정한 수가 플레이어가 말한 수보다 작으면 컴퓨터는 '업'이라고 말하고, 크다면 컴퓨터는 '다운'이라고 말해서 힌트를 줍니다
  3. 플레이어는 힌트를 토대로 컴퓨터가 정한 수를 맞혀야 합니다.
  4. 명예의 전당에 기록된 횟수보다 적은 횟수에 맞추게 되면 명예의 전당에 오르게 됩니다.

 

[패키지, 클래스명 설정]

package명: teamproject

class명: Updowngame

 

 

[변수명]

랜덤정답변수 : int ans
사용자 입력값 : int guess
사용자 입력가능 범위지정  : int max
사용자 입력가능 범위지정 : int min
시도 횟수 : int attempt
명예의 전당 이름 : String king
명예의 전당 기록(횟수) : int kingAttempt
사용자 선택값 : int menu 

 

[로직구성]

더보기
  1. while(true){
  2. 게임설명(1), 게임 시작하기(2), 게임종료 선택(0) - menu
    1. 유효성검사
  3. if(게임종료(0)를 선택하면) > 게임프로그램 종료
  4. else if(게임설명(1)을 선택하면) > 게임설명 안내
  5. else(게임시작하기(2)를 선택하면 ) > 랜덤값 설정 (ans)
  6. 범위 max, min, 시도횟수 기본값으로 초기화(100, 1, 0)
  7. if(king ≠ null)만약, 명예의 전당에 값이 있다면 명예의 전당 이름 출력{syso king} >>메뉴안내때나오게수정
    1. while(true){//2번째 while문
  8. 입력값 받기
  9. 유효값 검증(min~max인지)
  10. 유효한 값이라면 정답과 비교
    1. if(정답이 입력값보다 크면)
      1. min 값에 입력값을 넣음
      2. 출력 : up
      3. 시도횟수 ++
    2. if(정답이 입력값보다 작으면)
      1. max값에 입력값을 넣음
      2. 출력 : down
      3. 시도횟수 ++
    3. 정답을 입력하면if(ans == num) { //두번째while문 종료조건
      1. if(attempt<= 5 && kingAttempt > attempt)시도횟수가 5이하고 명예의 전당 기록보다 횟수가 낮다면
      2. {syso 명예의 전당 등록 대상자 입니다 이름을 입력해주세요
      3. king = sc.nextLine(); 이름 값 입력받아저장하기
      4. kingAttempt = attempt; 명예의 전당 기록 갱신하기 }
      5. break;
    4. }while 종료//2번째while문
  11. }while종료

 

[파트분배] (로직번호기준)

[랜덤값/프로그램메뉴/유효값검증] 1~ 4, 11 miniBcake(담당파트)

[초기화/입력/유효값검증] 6, 8, 9  - AAA [팀장]

[down/up/정답기능] 10 (1,2) - BBB

[명예의 전당] 7, 10 (3) - CCC

 

[코드]

package teamproject;

import java.util.Random;
import java.util.Scanner;
/*
팀과제 )

업다운 게임 제작하기

요구사항

1. 1 ~ 100 사이의 정수가 랜덤으로 정답설정됩니다.
2. 사용자는 업다운 게임을 합니다.
      50 down
      25 up
      26 정답입니다! :D
3. 정답을 5번안에 맞추게 되면 명예의 전당에 기록됩니다.
      이름을 입력하세요. >> 작은 티모
4. 다음 게임을 할 때 [명예의 전당 : 작은 티모]
5. 명예의 전당보다 빨리 맞추면
6. 새로 이름을 입력받습니다.

 */

public class Updowngame {

	public static void main(String[] args) {

		int ans; // 랜덤정답변수
		int guess; // 사용자 입력값
		int max; // 사용자 입력가능 범위지정
		int min; // 사용자 입력가능 범위지정
		int attempt; // 시도 횟수
		String king = ""; // 명예의 전당 이름
		int kingAttempt = 6; // 명예의 전당 기록(횟수)
		int menu; // 사용자 선택값

		Scanner sc = new Scanner(System.in);
		Random rd = new Random();

		System.out.println(".*[업다운 게임]*.");
		while (true) {
			// 메뉴 안내
			System.out.println("*.*.*.*.*.*.*.*");
			System.out.println("1. 게임 설명");
			System.out.println("2. 게임 시작");
			System.out.println("0. 게임 종료");

			if (king != "") {
				System.out.println("★☆[명예의 전당 : " + king + "님 (기록 : "+kingAttempt+"회)]☆★");
			}

			System.out.println("*.*.*.*.*.*.*.*");

			// 메뉴 입력값 검증
			while (true) {
				System.out.print("메뉴 번호 선택 >> ");
				menu = sc.nextInt();

				// 메뉴 입력값 while 종료조건
				if (0 <= menu && menu <= 2) {
					break;
				}

				// 제대로 된 입력값 안내
				System.out.println("해당하는 메뉴가 없습니다.");
				System.out.println("게임에 대한 설명을 들으려면 1 ,\n" 
						+ "게임을 시작하려면 2 ,\n" 
						+ "게임을 종료하려면 0 를 입력바랍니다.");
			} // 메뉴 입력값 검증 while종료

			// 게임 while 종료조건
			if (menu == 0) {
				System.out.println("업다운 게임을 종료합니다.");
				break;
			}

			// 게임설명
			else if (menu == 1) {
				System.out.println("[게임설명]\n" 
						+ "1. 컴퓨터가 1~100 중에서 임의의 수를 랜덤으로 정하면, 플레이어가 해당 수를 맞히는 게임입니다.\n"
						+ "2. 컴퓨터가 정한 수가 플레이어가 말한 수보다 작으면 컴퓨터는 '업'이라고 말하고,\n" 
						+ "   크다면 컴퓨터는 '다운'이라고 말해서 힌트를 줍니다.\n"
						+ "3. 플레이어는 힌트를 토대로 컴퓨터가 정한 수를 맞혀야 합니다.\n"
						+ "4. 명예의 전당에 기록된 횟수보다 적은 횟수에 맞추게 되면 명예의 전당에 오르게 됩니다.");
			}

			// 게임 시작 menu == 2
			else if (menu == 2) {
				System.out.println("업다운 게임을 시작합니다.");
				System.out.println("정답은 1~100까지의 정수 중에서 정해집니다.");

				ans = rd.nextInt(100) + 1; // 1~100 사이 정답 랜덤값 생성
				System.out.println("정답은 " + ans);// 테스트용

				// 6. 초기화
				max = 100;
				min = 1;
				attempt = 0;

				while (true) {// 2번째 while문
					// 명예의 전당에 값이 있다면 명예의 전당 이름 출력

					// 8. 사용자 입력
					System.out.print("정수를 입력해주세요 >> ");
					guess = sc.nextInt(); // 사용자가 추측하는 값

					// 9.유효값검증
					if (guess >= min && guess <= max) {// 최소값과 최대값 사이의 숫자 입력
						// guess이 ans보다 작다면 UP이라고 말한다
						if (guess > ans) {// guess이 ans보다 크다면 DOWN이라고 말한다
							// 그리고 다음번에 말해야할 수의 최댓값+1이 guess이 된다. ex) guess == 98 이라면 다음번에 97까지만
							System.out.println("down! 정답이 입력값보다 작습니다.");
							max = guess - 1;
							attempt++;
							continue;// 루프로 돌아가기
						} else if (guess < ans) {
							// guess이 ans보다 작다면 "UP"
							// 최솟값+1이 guess ex)guess==20 다음번에는 21부터 말할 수 있다.
							System.out.println("up! 정답이 입력값보다 큽니다.");
							min = guess + 1;
							attempt++;
							continue;
						} else {// guess==ans
							attempt++;
							System.out.println("정답입니다.");
							System.out.println("★☆당신의 시도횟수 : "+attempt+"회☆★");


							// 명예의 전당
		                     if (1 <= attempt && attempt < kingAttempt) {
		                        System.out.println("★☆ 축하드립니다! 당신은 명예의 전당 등록 대상자 입니다. ☆★");
		                        while(true) {
		                           System.out.print("이름을 입력해주세요 >> ");   
		                           
		                           String name = sc.next();
		                           System.out.print("입력하신 "+name+"으로 저장하시겠습니까? (Y/N) >> ");
		                           String answer = sc.next();
		                           
		                           if(answer.equals("Y")) {
		                        	  king = name;
		                              kingAttempt = attempt;//명예의 전당 기록 갱신
		                              break;
		                           }
		                           System.out.println("이름을 다시 입력해주세요.");
		                        }
		                     } // 명예의전당 if문 종료

							//종료
							break;
						}
					}
					// 범위가 아니었을 때
					System.out.println("유효한 값이 아닙니다.");
					System.out.println(min + "에서 " + max + "사이의 정수를 입력해주세요.");
				}//2번째 while문 종료
			}//else if (menu == 2) 종료
		} // 게임 while 종료
	}// main
}// class

 

 

[후기]

min~max범위와 ans(랜덤값)의 범위는 같아야하기 때문에

ans값을 설정할 때 괄호 안의 값을 max로 넣었다면 하드코딩을 피할 수 있었을 것 같다.

(이 경우 출력문에도 min max로 넣었어야 한다.)

 

반복되는 부분을 메소드로 넣거나 if문에서 빼서 넣었다면 더욱 좋았을 것 같다.

(attempt++ 같은 부분들 + 해당 부분의 contiune처럼 굳이 필요하지 않은 코드도 빼는 것이 좋았을 것 같다.)

 

그래도 팀끼리 불화 없이 잘 진행되었고, 의견통합도 잘 된 것 같아 좋았다.