코딩항해기
[Team] UpDown 게임 만들기 본문
UpDown 게임 만들기
java / Eclipse
4인참여
240626 ~ 240701
java 제어문 연습을 위한 팀 프로젝트를 진행하였다.
[요구사항 ]
- 1~100사이의 정수가 랜덤으로 정답 설정됩니다.
- 사용자는 업다운 게임을 합니다.
- ( 50down후 70이 입력되어선 안됨 49에서 1 사이의 값이 입력되어야함/ 26 정답입니다! :D)
- 정답을 5번 안에 맞추게 되면 명예의 전당에 기록됩니다.
- 이름을 입력하세요 >> 작은 티모
- 다음 게임을 할 때 [명예의 전당 : 작은 티모]
- 명예의 전당보다 빨리 맞추면
- 새로 이름을 입력받습니다.
[게임설명]
- 컴퓨터가 1~100 중에서 임의의 수를 랜덤으로 정하면, 플레이어가 해당 수를 맞히는 게임입니다.
- 컴퓨터가 정한 수가 플레이어가 말한 수보다 작으면 컴퓨터는 '업'이라고 말하고, 크다면 컴퓨터는 '다운'이라고 말해서 힌트를 줍니다
- 플레이어는 힌트를 토대로 컴퓨터가 정한 수를 맞혀야 합니다.
- 명예의 전당에 기록된 횟수보다 적은 횟수에 맞추게 되면 명예의 전당에 오르게 됩니다.
[패키지, 클래스명 설정]
package명: teamproject
class명: Updowngame
[변수명]
랜덤정답변수 : int ans
사용자 입력값 : int guess
사용자 입력가능 범위지정 : int max
사용자 입력가능 범위지정 : int min
시도 횟수 : int attempt
명예의 전당 이름 : String king
명예의 전당 기록(횟수) : int kingAttempt
사용자 선택값 : int menu
[로직구성]
더보기
- while(true){
- 게임설명(1), 게임 시작하기(2), 게임종료 선택(0) - menu
- 유효성검사
- if(게임종료(0)를 선택하면) > 게임프로그램 종료
- else if(게임설명(1)을 선택하면) > 게임설명 안내
- else(게임시작하기(2)를 선택하면 ) > 랜덤값 설정 (ans)
- 범위 max, min, 시도횟수 기본값으로 초기화(100, 1, 0)
- if(king ≠ null)만약, 명예의 전당에 값이 있다면 명예의 전당 이름 출력{syso king} >>메뉴안내때나오게수정
- while(true){//2번째 while문
- 입력값 받기
- 유효값 검증(min~max인지)
- 유효한 값이라면 정답과 비교
- if(정답이 입력값보다 크면)
- min 값에 입력값을 넣음
- 출력 : up
- 시도횟수 ++
- if(정답이 입력값보다 작으면)
- max값에 입력값을 넣음
- 출력 : down
- 시도횟수 ++
- 정답을 입력하면if(ans == num) { //두번째while문 종료조건
- if(attempt<= 5 && kingAttempt > attempt)시도횟수가 5이하고 명예의 전당 기록보다 횟수가 낮다면
- {syso 명예의 전당 등록 대상자 입니다 이름을 입력해주세요
- king = sc.nextLine(); 이름 값 입력받아저장하기
- kingAttempt = attempt; 명예의 전당 기록 갱신하기 }
- break;
- }while 종료//2번째while문
- if(정답이 입력값보다 크면)
- }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처럼 굳이 필요하지 않은 코드도 빼는 것이 좋았을 것 같다.)
그래도 팀끼리 불화 없이 잘 진행되었고, 의견통합도 잘 된 것 같아 좋았다.
'Project' 카테고리의 다른 글
[Team/붕어빵원정대(중중프)] 테이블 설계 (0) | 2024.08.25 |
---|---|
[Team] 알흠 프로젝트 (0) | 2024.08.02 |
[Team] 쇼핑몰 프로그램 만들기 (2) | 2024.07.24 |
[Team] Pokemon 게임 만들기 (0) | 2024.07.11 |
[Personal/클론코딩] 숨고 : 숨은 고수 홈페이지 클론코딩 (0) | 2024.07.06 |