diff --git a/.gitignore b/.gitignore index 6c01878138..5319a390a6 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ out/ ### VS Code ### .vscode/ + +REFACTORING.md diff --git a/README.md b/README.md index 9775dda0ae..3362d80923 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,172 @@ # java-janggi -장기 미션 저장소 +## 📋 목차 + +- [개요](#-개요) +- [구현 기능 목록](#-구현-기능-목록) +- [입출력 요구 사항](#입출력-요구-사항) +- [커밋 컨벤션](#커밋-컨벤션) + +--- + +## 1️⃣ 개요 + +### 기능 흐름 + +``` +[게임 시작] + │ + ▼ +[상차림 입력 - ReadyState] + 한(HAN) 상차림 선택 (1~4) + │ 예외 → 재입력 + ▼ + 초(CHO) 상차림 선택 (1~4) + │ 예외 → 재입력 + ▼ +[보드 초기화] + 입력된 상차림 기준으로 기물 배치 + │ + ▼ +[게임 진행 - PlayingState] ◄────────────────┐ + 현재 턴 출력 + 보드 출력 │ + │ │ + ▼ │ + 착수 명령어 입력 ({출발좌표} {도착좌표}) │ + │ 예외 → 재입력 (현재 턴 유지) │ + ▼ │ + 이동 유효성 검증 │ + ├─ 출발 좌표에 기물 없음 → 예외 │ + ├─ 출발 좌표가 상대 기물 → 예외 │ + ├─ 도착 좌표에 아군 기물 → 예외 │ + └─ 기물 이동 규칙 위반 → 예외 │ + │ 성공 │ + ▼ │ + 기물 이동 (도착 좌표에 상대 기물 있으면 제거) │ + │ │ + ▼ │ + 턴 교체 (한 ↔ 초) ─────────────────────────┘ +``` + +## 2️⃣ 구현 기능 목록 + +### ✅ 1차 구현 기능 목록 + +#### 1.1단계: 보드 초기화 + +- [x] **1. [출력] 상차림 예시를 출력한다.** +- [x] **2. [입력] 상차림을 입력받는다.** + - [x] [입력] 한의 상차림을 입력받는다. + - [x] [예외 처리] 빈 입력일 경우 `IllegalArgumentException` 을 발생시키고, 재입력을 받는다. + - [x] [예외 처리] 1~4 외의 문자를 입력한 경우 `IllegalArgumentException` 을 발생시키고, 재입력을 받는다. + - [x] [입력] 초의 상차림을 입력받는다. + - [x] [예외 처리] 빈 입력일 경우 `IllegalArgumentException` 을 발생시키고, 재입력을 받는다. + - [x] [예외 처리] 1~4 외의 문자를 입력한 경우 `IllegalArgumentException` 을 발생시키고, 재입력을 받는다. +- [x] **3. [중간 과정] 입력받은 상차림을 기준으로 기물을 배치한다.** +- [x] **4. [출력] 현재 보드의 기물 배치를 출력한다.** + +#### 1.2단계: 기물 이동 + +- [x] **5. [출력] 착수 명령어 형식과 현재 어느 팀의 턴인지를 출력한다.** +- [x] **6. [입력] 현재 턴의 진행자에게 착수 명령어를 입력받는다. (ex. '{출발좌표} {도착좌표}' 'A0 B1')** + - [x] [예외 처리] 빈 입력일 경우 `IllegalArgumentException` 을 발생시키고, 재입력을 받는다. + - [x] [예외 처리] 입력받은 값이 지정 형식인 '{출발좌표} {도착좌표}'가 아닐 경우 ` IllegalArgumentException` 을 발생시키고, 재입력을 받는다. + - [x] [예외 처리] 입력받은 column 값이 A~I 범위의 값이 아닌 경우 `IllegalArgumentException` 을 발생시키고, 재입력을 받는다. + - [x] [예외 처리] 입력받은 row 값이 0~9 범위의 값이 아닌 경우 `IllegalArgumentException` 을 발생시키고, 재입력을 받는다. +- [x] **7. [중간 과정] 사용자가 명령한 착수를 수행한다.** + - [x] [예외 처리] 아래의 경우 왜 이동이 불가능한지 출력하고, 해당 플레이어의 턴으로 처음부터 재입력을 받는다. + - [x] [중간 과정] 출발 좌표에 기물이 없는 경우 + - [x] [중간 과정] 출발 좌표에 상대 기물이 있는 경우 + - [x] [중간 과정] 각 기물 고유의 이동 규칙에 따라 이동이 불가능한 경우 + - [x] [중간 과정] 도착 좌표에 아군 기물이 있을 경우 + - [x] [중간 과정] 도착 좌표에 상대 기물이 있으면 없앤다. + - [x] [중간 과정] 출발 좌표에 있던 기물을 도착 좌표로 옮긴다. + - [x] [중간 과정] 턴을 넘긴다. + +## 3️⃣ 입출력 요구 사항 + +### 실행 결과 예시 + +``` +[한(HAN) 진영] 배치를 선택하세요. +1. 마-상-마-상 (Horse-Elephant-Horse-Elephant) +2. 마-상-상-마 (Horse-Elephant-Elephant-Horse) +3. 상-마-마-상 (Elephant-Horse-Horse-Elephant) +4. 상-마-상-마 (Elephant-Horse-Elephant-Horse) +> 1 + +[초(CHO) 진영] 배치를 선택하세요. +1. 마-상-마-상 (Horse-Elephant-Horse-Elephant) +2. 마-상-상-마 (Horse-Elephant-Elephant-Horse) +3. 상-마-마-상 (Elephant-Horse-Horse-Elephant) +4. 상-마-상-마 (Elephant-Horse-Elephant-Horse) +> 2 + +-------------------------------------- +현재 턴: [초(CHO) 진영] + + a b c d e f g h i + 0 한차 한마 한상 한사 ... 한사 한마 한상 한차 + 1 ... ... ... ... 한궁 ... ... ... ... + 2 ... 한포 ... ... ... ... ... 한포 ... + 3 한병 ... 한병 ... 한병 ... 한병 ... 한병 + 4 ... ... ... ... ... ... ... ... ... + 5 ... ... ... ... ... ... ... ... ... + 6 초졸 ... 초졸 ... 초졸 ... 초졸 ... 초졸 + 7 ... 초포 ... ... ... ... ... 초포 ... + 8 ... ... ... ... 초궁 ... ... ... ... + 9 초차 초마 초상 초사 ... 초사 초상 초마 초차 + + [초(CHO) 진영] {출발 좌표} {도착 좌표} 형식으로 입력해 수를 두세요. (ex. e6 e5) + > 영기 + + [ERROR] 좌표 형식이 틀렸습니다! + + -------------------------------------- + 현재 턴: [초(CHO) 진영] + + a b c d e f g h i + 0 한차 한마 한상 한사 ... 한사 한마 한상 한차 + 1 ... ... ... ... 한궁 ... ... ... ... + 2 ... 한포 ... ... ... ... ... 한포 ... + 3 한병 ... 한병 ... 한병 ... 한병 ... 한병 + 4 ... ... ... ... ... ... ... ... ... + 5 ... ... ... ... ... ... ... ... ... + 6 초졸 ... 초졸 ... 초졸 ... 초졸 ... 초졸 + 7 ... 초포 ... ... ... ... ... 초포 ... + 8 ... ... ... ... 초궁 ... ... ... ... + 9 초차 초마 초상 초사 ... 초사 초상 초마 초차 + + [초(CHO) 진영] {출발 좌표} {도착 좌표} 형식으로 입력해 수를 두세요. (ex. e6 e5) + > +``` + +--- + +## 4️⃣ 커밋 컨벤션 + +Following convention : https://gist.github.com/stephenparish/9941e89d80e2bc58a153 + +```markdown +# basic structure +(): + + + +