Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
1e2353f
docs(README): ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ์ž‘์„ฑ
MODUGGAGI Mar 24, 2026
153cf04
feat: Position ์ƒ์„ฑ ์‹œ ํ–‰,์—ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
MODUGGAGI Mar 24, 2026
12fb008
feat: ํ–‰๊ณผ ์—ด ์ฐจ์ด ๊ณ„์‚ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 25, 2026
a6b1208
feat: ๋ณ‘์˜ ํ–‰๋งˆ๋ฒ• ๊ณ„์‚ฐ ๋กœ์ง ๊ตฌํ˜„
MODUGGAGI Mar 25, 2026
a590747
refactor: ์†Œ์Šค ์ฝ”๋“œ ํŒจํ‚ค์ง€๋กœ ์ด๋™
MODUGGAGI Mar 25, 2026
85cedc8
feat: ๋ณด๋“œ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 25, 2026
0d04301
refactor: Position VO ์ „ํ™˜
MODUGGAGI Mar 25, 2026
053ccf3
feat: ์ƒ์ฐจ๋ฆผ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 25, 2026
c07bf10
feat: ์กธ/๋ณ‘ ํ›„์ง„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„
MODUGGAGI Mar 25, 2026
23e026f
feat: ์กธ/๋ณ‘ ํ›„์ง„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌํ˜„๊ฐ€
MODUGGAGI Mar 25, 2026
a461255
test: ํ–‰๋งˆ๋ฒ• ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
MODUGGAGI Mar 25, 2026
84cf947
feat: ์ฐจ ํ–‰๋งˆ๋ฒ• ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 25, 2026
c8f9421
docs: ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ ์™„๋ฃŒ ์ฒ˜๋ฆฌ
MODUGGAGI Mar 25, 2026
4df7f3d
refactor: ์ „๋žต ์ด๋ฆ„ ์ˆ˜์ •
MODUGGAGI Mar 26, 2026
462827a
refactor: ๊ฒฝ๋กœ ์ƒ์„ฑ ๋กœ์ง ์ตœ์ ํ™”
MODUGGAGI Mar 26, 2026
99c17c1
refactor: ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์ˆ˜์ •
MODUGGAGI Mar 26, 2026
d78aef3
feat: ์ฐจ,ํฌ ์ œ์ž๋ฆฌ ์ด๋™ ์˜ˆ์™ธ ์ถ”๊ฐ€
MODUGGAGI Mar 26, 2026
b3b9198
feat: ๋งˆ ์ด๋™ ๊ตฌํ˜„
MODUGGAGI Mar 26, 2026
f92203f
feat: ์ƒ ํ–‰๋งˆ๋ฒ• ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 26, 2026
3f62291
refactor: DirectionInformation ๊ฐ’ ๊ฐ์ฒด ์ ์šฉ
MODUGGAGI Mar 26, 2026
49914a9
refactor: DirectionInformation ๊ฐ’ ๊ฐ์ฒด ์ ์šฉ
MODUGGAGI Mar 26, 2026
dfb2afe
refactor: ํด๋ž˜์Šค ์ด๋ฆ„ PieceRule๋กœ ๋ณ€๊ฒฝ
MODUGGAGI Mar 26, 2026
7ef3df4
refactor: ์ƒ์„ฑ์ž์—์„œ MoveStrategy ์ œ๊ฑฐ
MODUGGAGI Mar 26, 2026
d8fa73b
feat: ๊ฒฝ๋กœ ์ƒ ๊ธฐ๋ฌผ์ด ์—†์–ด์•ผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด ํ™•์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 26, 2026
74efd5a
feat: ๊ฒฝ๋กœ ์ƒ ๊ธฐ๋ฌผ์ด 1๊ฐœ ์žˆ์–ด์•ผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด ํ™•์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 26, 2026
4fe8ab9
refactor: MoveCondition ๋งค๊ฐœ๋ณ€์ˆ˜ ์ถ”๊ฐ€
MODUGGAGI Mar 26, 2026
0eabf55
feat: MoveCondition ์ถ”๊ฐ€
MODUGGAGI Mar 26, 2026
5445082
feat: ๊ธฐ๋ฌผ ์ด๋™ ๊ฒ€์ฆ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 26, 2026
dc41b10
feat: ๋ณด๋“œ ๊ธฐ๋ฌผ ์ด๋™ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 26, 2026
a13c511
refactor: ์ƒ์ฐจ๋ฆผ ๋กœ์ง ์ˆ˜์ •
MODUGGAGI Mar 27, 2026
b83e12e
feat: ์ƒ์ฐจ๋ฆผ ์ž…๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 27, 2026
f5172e3
feat: ์žฅ๊ธฐ ์ž…์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
MODUGGAGI Mar 27, 2026
7a76925
feat: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ๋ฐ ๋งค์ง ๋„˜๋ฒ„ ์ƒ์ˆ˜ ์ฒ˜๋ฆฌ
MODUGGAGI Mar 27, 2026
f4e38f4
test: ํŒŒ์„œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
MODUGGAGI Mar 27, 2026
9df0ca5
refactor: ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์ˆœ์„œ ๋ณ€๊ฒฝ
MODUGGAGI Mar 27, 2026
a4adc92
refactor: ์ถœ๋ฐœ์ง€, ๋ชฉ์ ์ง€ ๋ณ€์ˆ˜๋ช… ๋ณ€๊ฒฝ
MODUGGAGI Mar 27, 2026
0834056
docs: ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์™„๋ฃŒ ์ฒ˜๋ฆฌ
MODUGGAGI Mar 27, 2026
9bafbe4
refactor: ์ถœ๋ ฅ ํ˜•์‹ ์ˆ˜์ •
MODUGGAGI Mar 27, 2026
db55fcf
feat: ์žฌ์‹œ๋„ ๋กœ์ง ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€
MODUGGAGI Mar 27, 2026
2dbdde9
refactor: ์™„๋ฃŒํ•œ TODO ์ œ๊ฑฐ
MODUGGAGI Mar 28, 2026
ebecb3e
refactor: View์— CampDto ์ ์šฉ
MODUGGAGI Mar 28, 2026
ef036ce
refactor: ์ง„์˜ ์ด๋ฆ„ ์ƒ์ˆ˜ ์ฒ˜๋ฆฌ
MODUGGAGI Mar 28, 2026
01783c9
feat: ํ”Œ๋ ˆ์ด์–ด ํ„ด ์ „์šฉ ๊ฐ’ ๊ฐ์ฒด ์ถ”๊ฐ€
MODUGGAGI Mar 28, 2026
425b7a3
refactor: ํ„ด ์ง„ํ–‰ ๋ฐ˜ํ™˜ํƒ€์ž… void๋กœ ๋ณ€๊ฒฝ
Jiihyun Mar 28, 2026
9c0501d
refactor: ๊ณต๋ฐฑ ์ถ”๊ฐ€
Jiihyun Mar 28, 2026
766e481
refactor: PieceFormatter์™€ CampFormatter enum์œผ๋กœ ๋ณ€๊ฒฝ ๋ฐ switch๋ฌธ ์ œ๊ฑฐ
Jiihyun Mar 30, 2026
024b08b
refactor: InitialPiecePlacement ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์ถ•์†Œ
Jiihyun Mar 30, 2026
53d93d6
test: Turn ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Jiihyun Mar 30, 2026
cd30819
test: ElephantSetting ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Jiihyun Mar 30, 2026
c8ebd7f
test: DirectionInformation ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Jiihyun Mar 30, 2026
38f9425
test: Camp ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Jiihyun Mar 30, 2026
6ef4515
test: HorseStrategy ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Jiihyun Mar 30, 2026
e60c9e6
refactor: EmptyConditionTestBoardInitializer ์ œ๊ฑฐ
Jiihyun Mar 30, 2026
da6cd23
refactor: OnePieceExistsCondition ํ…Œ์ŠคํŠธ์ด๋ฆ„ ์ถ”์ƒํ™”
Jiihyun Mar 30, 2026
6325339
refactor: ElephantStrategyTest ๋‚ด ๋ถˆํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ œ๊ฑฐ
Jiihyun Mar 30, 2026
69e6abb
refactor: MultiStepStraightStrategyTest, SingleStepStraightStrategyTeโ€ฆ
Jiihyun Mar 30, 2026
12a3328
refactor: PieceTest ๋‚ด ํ…Œ์ŠคํŠธ๋ช… ๋ณ€๊ฒฝ
Jiihyun Mar 30, 2026
70cab43
refactor: GameRule ์ƒ์ˆ˜ ํด๋ž˜์Šค ์ œ๊ฑฐ
Jiihyun Mar 31, 2026
423ea0f
refactor: ๋ณด๋“œ ์ดˆ๊ธฐํ™” ์‹œ ์ƒ์ฐจ๋ฆผ ํƒ€์ž… ๋ณ€๊ฒฝ
Jiihyun Mar 31, 2026
ba43328
refactor: ํ–‰๋งˆ๋ฒ• ์ „๋žต ์ถ”์ƒํ™” ๋ ˆ๋ฒจ ๋งž๋„๋ก ๋ณ€๊ฒฝ
Jiihyun Apr 1, 2026
c4d4de5
refactor: BoardInitializer ํด๋ž˜์Šค ์‚ญ์ œ
Jiihyun Apr 1, 2026
038079b
refactor: elephantSetUpFormat์—์„œ ElephantFormation ์ƒ์„ฑํ•˜๋„๋ก ๋ณ€๊ฒฝ
Jiihyun Apr 1, 2026
121f2b8
refactor: CampDto ์ œ๊ฑฐ
Jiihyun Apr 1, 2026
2b06742
refactor: ์ถœ๋ฐœ์ง€, ๋ชฉ์ ์ง€ ๊ฒ€์ฆ ์œ„์น˜ ๋ณ€๊ฒฝ
Jiihyun Apr 1, 2026
d8188fc
refactor: ์ด๋™ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๋Š” ๋กœ์ง ๋ถ„๋ฆฌ
Jiihyun Apr 1, 2026
619d82b
refactor: ์ด๋™ ์ „๋žต ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ
Jiihyun Apr 2, 2026
5518268
refactor: ํ–‰๋งˆ๋ฒ• ์ „๋žต ์ถ”์ƒํ™” ์ˆ˜์ค€ ๋™์ผํ•˜๊ฒŒ ๋ณ€๊ฒฝ
Jiihyun Apr 2, 2026
e1138ec
refactor: Position format ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
Jiihyun Apr 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
194 changes: 193 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,195 @@
# java-janggi

์žฅ๊ธฐ ๋ฏธ์…˜ ์ €์žฅ์†Œ
> ์žฅ๊ธฐ ๋ฏธ์…˜ ์ €์žฅ์†Œ

ํŽ˜์–ด : [์Šคํƒ€ํฌ](https://github.com/MODUGGAGI), [๋Ÿฌํ‚ค](https://github.com/Jiihyun)

---

## ๐Ÿ‘ฅ ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ทœ์น™

๋„ค๋น„๊ฒŒ์ดํ„ฐ, ๋“œ๋ผ์ด๋ฒ„ ์—ญํ•  ๊ตํ™˜์€ **15๋ถ„**์— ํ•œ๋ฒˆ์”ฉ

| **๋„ค๋น„๊ฒŒ์ดํ„ฐ** | **๋“œ๋ผ์ด๋ฒ„** |
|:---------------------------:|:------------------------------:|
| ๋“œ๋ผ์ด๋ฒ„์—๊ฒŒ ์ง€์‹œ์™€ ๋™์‹œ์— ์„œ๋กœ์˜ ๋Œ€ํ™” ๋‚ด์šฉ ๊ธฐ๋ก | ์ž์‹ ์ด ์ž‘์„ฑํ•˜๋ ค๋Š” ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ํ•ญ์ƒ ๋ช…ํ™•ํžˆ ๋ง๋กœ ์ „๋‹ฌ |

---

## ๐Ÿ€„๏ธ ๊ตฌํ˜„ ๊ธฐ๋Šฅ ๋ชฉ๋ก

## โœ… ์ž…๋ ฅ

- [x] ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ์ƒ์ฐจ๋ฆผ ์ž…๋ ฅ ๋ฐ›๊ธฐ
- [x] ์ง€์ •๋œ ๋ช…๋ น์–ด ์ด์™ธ์˜ ๋ฌธ์ž์—ด ๋ฐ ์ˆซ์ž ๊ฐ’์€ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

- [x] ํ”Œ๋ ˆ์ด์–ด์˜ ์„ ํƒ ๊ธฐ๋ฌผ ์ขŒํ‘œ ์ž…๋ ฅ
- [x] ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ์ˆซ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ๊ตฌ๋ถ„์ž๊ฐ€ `,`๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

- [x] ํ”Œ๋ ˆ์ด์–ด์˜ ๋ชฉํ‘œ ์ขŒํ‘œ ์ž…๋ ฅ
- [x] ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ์ˆซ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ๊ตฌ๋ถ„์ž๊ฐ€ `,`๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

## โœ… ์ถœ๋ ฅ

- [x] ์žฅ๊ธฐํŒ ์ถœ๋ ฅ
- ์ƒ์ฐจ๋ฆผ ์„ ํƒ ํ›„
- ๋ชฉํ‘œ ์ขŒํ‘œ ์ž…๋ ฅ ํ›„
- [x] ํ˜„์žฌ ์ฐจ๋ก€์ธ ๋‚˜๋ผ ์ถœ๋ ฅ
- ใ€Žํ•œใ€, ใ€Ž์ดˆใ€

## โœ… ๋น„์ง€๋‹ˆ์Šค ๊ธฐ๋Šฅ

### ๋ณด๋“œ ์ดˆ๊ธฐํ™”

- [x] ใ€Žํ•œใ€ ์ƒ์ฐจ๋ฆผ
- [x] ใ€Ž์ดˆใ€ ์ƒ์ฐจ๋ฆผ

```text
- ์ขŒ์ธก ์ƒ๋‹จ์„ 0ํ–‰ 0์—ด ์ด๋ผ ๊ฐ€์ •

์žฅ*1๊ฐœ
์‹œ์ž‘ ์œ„์น˜
- ํ•œ๋‚˜๋ผ: 1ํ–‰ 4์—ด
- ์ดˆ๋‚˜๋ผ: 8ํ–‰ 4์—ด

์‚ฌ*2๊ฐœ
์‹œ์ž‘ ์œ„์น˜
- ํ•œ๋‚˜๋ผ: 0ํ–‰ 3์—ด, 0ํ–‰ 5์—ด
- ์ดˆ๋‚˜๋ผ: 9ํ–‰ 3์—ด, 9ํ–‰ 5์—ด

์ฐจ*2๊ฐœ
์‹œ์ž‘ ์œ„์น˜
- ํ•œ๋‚˜๋ผ: 0ํ–‰ 0์—ด, 0ํ–‰ 8์—ด
- ์ดˆ๋‚˜๋ผ: 9ํ–‰ 0์—ด, 9ํ–‰ 8์—ด

ํฌ*2๊ฐœ
์‹œ์ž‘ ์œ„์น˜
- ํ•œ๋‚˜๋ผ: 2ํ–‰ 1์—ด, 2ํ–‰ 7์—ด
- ์ดˆ๋‚˜๋ผ: 7ํ–‰ 1์—ด, 7ํ–‰ 7์—ด

๋งˆ*2๊ฐœ
์‹œ์ž‘ ์œ„์น˜
- ํ•œ๋‚˜๋ผ: 0ํ–‰ 2์—ด, 0ํ–‰ 7์—ด
- ์ดˆ๋‚˜๋ผ: 9ํ–‰ 2์—ด, 9ํ–‰ 7์—ด

์ƒ*2๊ฐœ
์‹œ์ž‘ ์œ„์น˜
- ํ•œ๋‚˜๋ผ: 0ํ–‰ 1์—ด, 0ํ–‰ 6์—ด
- ์ดˆ๋‚˜๋ผ: 9ํ–‰ 1์—ด, 9ํ–‰ 6์—ด

์กธ*5๊ฐœ
์‹œ์ž‘ ์œ„์น˜
- ํ•œ๋‚˜๋ผ: 3ํ–‰ 0์—ด, 3ํ–‰ 2์—ด, 3ํ–‰ 4์—ด, 3ํ–‰ 6์—ด, 3ํ–‰ 8์—ด
- ์ดˆ๋‚˜๋ผ: 6ํ–‰ 0์—ด, 6ํ–‰ 2์—ด, 6ํ–‰ 4์—ด, 6ํ–‰ 6์—ด, 6ํ–‰ 8์—ด
```

### ๊ธฐ๋ฌผ ์ด๋™

- [x] ์ด๋™ ์‹œํ‚ค๋ ค๋Š” ๊ธฐ๋ฌผ์˜ ์ขŒํ‘œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
- [x] ์ขŒํ‘œ๊ฐ€ ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚œ ์ขŒํ‘œ์ผ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ์ขŒํ‘œ์— ๊ธฐ๋ฌผ์ด ์กด์žฌ ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ์ขŒํ‘œ์˜ ๊ธฐ๋ฌผ์ด ์ž์‹ ์˜ ์ง„์˜์ด ์•„๋‹ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

- [x] ๊ธฐ๋ฌผ์„ ๋ชฉ์ ์ง€ ์ขŒํ‘œ๋กœ ์ด๋™ํ•œ๋‹ค.
- [x] ๋ชฉ์ ์ง€ ์ขŒํ‘œ๊ฐ€ ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚œ ์ขŒํ‘œ์ผ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ๊ธฐ๋ฌผ ๊ทœ์น™ ๋ฐ ์ œ์•ฝ์— ๋งž๊ฒŒ ์ด๋™ํ•œ๋‹ค.
- [์ฐจ(่ปŠ)]
- [x] ์ƒํ•˜์ขŒ์šฐ๋กœ ์žฅ์• ๋ฌผ์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์นธ ์ˆ˜ ์ œํ•œ ์—†์ด ์ด๋™ํ•œ๋‹ค.
- [x] ์ด๋™ํ•˜๋ ค๋Š” ๊ฒฝ๋กœ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด **์žˆ**๋‹ค๋ฉด `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

- [ํฌ(ๅŒ…)]
- [x] ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋˜, ๋ฐ˜๋“œ์‹œ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์„ ํ•˜๋‚˜ ๋›ฐ์–ด๋„˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- [x] ์ด๋™ํ•˜๋ ค๋Š” ๊ฒฝ๋กœ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด **์—†**๋‹ค๋ฉด `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ๋„˜์œผ๋ ค๋Š” ๊ธฐ๋ฌผ์ด ํฌ(ๅŒ…) ์ผ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
- [x] ๋ชฉ์ ์ง€ ์ขŒํ‘œ์˜ ๊ธฐ๋ฌผ์ด ํฌ(ๅŒ…)์ผ ๊ฒฝ์šฐ `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

- [๋งˆ(้ฆฌ)]
- [x] ์ง์„  1์นธ + ๋Œ€๊ฐ์„  1์นธ(ๆ—ฅ) ์ด๋™ํ•œ๋‹ค.
- [x] ๋ชฉ์ ์ง€ ์ขŒํ‘œ(์ง์„  1์นธ ๋˜๋Š” ๋Œ€๊ฐ์„  1์นธ)์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

- [์ƒ(่ฑก)]
- [x] ์ง์„  1์นธ + ๋Œ€๊ฐ์„  2์นธ(็”จ) ์ด๋™ํ•œ๋‹ค.
- [x] ๋ชฉ์ ์ง€ ์ขŒํ‘œ(์ง์„  1์นธ ๋˜๋Š” ๋Œ€๊ฐ์„  1์นธ)์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด `IllegalArgumentException`์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

- [๊ถ(ๆฅš/ๆผข), ์‚ฌ(ๅฃซ)]
- [x] ์ƒํ•˜์ขŒ์šฐ ์ง์„  1์นธ ์ด๋™ํ•œ๋‹ค.

- [์กธ/๋ณ‘(ๅ’/ๅ…ต)]
- [x] ์ƒ์ขŒ์šฐ ์ง์„  1์นธ ์ด๋™ํ•œ๋‹ค. ํ›„์ง„์€ ๋ถˆ๊ฐ€ ์ฃผ์˜

---

## ๐Ÿ’ป ์‹คํ–‰ ๊ฒฐ๊ณผ

```text
1. ์ƒ๋งˆ์ƒ๋งˆ
2. ๋งˆ์ƒ๋งˆ์ƒ
3. ๋งˆ์ƒ์ƒ๋งˆ
4. ์ƒ๋งˆ๋งˆ์ƒ
ํ•œ๋‚˜๋ผ์˜ ์ƒ์ฐจ๋ฆผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.
1

1. ์ƒ๋งˆ์ƒ๋งˆ
2. ๋งˆ์ƒ๋งˆ์ƒ
3. ๋งˆ์ƒ์ƒ๋งˆ
4. ์ƒ๋งˆ๋งˆ์ƒ
์ดˆ๋‚˜๋ผ์˜ ์ƒ์ฐจ๋ฆผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.
3

[์žฅ๊ธฐํŒ]
๏ผ ๏ผ‘ ๏ผ’ ๏ผ“ ๏ผ” ๏ผ• ๏ผ– ๏ผ— ๏ผ˜
๏ผ ่ปŠ ้ฆฌ ่ฑก ๅฃซ ๏ผŽ ๅฃซ ่ฑก ้ฆฌ ่ปŠ
๏ผ‘ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๆฅš ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ’ ๏ผŽ ๅŒ… ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๅŒ… ๏ผŽ
๏ผ“ ๅ’ ๏ผŽ ๅ’ ๏ผŽ ๅ’ ๏ผŽ ๅ’ ๏ผŽ ๅ’
๏ผ” ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ• ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ– ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต
๏ผ— ๏ผŽ ๅŒ… ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๅŒ… ๏ผŽ
๏ผ˜ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๆผข ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ™ ่ปŠ ่ฑก ้ฆฌ ๅฃซ ๏ผŽ ๅฃซ ่ฑก ้ฆฌ ่ปŠ

์ดˆ๋‚˜๋ผ ์ฐจ๋ก€ ์ž…๋‹ˆ๋‹ค.
๊ณต๊ฒฉํ•  ๊ธฐ๋ฌผ์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
3,0

์ด๋™ ์‹œํ‚ฌ ๋ชฉ์ ์ง€ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
4,0

[์žฅ๊ธฐํŒ]
๏ผ ๏ผ‘ ๏ผ’ ๏ผ“ ๏ผ” ๏ผ• ๏ผ– ๏ผ— ๏ผ˜
๏ผ ่ปŠ ้ฆฌ ่ฑก ๅฃซ ๏ผŽ ๅฃซ ่ฑก ้ฆฌ ่ปŠ
๏ผ‘ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๆฅš ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ’ ๏ผŽ ๅŒ… ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๅŒ… ๏ผŽ
๏ผ“ ๏ผŽ ๏ผŽ ๅ’ ๏ผŽ ๅ’ ๏ผŽ ๅ’ ๏ผŽ ๅ’
๏ผ” ๅ’ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ• ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ– ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต
๏ผ— ๏ผŽ ๅŒ… ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๅŒ… ๏ผŽ
๏ผ˜ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๆผข ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ™ ่ปŠ ่ฑก ้ฆฌ ๅฃซ ๏ผŽ ๅฃซ ่ฑก ้ฆฌ ่ปŠ

ํ•œ๋‚˜๋ผ ์ฐจ๋ก€ ์ž…๋‹ˆ๋‹ค.
๊ณต๊ฒฉํ•  ๊ธฐ๋ฌผ์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
9,0

์ด๋™ ์‹œํ‚ฌ ๋ชฉ์ ์ง€ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
8,0

[์žฅ๊ธฐํŒ]
๏ผ ๏ผ‘ ๏ผ’ ๏ผ“ ๏ผ” ๏ผ• ๏ผ– ๏ผ— ๏ผ˜
๏ผ ่ปŠ ้ฆฌ ่ฑก ๅฃซ ๏ผŽ ๅฃซ ่ฑก ้ฆฌ ่ปŠ
๏ผ‘ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๆฅš ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ’ ๏ผŽ ๅŒ… ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๅŒ… ๏ผŽ
๏ผ“ ๏ผŽ ๏ผŽ ๅ’ ๏ผŽ ๅ’ ๏ผŽ ๅ’ ๏ผŽ ๅ’
๏ผ” ๅ’ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ• ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ– ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต ๏ผŽ ๅ…ต
๏ผ— ๏ผŽ ๅŒ… ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ ๅŒ… ๏ผŽ
๏ผ˜ ่ปŠ ๏ผŽ ๏ผŽ ๏ผŽ ๆผข ๏ผŽ ๏ผŽ ๏ผŽ ๏ผŽ
๏ผ™ ๏ผŽ ่ฑก ้ฆฌ ๅฃซ ๏ผŽ ๅฃซ ่ฑก ้ฆฌ ่ปŠ
```
8 changes: 8 additions & 0 deletions src/main/java/janggi/JanggiApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package janggi;

public class JanggiApplication {
public static void main(String[] args) {
JanggiGame game = new JanggiGame();
game.run();
}
}
76 changes: 76 additions & 0 deletions src/main/java/janggi/JanggiGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package janggi;

import janggi.domain.Position;
import janggi.domain.Turn;
import janggi.domain.board.Board;
import janggi.domain.board.ElephantFormation;
import janggi.domain.board.InitialPiecePlacement;
import janggi.domain.piece.Camp;
import janggi.domain.piece.Piece;
import janggi.dto.PiecePositionDto;
import janggi.util.RetryHandler;
import janggi.view.InputView;
import janggi.view.OutputView;
import janggi.view.format.ElephantSetUpFormat;
import java.util.List;
import java.util.Map;

public class JanggiGame {

public void run() {
Board board = createBoard();
OutputView.printBoard(toPiecePositions(board.getBoard()));
play(board);
}

private Board createBoard() {
ElephantFormation hanElephantFormation = readElephantFormation(Camp.HAN);
ElephantFormation choElephantFormation = readElephantFormation(Camp.CHO);
return InitialPiecePlacement.initialize(hanElephantFormation, choElephantFormation);
}

private ElephantFormation readElephantFormation(Camp camp) {
return RetryHandler.retryOnInvalidInput(() -> {
ElephantSetUpFormat elephantSetUpFormat = InputView.readElephantSettingCommand(camp);
return elephantSetUpFormat.toElephantFormation(camp);
});
}

private List<PiecePositionDto> toPiecePositions(Map<Position, Piece> boardState) {
return boardState.entrySet().stream()
.map(entry -> PiecePositionDto.of(entry.getKey(), entry.getValue()))
.toList();
}

private void play(Board board) {
Turn turn = new Turn();
while (true) {
RetryHandler.retryOnInvalidInput(() -> playTurn(board, turn));
OutputView.printBoard(toPiecePositions(board.getBoard()));
}
}

private void playTurn(Board board, Turn turn) {
Camp camp = turn.currentTurn();
Position source = readSource(board, camp);
Position destination = readDestination(board, source, camp);
board.movePiece(source, destination, camp);
turn.finishTurn();
}

private Position readSource(Board board, Camp camp) {
return RetryHandler.retryOnInvalidInput(() -> {
Position source = Position.from(InputView.readSource(camp));
board.validateSource(source, camp);
return source;
});
}

private Position readDestination(Board board, Position source, Camp camp) {
return RetryHandler.retryOnInvalidInput(() -> {
Position destination = Position.from(InputView.readDestination());
board.validateDestination(destination, source, camp);
return destination;
});
}
}
60 changes: 60 additions & 0 deletions src/main/java/janggi/domain/Position.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package janggi.domain;

import janggi.exception.ExceptionMessage;
import java.util.List;

public record Position(int row, int column) {

private static final int POSITION_SIZE = 2;
private static final int MIN_POSITION_INDEX = 0;
private static final int MAX_ROW_INDEX = 9;
private static final int MAX_COLUMN_INDEX = 8;

public static Position from(List<Integer> rawPosition) {
validatePositionSize(rawPosition);
return new Position(rawPosition.get(0), rawPosition.get(1));
}

private static void validatePositionSize(List<Integer> position) {
if (position.size() != POSITION_SIZE) {
throw new IllegalArgumentException(ExceptionMessage.INVALID_INPUT_FORMAT.getMessage());
}
}
Comment on lines +13 to +22
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Position์„ ์ƒ์„ฑํ•  ๋•Œ size๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์—†๋„ค์š”~

Copy link
Copy Markdown
Author

@Jiihyun Jiihyun Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค!!
refactor: Position format ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

Copy link
Copy Markdown

@verus-j verus-j Apr 3, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์—†๋„ค์š”~


public Position {
validateRow(row);
validateColumn(column);
}

private void validateRow(int row) {
if (row < MIN_POSITION_INDEX || MAX_ROW_INDEX < row) {
throw new IllegalArgumentException(ExceptionMessage.ROW_OUT_OF_RANGE.getMessage(MIN_POSITION_INDEX, MAX_ROW_INDEX));
}
}

private void validateColumn(int column) {
if (column < MIN_POSITION_INDEX || MAX_COLUMN_INDEX < column) {
throw new IllegalArgumentException(ExceptionMessage.COLUMN_OUT_OF_RANGE.getMessage(MIN_POSITION_INDEX, MAX_COLUMN_INDEX));
}
}

public int calculateRowDistance(Position other) {
return row - other.row;
}

public int calculateColumnDistance(Position other) {
return column - other.column;
}

public Position moveRow(int distance) {
return new Position(row + distance, column);
}

public Position moveCol(int distance) {
return new Position(row, column + distance);
}

public Position moveDiagonal(int rowDistance, int colDistance) {
return new Position(row + rowDistance, column + colDistance);
}
}
16 changes: 16 additions & 0 deletions src/main/java/janggi/domain/Turn.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package janggi.domain;

import janggi.domain.piece.Camp;

public class Turn {

private Camp currentCamp = Camp.CHO;

public Camp currentTurn() {
return currentCamp;
}

public void finishTurn() {
currentCamp = currentCamp.next();
}
}
Loading