Skip to content

Latest commit

 

History

20 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

image

프린세스 메이커 게임 프로젝트 개요


1. 프로젝트 기본 정보

  • 프로젝트 명: Princess Maker (프린세스 메이커)
  • 개발 언어: Java
  • 개발 환경: IntelliJ IDEA, Console 기반 실행
  • 프로젝트 설명: 24개월 동안 프린세스를 육성하여 다양한 엔딩을 달성하는 육성 시뮬레이션 게임

2. 게임 개요

게임 장르

  • 육성 시뮬레이션 / 텍스트 기반 어드벤처

게임 목표

  • 프린세스를 24개월(24턴) 동안 육성하여 원하는 엔딩에 도달하기

게임 스토리

반역자들에 의해 왕국이 함락되고 왕과 왕비가 폐위되었다. 충직한 신하였던 당신은 아기 공주를 구출해 옆 왕국으로 도망쳤다. 공주의 신분을 숨기고 키워온 지 이제 2년 후면 그녀는 성인이 된다. 성인이 되면 출생의 비밀을 알려줄 것을 결심한 당신은, 공주가 왕국의 공주로서 당당히 설 수 있도록 다양한 능력을 길러주고자 한다.

플레이 방식

  • 매 턴마다 3가지 활동 중 하나를 선택
  • 활동에 따라 능력치가 상승
  • 12턴 후 직업을 선택하여 특정 능력치에 보너스 획득
  • 최종 능력치에 따라 12가지 엔딩 중 하나로 분기

게임 기간

  • 총 24턴 (1턴 = 1개월)
  • 시작: 2025년 1월
  • 종료: 2026년 12월

3. 핵심 게임 시스템

3-1. 능력치 시스템

능력치 설명 초기값
체력 (Physical) 육체적 활동과 관련된 능력 0
지능 (Intelligence) 학습 및 지적 활동과 관련된 능력 0
매력 (Charm) 사교 및 외모와 관련된 능력 0

증가 방식:

  • 활동 선택 시 랜덤하게 증가 (주 능력치 712, 부 능력치 24)
  • 직업 보너스 적용 시 특정 능력치 50% 추가 증가

3-2. 활동 시스템

활동 주 증가 능력치 부 증가 능력치 설명
운동 체력 ↑↑ (7~12) 지능 ↑ (2~4) 육체적 단련 활동
공부 지능 ↑↑ (7~12) 매력 ↑ (2~4) 학습 및 지적 활동
사교 매력 ↑↑ (7~12) 체력 ↑ (2~4) 사람들과의 교류 활동

활동 실행 프로세스:

  1. 3가지 활동 중 선택 (잘못된 입력 시 재입력 요구)
  2. 활동 진행 애니메이션 출력 (점 애니메이션)
  3. 결과 출력 (대성공! 능력치 상승)
  4. 현재 능력치 표시
  5. Enter 입력으로 다음 턴 진행

입력 검증:

  • 숫자 1, 2, 3만 입력 가능
  • 잘못된 입력 시 오류 메시지 및 재입력 요구
  • InputMismatchException 처리

3-3. 직업 시스템

선택 시점: 12턴 완료 후

직업 보너스 능력치 보너스 효과 특징
군인 (Soldier) 체력 +50% "군인답게 ~을 수행했다!"
학자 (Scholar) 지능 +50% "학자답게 ~을 수행했다."
연예인 (Celebrity) 매력 +50% "연예인답게 을 수행했다"

직업 효과:

  • 보너스 능력치와 활동의 주 증가 능력치가 일치할 때 50% 추가 증가
  • 예: 군인이 운동을 하면 체력이 1018 증가 (기본 712의 150%)

직업 선택 연출:

  • 로딩 바 애니메이션 ("취 직 중")
  • 직업 선택 완료 메시지
  • Enter 키로 계속 진행

3-4. 엔딩 시스템

12가지 엔딩으로 구성되며, 능력치에 따라 우선순위대로 판정됩니다.

최고 능력치 엔딩 (200 이상)

엔딩 조건 설명
⚔️전설의 용사 엔딩⚔️ 체력 ≥ 200 왕국 최강의 전사, 마왕을 물리친 영웅
🧙마법사 엔딩🧙 지능 ≥ 200 대마법사, 새로운 마법 이론 정립
👑여왕 엔딩👑 매력 ≥ 200 카리스마로 왕국의 여왕 즉위

높은 능력치 엔딩 (150 이상)

엔딩 조건 설명
⚔️장군 엔딩⚔️ 체력 ≥ 150 왕국의 장군, 연전연승의 부대 지휘관
👓교수 엔딩👓 지능 ≥ 150 왕립 아카데미 교수, 학계의 권위자
⭐슈퍼스타 엔딩⭐ 매력 ≥ 150 K-POP 슈퍼스타, 글로벌 아이콘

복합 능력치 엔딩 (두 가지 120 이상)

엔딩 조건 설명
🎯전술가 엔딩🎯 체력 ≥ 120 & 지능 ≥ 120 힘과 지략의 전술가, 국방장관
💼CEO 엔딩💼 지능 ≥ 120 & 매력 ≥ 120 AI 스타트업 CEO, 유니콘 기업 대표
🎬액션스타 엔딩🎬 체력 ≥ 120 & 매력 ≥ 120 할리우드 액션스타, 넷플릭스 주연

기본 엔딩

엔딩 조건 설명
🌟만능 엔딩🌟 모든 능력 ≥ 100 균형잡힌 능력, 외교관
💼평범한 삶 엔딩💼 아무 능력 ≥ 100 평범하지만 행복한 삶
🏠니트족 엔딩🏠 모든 능력 < 100 집에서 게임과 넷플릭스만

엔딩 판정 우선순위: 전설의 용사/마법사/여왕 → 장군/교수/슈퍼스타 → 전술가/CEO/액션스타 → 만능 → 평범한 삶 → 니트족

엔딩 연출:

  • 3단계 연출 (24개월 회상 → 결과 확인 → 엔딩 발표)
  • 각 단계마다 대기 시간 (2~5초)
  • 상세한 엔딩 설명 및 메시지

4. 게임 진행 흐름

[시작]
   ↓
[타이틀 화면 - 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초 대기)
   └─ 게임 종료 메시지


5. 기술 구조

5-1. 패키지 구조

princessmaker/
├── Application.java             # 프로그램 진입점
├── model/                       # 데이터 모델
│   ├── Princess.java           # 프린세스 데이터
│   ├── Activity.java           # 활동 정보
│   ├── Job.java                # 직업 추상 클래스
│   ├── Soldier.java            # 군인 직업
│   ├── Scholar.java            # 학자 직업
│   └── Celebrity.java          # 연예인 직업
├── service/                     # 비즈니스 로직
│   ├── GameService.java        # 게임 흐름 제어
│   └── ActivityService.java    # 활동 처리
└── view/                        # 사용자 인터페이스
    └── ConsoleView.java        # 콘솔 입출력


5-2. 주요 클래스 및 역할

model 패키지

클래스 역할 주요 필드 주요 메서드
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월" 형식으로 날짜 포맷팅

service 패키지

클래스 역할 주요 메서드
GameService 게임의 전체 흐름 제어, 턴 관리, 엔딩 판정 startGame(), performActivity(), selectJob(), showEnding(), getStatValue()
ActivityService 활동 실행 및 능력치 계산 처리 executeActivity(), getActivityMessage()

GameService 주요 기능:

  • 24턴 반복 루프 관리
  • 13턴 시점 직업 선택 이벤트 트리거
  • 10가지 엔딩 조건 판정 (우선순위 적용)
  • 잘못된 직업 선택 시 기본값(군인) 처리

ActivityService 주요 기능:

  • Math.random()을 사용한 랜덤 능력치 증가
  • 직업 보너스 적용 로직
  • 직업 유무에 따른 활동 메시지 생성

view 패키지

클래스 역할 주요 메서드
ConsoleView 모든 화면 출력 및 사용자 입력 처리 showWelcome(), inputName(), showIntro(), selectActivity(), showActivityProgress(), showActivityResult(), selectJob(), showJobMessage(), showEnding(), close()

ConsoleView 특징:

  • Scanner를 사용한 사용자 입력
  • 구분선(lineSplitter) 사용: ────────────────────────────────────────
  • ASCII 아트 타이틀 화면
  • Thread.sleep()을 활용한 타이밍 연출
  • InputMismatchException 처리
  • 빈 이름 입력 검증
  • 잘못된 활동 선택 시 로딩 바 애니메이션과 함께 오류 메시지

최상위 패키지

클래스 역할
Application 프로그램 진입점, GameService 실행

5-3. 적용된 객체지향 개념

1. 상속 (Inheritance)

  • Job 추상 클래스를 Soldier, Scholar, Celebrity가 상속
  • 공통 기능(jobName, bonusStat)은 부모 클래스에서 관리
  • 직업별 특성(보너스율, 메시지)은 자식 클래스에서 구현
Job (추상 클래스)
 ├── Soldier (군인)
 ├── Scholar (학자)
 └── Celebrity (연예인)

2. 추상 클래스 (Abstract Class)

  • Job 클래스: 모든 직업의 공통 틀 제공
  • 추상 메서드: getStatBonus(), getActivityMessage(String)
  • 자식 클래스가 반드시 구현해야 하는 메서드 정의

3. 다형성 (Polymorphism)

  • PrincessJob 타입으로 직업을 저장
  • 실행 시점에 실제 직업(Soldier/Scholar/Celebrity)에 따라 다른 동작
  • 예시:
    • princess.getJob().getActivityMessage() → 직업마다 다른 메시지
    • princess.getJob().getStatBonus() → 모두 0.5 반환 (공통)

4. 캡슐화 (Encapsulation)

  • 모든 클래스의 필드를 private로 선언
  • getter/setter 메서드로만 접근 가능
  • Job 클래스의 필드는 protected로 자식이 접근 가능
  • 데이터 무결성 보호

5. 단일 책임 원칙 (Single Responsibility Principle)

각 클래스가 하나의 명확한 역할만 수행:

  • Princess: 프린세스 데이터 저장 및 관리
  • Activity: 활동 정보 저장
  • Job, Soldier, Scholar, Celebrity: 직업 정보 및 동작
  • ActivityService: 활동 처리 로직
  • GameService: 게임 전체 흐름 제어
  • ConsoleView: 사용자 입출력 처리

6. 예외 처리 (Exception Handling)

  • InputMismatchException: 잘못된 타입 입력 처리
  • InterruptedException: Thread.sleep() 사용 시 예외 처리
  • try-catch 블록으로 안전한 입력 처리

6. 구현 특징

6-1. 수정/추가 친화적 설계

  • 단순한 클래스 구조: 복잡한 디자인 패턴 배제
  • 명확한 책임 분리: 각 클래스의 역할이 직관적
  • 주석 없이 읽기 쉬운 코드: 메서드명과 변수명만으로 이해 가능

6-2. 콘솔 기반 인터페이스

  • Scanner를 통한 사용자 입력
  • System.out.println을 통한 출력
  • 구분선 사용: 시각적 구분을 위한 lineSplitter
  • ASCII 아트: 타이틀 화면에 대형 로고
  • 진행 애니메이션: Thread.sleep을 활용한 시각적 효과
    • 로딩 바 (==========>)
    • 점 애니메이션 (. . . . .)
    • 취직 진행 바 (■■■■■■)

6-3. 사용자 경험 (UX) 개선

  • 입력 검증:
    • 빈 이름 입력 방지
    • 숫자 외 입력 시 재입력 요구
    • 잘못된 선택 시 명확한 오류 메시지
  • 버퍼 관리:
    • sc.nextLine()으로 버퍼 정리
    • nextInt() 후 남은 줄바꿈 처리
  • Enter 대기:
    • 중요한 화면 전환 시 사용자 입력 대기
    • 스토리 진행 속도 제어

6-4. 확장 가능한 구조

  • 새 활동 추가 용이: Activity 배열에 추가만 하면 됨
  • 새 직업 추가 용이: Job을 상속받는 클래스 추가
  • 새 엔딩 추가 용이: showEnding() 메서드에 조건 추가
  • 능력치 추가 가능: Princess 클래스에 필드 및 메서드 추가

6-5. 랜덤 요소

  • Math.random() 활용
  • 주 능력치: 7~12 랜덤 증가
  • 부 능력치: 2~4 랜덤 증가
  • 매 플레이마다 다른 결과 제공

6-6. 날짜 시스템

  • LocalDate 활용
  • "yy년MM월" 형식으로 현재 날짜 표시
  • 매 턴마다 자동으로 1개월 증가
  • 시작: 2025년 1월 / 종료: 2026년 12월

6-7. 타이밍 연출

다양한 타이밍으로 게임 몰입도 향상:

  • 로딩 화면: 1초 간격
  • 스토리 텍스트: 2초 간격
  • 활동 진행: 0.4초 간격 점 애니메이션
  • 직업 선택 로딩: 0.5초 간격
  • 엔딩 연출: 2~5초 다양한 대기

7. 게임 화면 예시

시작 화면

=====================================
   PrincessMaker를 시작합니다!
=====================================
Princess의 이름을 설정해주세요:

활동 선택 화면

=====================================
현재 날짜: 25/01
오늘은 어떤 활동을 하실건가요?
1. 운동 (체력↑↑, 지능↑)
2. 공부 (지능↑↑, 매력↑)
3. 사교 (매력↑↑, 체력↑)
번호를 선택하세요:

활동 결과 화면

[이름]은(는) 운동을(를) 했다!
진행 중...

대성공!
체력이(가) 12 상승했습니다!
지능이(가) 4 상승했습니다!

현재 능력치:
체력: 62 | 지능: 54 | 매력: 50

직업 선택 화면

=====================================
12개월이 지났습니다!
[이름]의 직업을 선택해주세요:
1. 군인 (체력 보정 +50%)
2. 학자 (지능 보정 +50%)
3. 연예인 (매력 보정 +50%)
번호를 선택하세요:

[이름]은(는) 군인에 취직했다!
이제부터 직업에 따른 능력치 상승률이 증가합니다!

엔딩 화면

            엔딩: ⚔️전설의 용사 엔딩⚔️

            엘리자베스은(는) 압도적인 체력으로 왕국 최강의 전사가 되었다!
            대륙을 위협하던 마왕을 홀로 물리치고 영웅으로 칭송받고 있다.
            이제 그녀의 이름만 들어도 적들은 두려움에 떨고 있다.

            [ 게임을 플레이 해주셔서 감사합니다! 다음에 다시 만나요~~ ]


8. 개발 가이드

실행 방법

  1. IntelliJ IDEA에서 프로젝트 열기
  2. Main.java 파일 우클릭
  3. "Run 'Main'" 선택
  4. 콘솔에서 게임 진행

클래스 구현 순서

  1. Princess, Activity (기본 데이터 클래스)
  2. Job, Soldier, Scholar, Celebrity (직업 시스템)
  3. ConsoleView (입출력 처리)
  4. ActivityService (활동 처리 로직)
  5. GameService (전체 흐름 제어)
  6. Main (실행)

테스트 방법

  • 각 엔딩 도달 가능 여부 확인
  • 직업 보너스 정상 작동 확인
  • 날짜 표시 정확성 확인
  • 능력치 계산 정확성 확인

9. 향후 확장 가능성

추가 가능한 기능

  1. 더 많은 활동: 예술, 전투, 마법 등
  2. 더 많은 직업: 마법사, 상인, 기사 등
  3. 더 많은 엔딩: 특수 조건 엔딩 (복합 능력치 조건)
  4. 이벤트 시스템: 특정 턴에 랜덤 이벤트 발생
  5. 아이템 시스템: 능력치 보정 아이템
  6. 피로도 시스템: 연속 활동 시 효율 감소
  7. 스토리 분기: 선택에 따른 스토리 변화
  8. 그래픽 UI: Swing 또는 JavaFX를 활용한 GUI

난이도 조정 방안

  • 능력치 증가량 조절
  • 엔딩 조건 수치 조절
  • 직업 보너스 비율 조절
  • 턴 수 변경 (24턴 → 30턴 등)

프로젝트 완료 일자: 2025년 11월 07일


요구사항 명세서

1. 프로젝트 개요

항목 내용
프로젝트명 Princess Maker (프린세스 메이커)
개발 언어 Java
개발 환경 IntelliJ IDEA, Console
패키지명 princessmaker

2. 요구사항 명세

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 능력치 증가 (기본) 활동 실행 시, 주 능력치는 712 사이의 랜덤 값으로, 부 능력치는 24 사이의 랜덤 값으로 증가해야 한다.
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() 후 남은 줄바꿈 문자를 제거해야 한다.

3. 비기능 요구사항

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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages