국비 수업을 들으면서 첫 팀프로젝트로 UP-DOWN 게임을 만들었다.
조건은 이렇다.
<업다운게임 제작하기>
<<<<요구사항>>>>
1. 1~100 사이의 정수가 랜덤으로 정답설정됩니다.
2. 사용자는 업다운게임을 합니다.
50 DOWN
25 UP
26 정답입니다! :D
3. 정답을 5번안에 맞추게되면 명예의 전당에 기록됩니다.
이름을 입력하세요. >> 작은 티모
4. 다음게임을 할때 [명예의 전당 : 티모]
5. 명예의 전당보다 빨리 맞추면
6. 새로 이름을 입력받습니다.
처음에는 나는 전공생이기 때문에 조원분들에 비해 조금이나마 더 익숙하니까 같이 코드를 짜본 후에 마지막에 내가 혼자 다듬을 생각이었다. 하지만 다들 너무 생각보다 잘 하고 열심히 하셔서 내가 손을 댈 부분은 별로 없었던 것 같다.
한 조원분이 notion을 이용할 생각을 하셔서 notion을 이용해서 팀 프로젝트의 진행방향과 과정이 자세히 담겼다.
https://minibcake.notion.site/4-6357d209bb5c4d99b39a95eb1136a579?pvs=4
자세한 부분은 노션을 참고했으면 좋겠다.
아래는 우리 팀의 최종 업다운게임 코드이다. 최대한 주석을 많이 사용해서 가독성과 이해를 높이려고 노력했다.
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();
System.out.println("이름을 다시 입력해주세요");
}
} // 명예의전당 if문 종료
//종료
break;
}
}
// 범위가 아니었을 때
System.out.println("유효한 값이 아닙니다.");
System.out.println(min + "에서 " + max + "사이의 정수를 입력해주세요");
}//2번째 while문 종료
}//else if (menu == 2) 종료
} // 게임 while 종료
}// main
}// class
함수를 사용하지 않고 짠 코드이다.
<<셀프 리뷰>>
+
잘했던 점
1. notion을 이용한 점 - 회의록을 쉽게 작성할 수 있었음
2. 한명이 몰빵으로 한 것이 아닌, 모두가 참여해서 어느 누가 발표를 하던 상관이 없었음
3. 코드 및 주석 정리가 자세했다고 생각
-
아쉬웠던 점
1. 함수 사용 x
2. java.util.InputMismatchException 고려하지 않음 - 입력값에 정수가 아닌 문자열을 넣으면 오류가 발생함
3. 요구사항과 뉘앙스에 맞는 코드위치가 아니었음 ( 명예의 전당 )
(( 총합 ))
함수를 사용했다면, 가독성과 유지보수가 용이했을 것이고, 각자 코드를 짤 때 분배하기가 더 쉬웠을 것이다.
하지만 팀 프로젝트를 진행 도중에 함수를 배웠다. 함수를 쓸까 했지만 이미 다 짜여진 코드에서 함수를 추가하는게 너무 복잡하다는 생각이 들어서 상의하에 우리조는 함수를 사용하지 않기로 했다.
다만 사용했으면 어땠을까 하는 아쉬움이 남기는 했다.
다만 국비 시작한 지 일주일도 안 된 상황에서 첫 번째 팀플 치고는 잘 했다고 생각한다.
혼자 해낼 수도 있는 어렵지 않은 코드를 짜는 것이었지만, 팀프로젝트의 주 목적인 "협동" 면에서는 만족스러웠다.
'프로젝트' 카테고리의 다른 글
COMA 클라이밍 크루 최종 프로젝트 자료 (0) | 2024.11.14 |
---|---|
[팀 프로젝트] COMA 클라이밍 크루 커뮤니티 중간 프로젝트 후기 및 느낀점 (1) | 2024.10.01 |
[JAVA] 쇼핑몰 프로그램 MVC 패턴으로 구현하기 프로젝트 (0) | 2024.07.24 |
[JAVA] 포켓몬 게임 프로젝트 - 2 (1) | 2024.07.12 |
[JAVA] 포켓몬 게임 프로젝트 (2) | 2024.07.12 |