- 프로젝트 명: Princess Maker (프린세스 메이커)
- 개발 언어: Java
- 개발 환경: IntelliJ IDEA, Console 기반 실행
- 프로젝트 설명: 24개월 동안 프린세스를 육성하여 다양한 엔딩을 달성하는 육성 시뮬레이션 게임
- 육성 시뮬레이션 / 텍스트 기반 어드벤처
- 프린세스를 24개월(24턴) 동안 육성하여 원하는 엔딩에 도달하기
반역자들에 의해 왕국이 함락되고 왕과 왕비가 폐위되었다. 충직한 신하였던 당신은 아기 공주를 구출해 옆 왕국으로 도망쳤다. 공주의 신분을 숨기고 키워온 지 이제 2년 후면 그녀는 성인이 된다. 성인이 되면 출생의 비밀을 알려줄 것을 결심한 당신은, 공주가 왕국의 공주로서 당당히 설 수 있도록 다양한 능력을 길러주고자 한다.
- 매 턴마다 3가지 활동 중 하나를 선택
- 활동에 따라 능력치가 상승
- 12턴 후 직업을 선택하여 특정 능력치에 보너스 획득
- 최종 능력치에 따라 12가지 엔딩 중 하나로 분기
- 총 24턴 (1턴 = 1개월)
- 시작: 2025년 1월
- 종료: 2026년 12월
| 능력치 | 설명 | 초기값 |
|---|---|---|
| 체력 (Physical) | 육체적 활동과 관련된 능력 | 0 |
| 지능 (Intelligence) | 학습 및 지적 활동과 관련된 능력 | 0 |
| 매력 (Charm) | 사교 및 외모와 관련된 능력 | 0 |
증가 방식:
- 활동 선택 시 랜덤하게 증가 (주 능력치 7
12, 부 능력치 24) - 직업 보너스 적용 시 특정 능력치 50% 추가 증가
| 활동 | 주 증가 능력치 | 부 증가 능력치 | 설명 |
|---|---|---|---|
| 운동 | 체력 ↑↑ (7~12) | 지능 ↑ (2~4) | 육체적 단련 활동 |
| 공부 | 지능 ↑↑ (7~12) | 매력 ↑ (2~4) | 학습 및 지적 활동 |
| 사교 | 매력 ↑↑ (7~12) | 체력 ↑ (2~4) | 사람들과의 교류 활동 |
활동 실행 프로세스:
- 3가지 활동 중 선택 (잘못된 입력 시 재입력 요구)
- 활동 진행 애니메이션 출력 (점 애니메이션)
- 결과 출력 (대성공! 능력치 상승)
- 현재 능력치 표시
- Enter 입력으로 다음 턴 진행
입력 검증:
- 숫자 1, 2, 3만 입력 가능
- 잘못된 입력 시 오류 메시지 및 재입력 요구
- InputMismatchException 처리
선택 시점: 12턴 완료 후
| 직업 | 보너스 능력치 | 보너스 효과 | 특징 |
|---|---|---|---|
| 군인 (Soldier) | 체력 | +50% | "군인답게 ~을 수행했다!" |
| 학자 (Scholar) | 지능 | +50% | "학자답게 ~을 수행했다." |
| 연예인 (Celebrity) | 매력 | +50% | "연예인답게 |
직업 효과:
- 보너스 능력치와 활동의 주 증가 능력치가 일치할 때 50% 추가 증가
- 예: 군인이 운동을 하면 체력이 10
18 증가 (기본 712의 150%)
직업 선택 연출:
- 로딩 바 애니메이션 ("취 직 중")
- 직업 선택 완료 메시지
- Enter 키로 계속 진행
총 12가지 엔딩으로 구성되며, 능력치에 따라 우선순위대로 판정됩니다.
| 엔딩 | 조건 | 설명 |
|---|---|---|
| ⚔️전설의 용사 엔딩⚔️ | 체력 ≥ 200 | 왕국 최강의 전사, 마왕을 물리친 영웅 |
| 🧙마법사 엔딩🧙 | 지능 ≥ 200 | 대마법사, 새로운 마법 이론 정립 |
| 👑여왕 엔딩👑 | 매력 ≥ 200 | 카리스마로 왕국의 여왕 즉위 |
| 엔딩 | 조건 | 설명 |
|---|---|---|
| ⚔️장군 엔딩⚔️ | 체력 ≥ 150 | 왕국의 장군, 연전연승의 부대 지휘관 |
| 👓교수 엔딩👓 | 지능 ≥ 150 | 왕립 아카데미 교수, 학계의 권위자 |
| ⭐슈퍼스타 엔딩⭐ | 매력 ≥ 150 | K-POP 슈퍼스타, 글로벌 아이콘 |
| 엔딩 | 조건 | 설명 |
|---|---|---|
| 🎯전술가 엔딩🎯 | 체력 ≥ 120 & 지능 ≥ 120 | 힘과 지략의 전술가, 국방장관 |
| 💼CEO 엔딩💼 | 지능 ≥ 120 & 매력 ≥ 120 | AI 스타트업 CEO, 유니콘 기업 대표 |
| 🎬액션스타 엔딩🎬 | 체력 ≥ 120 & 매력 ≥ 120 | 할리우드 액션스타, 넷플릭스 주연 |
| 엔딩 | 조건 | 설명 |
|---|---|---|
| 🌟만능 엔딩🌟 | 모든 능력 ≥ 100 | 균형잡힌 능력, 외교관 |
| 💼평범한 삶 엔딩💼 | 아무 능력 ≥ 100 | 평범하지만 행복한 삶 |
| 🏠니트족 엔딩🏠 | 모든 능력 < 100 | 집에서 게임과 넷플릭스만 |
엔딩 판정 우선순위: 전설의 용사/마법사/여왕 → 장군/교수/슈퍼스타 → 전술가/CEO/액션스타 → 만능 → 평범한 삶 → 니트족
엔딩 연출:
- 3단계 연출 (24개월 회상 → 결과 확인 → 엔딩 발표)
- 각 단계마다 대기 시간 (2~5초)
- 상세한 엔딩 설명 및 메시지
[시작]
↓
[타이틀 화면 - ASCII 아트]
├─ Princess Maker 로고
└─ "PRESS ENTER TO START"
↓
[이름 설정]
├─ 빈 이름 입력 시 재입력 요구
└─ 유효한 이름 입력
↓
[프롤로그 (스토리 소개)]
├─ 환영 메시지
├─ 로딩 애니메이션 (8초)
└─ 스토리 텍스트 (자동 진행, 2초 간격)
↓
[1~12턴: 활동 선택 반복]
├─ 현재 날짜 표시 (yy년MM월)
├─ 활동 선택 (운동/공부/사교)
│ └─ 잘못된 입력 시 오류 메시지 및 재입력
├─ 활동 진행 애니메이션
├─ 활동 실행 및 능력치 증가
├─ 결과 화면 (능력치 상승량 표시)
└─ Enter로 다음 턴 진행
↓
[12턴 후: 직업 선택 이벤트]
├─ 직업 선택 화면
├─ 군인/학자/연예인 중 선택
│ └─ 잘못된 입력 시 자동으로 군인 선택 + 경고 메시지
├─ 취직 로딩 애니메이션
├─ 취직 완료 메시지
└─ Enter로 계속 진행
↓
[13~24턴: 활동 선택 반복]
├─ 활동 선택 (직업 보너스 적용)
├─ 직업별 활동 메시지 출력
├─ 활동 실행 및 능력치 증가
├─ 결과 화면
└─ Enter로 다음 턴 진행
↓
[엔딩 판정 (3단계 연출)]
├─ 1단계: 24개월 회상 (2초 대기)
├─ 2단계: 결과 확인 준비 (3.5초 대기)
├─ Enter 대기
├─ 3단계: 엔딩 발표 (2초 대기)
├─ 엔딩 이름 출력 (3.5초 대기)
├─ 엔딩 메시지 출력 (5초 대기)
└─ 게임 종료 메시지
princessmaker/
├── Application.java # 프로그램 진입점
├── model/ # 데이터 모델
│ ├── Princess.java # 프린세스 데이터
│ ├── Activity.java # 활동 정보
│ ├── Job.java # 직업 추상 클래스
│ ├── Soldier.java # 군인 직업
│ ├── Scholar.java # 학자 직업
│ └── Celebrity.java # 연예인 직업
├── service/ # 비즈니스 로직
│ ├── GameService.java # 게임 흐름 제어
│ └── ActivityService.java # 활동 처리
└── view/ # 사용자 인터페이스
└── ConsoleView.java # 콘솔 입출력
| 클래스 | 역할 | 주요 필드 | 주요 메서드 |
|---|---|---|---|
| Princess | 프린세스의 모든 정보 관리 | name, physical, intelligence, charm, currentDate, job | addMonth(), getFormattedDate(), increasePhysical/Intelligence/Charm() |
| Activity | 활동 정보 저장 | activityName, primaryStat, secondaryStat | getter 메서드들 |
| Job | 직업 공통 기능 정의 (추상 클래스) | jobName, bonusStat (protected) | abstract getStatBonus(), abstract getActivityMessage() |
| Soldier | 군인 직업 구현 | (상속받은 필드 사용) | getStatBonus() → 0.5 반환, getActivityMessage() → "군인답게..." |
| Scholar | 학자 직업 구현 | (상속받은 필드 사용) | getStatBonus() → 0.5 반환, getActivityMessage() → "학자답게..." |
| Celebrity | 연예인 직업 구현 | (상속받은 필드 사용) | getStatBonus() → 0.5 반환, getActivityMessage() → "연예인답게..." |
Princess 클래스 특징:
- 초기 능력치가 0에서 시작
- LocalDate를 사용한 날짜 관리
- "yy년MM월" 형식으로 날짜 포맷팅
| 클래스 | 역할 | 주요 메서드 |
|---|---|---|
| GameService | 게임의 전체 흐름 제어, 턴 관리, 엔딩 판정 | startGame(), performActivity(), selectJob(), showEnding(), getStatValue() |
| ActivityService | 활동 실행 및 능력치 계산 처리 | executeActivity(), getActivityMessage() |
GameService 주요 기능:
- 24턴 반복 루프 관리
- 13턴 시점 직업 선택 이벤트 트리거
- 10가지 엔딩 조건 판정 (우선순위 적용)
- 잘못된 직업 선택 시 기본값(군인) 처리
ActivityService 주요 기능:
- Math.random()을 사용한 랜덤 능력치 증가
- 직업 보너스 적용 로직
- 직업 유무에 따른 활동 메시지 생성
| 클래스 | 역할 | 주요 메서드 |
|---|---|---|
| ConsoleView | 모든 화면 출력 및 사용자 입력 처리 | showWelcome(), inputName(), showIntro(), selectActivity(), showActivityProgress(), showActivityResult(), selectJob(), showJobMessage(), showEnding(), close() |
ConsoleView 특징:
- Scanner를 사용한 사용자 입력
- 구분선(lineSplitter) 사용:
──────────────────────────────────────── - ASCII 아트 타이틀 화면
- Thread.sleep()을 활용한 타이밍 연출
- InputMismatchException 처리
- 빈 이름 입력 검증
- 잘못된 활동 선택 시 로딩 바 애니메이션과 함께 오류 메시지
| 클래스 | 역할 |
|---|---|
| Application | 프로그램 진입점, GameService 실행 |
Job추상 클래스를Soldier,Scholar,Celebrity가 상속- 공통 기능(jobName, bonusStat)은 부모 클래스에서 관리
- 직업별 특성(보너스율, 메시지)은 자식 클래스에서 구현
Job (추상 클래스)
├── Soldier (군인)
├── Scholar (학자)
└── Celebrity (연예인)
Job클래스: 모든 직업의 공통 틀 제공- 추상 메서드:
getStatBonus(),getActivityMessage(String) - 자식 클래스가 반드시 구현해야 하는 메서드 정의
Princess가Job타입으로 직업을 저장- 실행 시점에 실제 직업(Soldier/Scholar/Celebrity)에 따라 다른 동작
- 예시:
princess.getJob().getActivityMessage()→ 직업마다 다른 메시지princess.getJob().getStatBonus()→ 모두 0.5 반환 (공통)
- 모든 클래스의 필드를
private로 선언 getter/setter메서드로만 접근 가능- Job 클래스의 필드는
protected로 자식이 접근 가능 - 데이터 무결성 보호
각 클래스가 하나의 명확한 역할만 수행:
Princess: 프린세스 데이터 저장 및 관리Activity: 활동 정보 저장Job,Soldier,Scholar,Celebrity: 직업 정보 및 동작ActivityService: 활동 처리 로직GameService: 게임 전체 흐름 제어ConsoleView: 사용자 입출력 처리
InputMismatchException: 잘못된 타입 입력 처리InterruptedException: Thread.sleep() 사용 시 예외 처리- try-catch 블록으로 안전한 입력 처리
- 단순한 클래스 구조: 복잡한 디자인 패턴 배제
- 명확한 책임 분리: 각 클래스의 역할이 직관적
- 주석 없이 읽기 쉬운 코드: 메서드명과 변수명만으로 이해 가능
- Scanner를 통한 사용자 입력
- System.out.println을 통한 출력
- 구분선 사용: 시각적 구분을 위한 lineSplitter
- ASCII 아트: 타이틀 화면에 대형 로고
- 진행 애니메이션: Thread.sleep을 활용한 시각적 효과
- 로딩 바 (
==========>) - 점 애니메이션 (
. . . . .) - 취직 진행 바 (
■■■■■■)
- 로딩 바 (
- 입력 검증:
- 빈 이름 입력 방지
- 숫자 외 입력 시 재입력 요구
- 잘못된 선택 시 명확한 오류 메시지
- 버퍼 관리:
sc.nextLine()으로 버퍼 정리- nextInt() 후 남은 줄바꿈 처리
- Enter 대기:
- 중요한 화면 전환 시 사용자 입력 대기
- 스토리 진행 속도 제어
- 새 활동 추가 용이: Activity 배열에 추가만 하면 됨
- 새 직업 추가 용이: Job을 상속받는 클래스 추가
- 새 엔딩 추가 용이: showEnding() 메서드에 조건 추가
- 능력치 추가 가능: Princess 클래스에 필드 및 메서드 추가
- Math.random() 활용
- 주 능력치: 7~12 랜덤 증가
- 부 능력치: 2~4 랜덤 증가
- 매 플레이마다 다른 결과 제공
- LocalDate 활용
- "yy년MM월" 형식으로 현재 날짜 표시
- 매 턴마다 자동으로 1개월 증가
- 시작: 2025년 1월 / 종료: 2026년 12월
다양한 타이밍으로 게임 몰입도 향상:
- 로딩 화면: 1초 간격
- 스토리 텍스트: 2초 간격
- 활동 진행: 0.4초 간격 점 애니메이션
- 직업 선택 로딩: 0.5초 간격
- 엔딩 연출: 2~5초 다양한 대기
=====================================
PrincessMaker를 시작합니다!
=====================================
Princess의 이름을 설정해주세요:
=====================================
현재 날짜: 25/01
오늘은 어떤 활동을 하실건가요?
1. 운동 (체력↑↑, 지능↑)
2. 공부 (지능↑↑, 매력↑)
3. 사교 (매력↑↑, 체력↑)
번호를 선택하세요:
[이름]은(는) 운동을(를) 했다!
진행 중...
대성공!
체력이(가) 12 상승했습니다!
지능이(가) 4 상승했습니다!
현재 능력치:
체력: 62 | 지능: 54 | 매력: 50
=====================================
12개월이 지났습니다!
[이름]의 직업을 선택해주세요:
1. 군인 (체력 보정 +50%)
2. 학자 (지능 보정 +50%)
3. 연예인 (매력 보정 +50%)
번호를 선택하세요:
[이름]은(는) 군인에 취직했다!
이제부터 직업에 따른 능력치 상승률이 증가합니다!
엔딩: ⚔️전설의 용사 엔딩⚔️
엘리자베스은(는) 압도적인 체력으로 왕국 최강의 전사가 되었다!
대륙을 위협하던 마왕을 홀로 물리치고 영웅으로 칭송받고 있다.
이제 그녀의 이름만 들어도 적들은 두려움에 떨고 있다.
[ 게임을 플레이 해주셔서 감사합니다! 다음에 다시 만나요~~ ]
- IntelliJ IDEA에서 프로젝트 열기
Main.java파일 우클릭- "Run 'Main'" 선택
- 콘솔에서 게임 진행
- Princess, Activity (기본 데이터 클래스)
- Job, Soldier, Scholar, Celebrity (직업 시스템)
- ConsoleView (입출력 처리)
- ActivityService (활동 처리 로직)
- GameService (전체 흐름 제어)
- Main (실행)
- 각 엔딩 도달 가능 여부 확인
- 직업 보너스 정상 작동 확인
- 날짜 표시 정확성 확인
- 능력치 계산 정확성 확인
- 더 많은 활동: 예술, 전투, 마법 등
- 더 많은 직업: 마법사, 상인, 기사 등
- 더 많은 엔딩: 특수 조건 엔딩 (복합 능력치 조건)
- 이벤트 시스템: 특정 턴에 랜덤 이벤트 발생
- 아이템 시스템: 능력치 보정 아이템
- 피로도 시스템: 연속 활동 시 효율 감소
- 스토리 분기: 선택에 따른 스토리 변화
- 그래픽 UI: Swing 또는 JavaFX를 활용한 GUI
- 능력치 증가량 조절
- 엔딩 조건 수치 조절
- 직업 보너스 비율 조절
- 턴 수 변경 (24턴 → 30턴 등)
프로젝트 완료 일자: 2025년 11월 07일
| 항목 | 내용 |
|---|---|
| 프로젝트명 | Princess Maker (프린세스 메이커) |
| 개발 언어 | Java |
| 개발 환경 | IntelliJ IDEA, Console |
| 패키지명 | princessmaker |
| ID | 요구사항 명 | 상세 설명 | |
|---|---|---|---|
| FR-01 | 게임 루프 | 게임은 총 24턴으로 구성되어야 하며, 각 턴마다 활동 선택, 활동 실행, 능력치 증가, 결과 표시가 순차적으로 진행되어야 한다. | |
| FR-02 | 프린세스 생성 | 시스템은 사용자로부터 프린세스 이름을 입력받아야 하며, 빈 문자열 입력 시 재입력을 요구해야 한다. | |
| FR-03 | 능력치 초기화 | 프린세스는 체력, 지능, 매력 3가지 능력치를 가지며, 초기값은 모두 0이어야 한다. | |
| FR-04 | 날짜 시스템 | 시스템은 2025년 1월부터 시작하여 매 턴마다 1개월씩 증가시켜야 하며, "yy년MM월" 형식으로 표시해야 한다. | |
| FR-05 | 활동 종류 | 시스템은 3가지 활동(운동, 공부, 사교)을 제공해야 하며, 각 활동은 주 능력치와 부 능력치를 정의해야 한다. | |
| FR-06 | 활동 선택 UI | 매 턴마다 현재 날짜와 3가지 활동 목록을 표시하고, 사용자로부터 1~3 사이의 정수 입력을 받아야 한다. | |
| FR-07 | 입력 유효성 검사 | 사용자 입력이 (1) 숫자가 아니거나, (2) 1~3 범위를 벗어난 경우, 오류 메시지를 출력하고 재입력을 받아야 한다. | |
| FR-08 | 능력치 증가 (기본) | 활동 실행 시, 주 능력치는 7 |
|
| FR-09 | 활동 진행 연출 | 활동 실행 중, 활동 메시지와 점 애니메이션(0.4초 간격)을 표시해야 한다. | |
| FR-10 | 활동 결과 표시 | 활동 종료 후, 증가한 능력치 정보와 현재 전체 능력치를 표시해야 한다. | |
| FR-11 | 직업 선택 시점 | 13턴 시작 시, 직업 선택 이벤트가 발생해야 한다. | |
| FR-12 | 직업 종류 | 시스템은 3가지 직업(군인, 학자, 연예인)을 제공해야 하며, 각 직업은 특정 능력치(체력, 지능, 매력)에 대한 보너스를 가져야 한다. | |
| FR-13 | 직업 보너스 적용 | 직업의 보너스 능력치와 활동의 주 능력치가 일치할 경우, 해당 능력치 증가량에 50% 추가 보너스를 적용해야 한다. | |
| FR-14 | 직업 선택 UI | 직업 선택 시, 3가지 직업과 보너스 정보를 표시하고 사용자 입력을 받아야 한다. | |
| FR-15 | 직업 선택 검증 | 잘못된 직업 선택 시, 경고 메시지를 표시하고 기본값(군인)으로 설정해야 한다. | |
| FR-16 | 직업별 메시지 | 직업 선택 후, 활동 메시지가 직업에 맞게 변경되어야 한다. (예: "군인답게 ~을 수행했다!") | |
| FR-17 | 엔딩 판정 (최고) | 24턴 종료 후, 능력치가 200 이상일 경우 최고 엔딩(전설의 용사/마법사/여왕)을 표시해야 한다. | |
| FR-18 | 엔딩 판정 (높음) | 능력치가 150 이상일 경우 높은 엔딩(장군/교수/슈퍼스타)을 표시해야 한다. | |
| FR-19 | 엔딩 판정 (복합) | 두 가지 능력치가 모두 120 이상일 경우 복합 엔딩(전술가/CEO/액션스타)을 표시해야 한다. | |
| FR-20 | 엔딩 판정 (기본) | 모든 능력치가 100 이상이면 만능 엔딩, 하나 이상이 100 이상이면 평범한 삶 엔딩, 모두 100 미만이면 니트족 엔딩을 표시해야 한다. | |
| FR-21 | 엔딩 우선순위 | 여러 조건을 만족할 경우, 최고 → 높음 → 복합 → 만능 → 평범한 삶 → 니트족 순서로 판정해야 한다. | |
| FR-22 | 타이틀 화면 | 게임 시작 시, ASCII 아트 타이틀과 "PRESS ENTER TO START" 메시지를 표시해야 한다. | |
| FR-23 | 프롤로그 연출 | 이름 입력 후, 로딩 애니메이션과 스토리 텍스트를 자동으로 진행해야 한다. (각 문장 2초 간격) | |
| FR-24 | 엔딩 연출 | 엔딩 표시 시, 3단계 연출(회상 → 결과 확인 → 엔딩 발표)을 진행해야 한다. | |
| FR-25 | 버퍼 관리 | Scanner 사용 시, nextInt() 후 남은 줄바꿈 문자를 제거해야 한다. |
| ID | 요구사항 명 | 상세 설명 |
|---|---|---|
| NFR-01 | 가독성 | 모든 화면은 구분선(────)을 사용하여 구분되어야 한다. |
| NFR-02 | 사용자 피드백 | 모든 중요한 화면 전환은 Enter 키 입력 대기를 통해 사용자가 제어할 수 있어야 한다. |
| NFR-03 | 오류 처리 | 모든 사용자 입력은 예외 처리(InputMismatchException)를 통해 안전하게 처리되어야 한다. |
| NFR-04 | 애니메이션 타이밍 | Thread.sleep()을 사용한 모든 애니메이션은 사용자 경험을 고려한 적절한 시간(0.4~5초)으로 설정되어야 한다. |
| NFR-05 | 코드 구조 | 각 클래스는 단일 책임 원칙(SRP)을 따라야 하며, model/service/view 패키지로 명확히 분리되어야 한다. |
프로젝트 완료 일자: 2025년 11월 07일 문서 버전: 1.2
