Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
31156ca
docs: 1๋‹จ๊ณ„ ๋ณด๋“œ์ดˆ๊ธฐํ™” ๋ฌธ์„œ ์ž‘์„ฑ
jihwankim128 Mar 24, 2026
479c1d2
feat: ํ•œ/์ดˆ ์ƒ์ฐจ๋ฆผ ์ž…๋ ฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
Sauter001 Mar 25, 2026
d48f485
feat: ์ƒ์ฐจ๋ฆผ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
jihwankim128 Mar 25, 2026
e3deb3e
docs: 2๋‹จ๊ณ„ ๊ธฐ๋ฌผ ์ด๋™ ๊ธฐ๋Šฅ ๋ช…์„ธ
Sauter001 Mar 25, 2026
43b6a34
feat: ๊ธฐ๋ฌผ ์ด๋™ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
jihwankim128 Mar 26, 2026
4aa1071
์ฐจ/์ƒ/๋งˆ์— ๋Œ€ํ•œ ๋ฉฑ ๊ธฐ์ค€ ์ ์šฉ
Sauter001 Mar 26, 2026
c0b0c98
refactor: ๊ธฐ๋ฌผ์˜ ์ง„์˜ ํŒ๋‹จ ๋กœ์ง ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌ(isCho)
Sauter001 Mar 26, 2026
6dc5899
feat: ํฌ ์ด๋™ ๊ทœ์น™ ์ถ”๊ฐ€
Sauter001 Mar 27, 2026
f389157
refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” import ์ œ๊ฑฐ ๋ฐ ๋ฉ”์†Œ๋“œ ์ˆœ์„œ step-down ๋ฐฉ์‹ ์ ์šฉ
Sauter001 Mar 27, 2026
a994b25
style: ์ฃผ์„ javadocs๋กœ ๋ณ€๊ฒฝ
Sauter001 Mar 27, 2026
8a9035d
refactor: import.* ํ•ด์ œ
Sauter001 Mar 27, 2026
ca929e7
refactor: ์ƒ, ๋งˆ๊ฐ€ ๋ฉฑ์ผ ๋•Œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
Sauter001 Mar 27, 2026
e980fe6
refactor: ๋ฉ”์„œ๋“œ ์ˆœ์„œ ์ˆ˜์ •
jihwankim128 Mar 27, 2026
ebba9f4
refactor: ์žฅ๊ธฐํŒ ๋กœ์ง ์ค‘๊ด„ํ˜ธ Depth ๊ฐ์†Œํ•˜๋Š” ๋กœ์ง์œผ๋กœ ์ˆ˜์ •
jihwankim128 Mar 27, 2026
c26b932
refactor: ์ฃผ์„ ์ œ๊ฑฐ
jihwankim128 Mar 27, 2026
7015c8b
test: ์ฐจ์™€ ํฌ ๊ธฐ๋ฌผ ์ด๋™ test fixture ๋ฐ์ดํ„ฐ ์…‹ ์ˆ˜์ •
jihwankim128 Mar 30, 2026
d6a8dd6
test: ํ…Œ์ŠคํŠธ ์ค‘๋ณต ์ œ๊ฑฐ ๋ฐ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ์ฒด ํ…Œ์ŠคํŠธ๋กœ ์ด๋™
jihwankim128 Mar 30, 2026
7fba746
refactor: ๊ธฐ๋ฌผ ์ด๋™ ๊ฒฝ๋กœ ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง
jihwankim128 Mar 31, 2026
6e7083e
refactor: ๋ณด๋“œ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜๊ณผ ์žฅ๊ธฐ AggregateRoot ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
jihwankim128 Mar 31, 2026
b44e3fd
refactor: ์žฅ๊ธฐํŒ ๊ด€๋ จ ํด๋ž˜์Šค ํŒจํ‚ค์ง€ ๋ถ„๋ฆฌ
jihwankim128 Mar 31, 2026
ba78637
refactor: board move ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง
jihwankim128 Apr 1, 2026
cb70ddc
refactor: ์žฅ๊ธฐ ํฌ๋ฉ”์ด์…˜ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง
jihwankim128 Apr 2, 2026
528918a
refactor: ๊ธฐ๋ฌผ ์„ ํƒ ๋ฐ ๋ฐฐ์น˜์— ๋Œ€ํ•œ ์ž…๋ ฅ ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ ์ˆ˜์ •
jihwankim128 Apr 2, 2026
b743a35
refactor: ๋ณด๋“œ ๋ฐ ์žฅ๊ธฐ๊ฒŒ์ž„ ์ถ”์ƒํ™” ์ˆ˜์ค€ ํ†ต์ผ
jihwankim128 Apr 2, 2026
a531224
refactor: ๊ธฐ๋ฌผ ๋ณ„ ์ด๋™ ์ค‘๋ณต ๋กœ์ง ๋ถ„๋ฆฌ
jihwankim128 Apr 3, 2026
f20b496
refactor: ๊ธฐ๋ฌผ ์ด๋™ ๊ฒ€์ฆ ๋กœ์ง ๊ฐœ์„ 
jihwankim128 Apr 3, 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
187 changes: 185 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,186 @@
# java-janggi
# 1๋‹จ๊ณ„ - ๋ณด๋“œ ์ดˆ๊ธฐํ™”

์žฅ๊ธฐ ๋ฏธ์…˜ ์ €์žฅ์†Œ
```
ํ•œ๋‚˜๋ผ์˜ ์ƒ์ฐจ๋ฆผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.
1. ์ƒ๋งˆ์ƒ๋งˆ
2. ๋งˆ์ƒ๋งˆ์ƒ
3. ๋งˆ์ƒ์ƒ๋งˆ
4. ์ƒ๋งˆ๋งˆ์ƒ

3

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

5
[ERROR] ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒ์ฐจ๋ฆผ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

3

ใ€€ใ€€ใ€€๏ผใ€€๏ผ‘ใ€€๏ผ’ใ€€๏ผ“ใ€€๏ผ”ใ€€๏ผ•ใ€€๏ผ–ใ€€๏ผ—ใ€€๏ผ˜
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹
๏ผ๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
๏ผ‘๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆผขใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ’๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ“๏ฝœใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ฝœ
๏ผ”๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ•๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ–๏ฝœใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ฝœ
๏ผ—๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ˜๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆฅšใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ™๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹
```

## ๊ธฐ๋Šฅ ์ •๋ฆฌ

- ์ƒ์ฐจ๋ฆผ ์ˆœ์„œ ๊ด€๋ฆฌ
- ํ•œ๋‚˜๋ผ๋ถ€ํ„ฐ ์ƒ์ฐจ๋ฆผ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.
- ๋‹ค์Œ์œผ๋กœ ์ดˆ๋‚˜๋ผ ์ƒ์ฐจ๋ฆผ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค.
- ์ž˜๋ชป๋œ ์ž…๋ ฅ์‹œ ์˜ˆ์™ธ
- ์ƒ์ฐจ๋ฆผ ๋ณ„ ์ƒํƒœ ๊ด€๋ฆฌ
- ์ƒ๋งˆ์ƒ๋งˆ
- ๋งˆ์ƒ๋งˆ์ƒ
- ๋งˆ์ƒ์ƒ๋งˆ
- ์ƒ๋งˆ๋งˆ์ƒ
- ์ดˆ๊ธฐ ๋ฐฐ์น˜๋ฅผ ์œ„ํ•œ ๋ณด๋“œ ์ •๋ณด
- ์œ„์น˜
- ๊ฒฉ์ž ๋ฒ”์œ„
- ๋ฐฐ์น˜๋  ์žฅ๊ธฐ๋ง
- ์žฅ๊ธฐ๋ง ์ •๋ณด
- ์ฐจ, ๋งˆ, ์ƒ, ์‚ฌ, ์กธ(๋ณ‘), ํฌ, ์žฅ
- ์ž์‹ ์˜ ๋‚˜๋ผ ์ •๋ณด
- ๋‚˜๋ผ ์ •๋ณด
- ํ•œ, ์ดˆ

## ๊ตฌํ˜„ ์ˆœ์„œ

* ์ดˆ๋‚˜๋ผ/ํ•œ๋‚˜๋ผ ์ƒ์ฐจ๋ฆผ ์ž…๋ ฅ
* ๋‚˜๋ผ ๋ณ„ ์œ ํšจํ•œ ์ƒ์ฐจ๋ฆผ์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
* ์ƒ์ฐจ๋ฆผ์— ๋”ฐ๋ฅธ ์žฅ๊ธฐํŒ ์ดˆ๊ธฐ ๋ฐฐ์น˜
* ์žฅ๊ธฐํŒ์— ์œ„์น˜ํ•  ์žฅ๊ธฐ๋ง์ด ํ•„์š”ํ•˜๋‹ค.
* ์ฐจ, ์ƒ, ๋งˆ, ํฌ, ์กธ, ์‚ฌ, ์žฅ
* ์ด๋ฆ„
์ •๋ณด: [๋‚˜๋ฌด์œ„ํ‚ค](https://namu.wiki/w/%EC%9E%A5%EA%B8%B0/%EA%B8%B0%EB%AC%BC%20%EB%B0%8F%20%ED%96%89%EB%A7%88%EB%B2%95)
์ฐธ์กฐ
* ์žฅ๊ธฐ๋ง์ด ์œ„์น˜ํ•  ์œ„์น˜ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
* ์žฅ๊ธฐํŒ ์œ„์น˜ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด์•ผํ•œ๋‹ค.
* ์žฅ๊ธฐํŒ์ด ํ•„์š”ํ•˜๋‹ค.

# 2๋‹จ๊ณ„ - ๊ธฐ๋ฌผ ์ด๋™

- 2๋‹จ๊ณ„์—์„œ๋Š” ๊ธฐ๋ฌผ ์ด๋™ ๊ตฌํ˜„์ด ๋ชฉ์ ์ด๋‹ˆ๊นŒ ์ข…๋ฃŒ๋Š” `Ctrl+C`๋กœ ๊ฐ•์ œ ์ข…๋ฃŒํ•œ๋‹ค.

## ์ž˜๋ชป๋œ ๊ธฐ๋ฌผ ์„ ํƒ ์‹œ๋‚˜๋ฆฌ์˜ค

1. ๋‹ค๋ฅธ ๋‚˜๋ผ์˜ ๊ธฐ๋ฌผ์„ ์„ ํƒํ–ˆ์„ ๋•Œ
1. ์˜ˆ์™ธ: ๋‹ค๋ฅธ๋‚˜๋ผ์˜ ๊ธฐ๋ฌผ ์„ ํƒ
2. `[ERROR] ๋‹ค๋ฅธ ๋‚˜๋ผ์˜ ๊ธฐ๋ฌผ์„ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`
2. ๊ธฐ๋ฌผ์ด ์—†๋Š” ๊ณณ์„ ์„ ํƒํ–ˆ๋‹ค. (๋นˆ์นธ or ์žฅ๊ธฐํŒ ์™ธ๋ถ€)
1. ์˜ˆ์™ธ: ๊ธฐ๋ฌผ์ด ์—†๋Š” ๊ณณ์„ ์„ ํƒ
2. `[ERROR] ํ˜„์žฌ ์œ„์น˜์— ์กด์žฌํ•˜๋Š” ๊ธฐ๋ฌผ์ด ์—†์Šต๋‹ˆ๋‹ค.`

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

- ๊ถ์„ฑ ์˜์—ญ - ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค. (์‚ฌ์ดํด 2)
- ๊ธฐ๋ฌผ ์ด๋™ ๊ทœ์น™ ๊ณตํ†ต
- ํ˜„์žฌ ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
- ๋ณด๋“œ ์˜์—ญ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
- ๋ชฉ์ ์ง€์— ์•„๊ตฐ์ด ์žˆ์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
- ๋ชฉ์ ์ง€์— ์ ๊ตฐ์ด ์žˆ์œผ๋ฉด ์žก์•„๋‚ธ๋‹ค.

- `์ฐจ`: 4๋ฐฉ์œ„๋กœ ์ด๋™ํ•œ๋‹ค.
- ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
- `ํฌ`: 4๋ฐฉ์œ„๋กœ ์ด๋™ํ•œ๋‹ค.
- ๋ฌด์กฐ๊ฑด ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ํฌ๋ฅผ ์ œ์™ธํ•œ ๊ธฐ๋ฌผ์ด ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
- `๋งˆ`: 4๋ฐฉ์œ„ ์ค‘ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๊ณ  ๋Œ€๊ฐ์„ ์˜ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ 1์นธ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.
- ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
- `์ƒ`: 4๋ฐฉ์œ„ ์ค‘ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๊ณ  ๋Œ€๊ฐ์„ ์˜ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ 2์นธ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.
- ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ๊ฒฝ๋กœ์— ๊ธฐ๋ฌผ์ด ์žˆ์œผ๋ฉด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค.
- `์กธ`: ์ง์ง„๊ณผ ์ขŒ, ์šฐ๋กœ๋งŒ ํ•œ ์นธ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.
- ํ•œ ์นธ์ด๋ผ์„œ ๊ฒฝ๋กœ์— ๊ธฐ๋ฌผ์ด ์žˆ์„ ๋ฆฌ๊ฐ€ ์—†๋‹ค.
- `์‚ฌ, ์žฅ`: ๊ถ์„ฑ ์˜์—ญ์ด๋ฏ€๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

## ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

```
1๋‹จ๊ณ„ ...

ใ€€ใ€€ใ€€๏ผใ€€๏ผ‘ใ€€๏ผ’ใ€€๏ผ“ใ€€๏ผ”ใ€€๏ผ•ใ€€๏ผ–ใ€€๏ผ—ใ€€๏ผ˜
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹
๏ผ๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
๏ผ‘๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆผขใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ’๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ“๏ฝœใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ฝœ
๏ผ”๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ•๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ–๏ฝœใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ฝœ
๏ผ—๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ˜๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆฅšใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ™๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹

[์ดˆ๋‚˜๋ผ] ์ด๋™ํ•  ๊ธฐ๋ฌผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. (์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)
๊ธฐ๋ฌผ: 6,8

[์ดˆ๋‚˜๋ผ] ๊ธฐ๋ฌผ ๅ’์˜ ๋‹ค์Œ ์œ„์น˜๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”. (์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)
์œ„์น˜: 6,7


ใ€€ใ€€ใ€€๏ผใ€€๏ผ‘ใ€€๏ผ’ใ€€๏ผ“ใ€€๏ผ”ใ€€๏ผ•ใ€€๏ผ–ใ€€๏ผ—ใ€€๏ผ˜
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹
๏ผ๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
๏ผ‘๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆผขใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ’๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ“๏ฝœใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ฝœ
๏ผ”๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ•๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ–๏ฝœใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€ๅ’ใ€€๏ผŠใ€€๏ฝœ
๏ผ—๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ˜๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆฅšใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ™๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹

[ํ•œ๋‚˜๋ผ] ์ด๋™ํ•  ๊ธฐ๋ฌผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. (์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)
๊ธฐ๋ฌผ: 3,1

[ERROR] ํ˜„์žฌ ์œ„์น˜์— ์กด์žฌํ•˜๋Š” ๊ธฐ๋ฌผ์ด ์—†์Šต๋‹ˆ๋‹ค.


[ํ•œ๋‚˜๋ผ] ์ด๋™ํ•  ๊ธฐ๋ฌผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. (์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)
๊ธฐ๋ฌผ: 3,0


[ํ•œ๋‚˜๋ผ] ๊ธฐ๋ฌผ ๅ…ต์˜ ๋‹ค์Œ ์œ„์น˜๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š”. (์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)
์œ„์น˜: 3,1

ใ€€ใ€€ใ€€๏ผใ€€๏ผ‘ใ€€๏ผ’ใ€€๏ผ“ใ€€๏ผ”ใ€€๏ผ•ใ€€๏ผ–ใ€€๏ผ—ใ€€๏ผ˜
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹
๏ผ๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
๏ผ‘๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆผขใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ’๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ“๏ฝœใ€€๏ผŠใ€€ๅ…ตใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ผŠใ€€ๅ…ตใ€€๏ฝœ
๏ผ”๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ•๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ–๏ฝœใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€๏ผŠใ€€ๅ’ใ€€ๅ’ใ€€๏ผŠใ€€๏ฝœ
๏ผ—๏ฝœใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๅŒ…ใ€€๏ผŠใ€€๏ฝœ
๏ผ˜๏ฝœใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€ๆฅšใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ผŠใ€€๏ฝœ
๏ผ™๏ฝœใ€€่ปŠใ€€้ฆฌใ€€่ฑกใ€€ๅฃซใ€€๏ผŠใ€€ๅฃซใ€€่ฑกใ€€้ฆฌใ€€่ปŠใ€€๏ฝœ
ใ€€๏ผ‹๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผ‹
```

## ๊ตฌํ˜„ ์ˆœ์„œ

1. ๊ธฐ๋ฌผ ์ด๋™ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
* ๋‚˜๋ผ ๋ณ„ ์ž…๋ ฅ
* ์ด๋™ํ•  ๊ธฐ๋ฌผ์˜ ์œ„์น˜๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค.
* ํ•ด๋‹น ์œ„์น˜์— ๊ธฐ๋ฌผ์ด ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
* ํ•ด๋‹น ์œ„์น˜์˜ ๊ธฐ๋ฌผ์ด ๋‹ค๋ฅธ ํŒ€์ด๋ผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
* ์ž˜๋ชป๋œ ๋ฒ”์œ„๋ผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. (๋ณด๋“œ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚จ)
* ๊ธฐ๋ฌผ์˜ ์ด๋™ํ•  ์œ„์น˜๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค.
* ์ž˜๋ชป๋œ ๋ฒ”์œ„๋ผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค.
* ํ•ด๋‹น ์œ„์น˜์— ์•„๊ตฐ์˜ ๊ธฐ๋ฌผ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
* ๊ธฐ๋ฌผ ๋ณ„๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๋ชฉ์ ์ง€๋ผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
10 changes: 10 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import controller.JanggiController;
import view.InputView;
import view.OutputView;

public class Application {
public static void main(String[] args) {
JanggiController janggiController = new JanggiController(new InputView(), new OutputView());
janggiController.run();
}
}
61 changes: 61 additions & 0 deletions src/main/java/controller/JanggiController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package controller;

import static controller.Retrier.retry;
import static model.Team.CHO;
import static model.Team.HAN;

import java.util.function.Consumer;
import model.JanggiGame;
import model.Team;
import model.board.Board;
import model.board.BoardFactory;
import model.board.JanggiFormation;
import model.board.Position;
import model.piece.Piece;
import view.InputView;
import view.OutputView;

public class JanggiController {
private final InputView inputView;
private final OutputView outputView;

public JanggiController(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

public void run() {
Board board = createBoardByFormation();
outputView.displayBoard(board.board());

JanggiGame janggiGame = new JanggiGame(board);
while (true) {
retry(() -> playByTurn(janggiGame), processError());
outputView.displayBoard(board.board());
}
}

private Board createBoardByFormation() {
JanggiFormation hanFormation = retry(() -> inputView.readFormationByTeam(HAN), processError());
JanggiFormation choFormation = retry(() -> inputView.readFormationByTeam(CHO), processError());

Board board = BoardFactory.generateDefaultPieces();
board.arrangePieces(hanFormation.generateByTeam(HAN));
board.arrangePieces(choFormation.generateByTeam(CHO));
Comment on lines +43 to +44
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ํŒ€ ์ •๋ณด๋ฅผ Formation ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค~

return board;
}

private void playByTurn(JanggiGame janggiGame) {
Team currentTurn = janggiGame.getTurn();

Position current = inputView.readPiecePositionForMove(currentTurn);
Piece piece = janggiGame.selectPiece(current);

Position next = inputView.readPiecePositionForArrange(currentTurn, piece);
janggiGame.movePiece(current, next);
}

private Consumer<IllegalArgumentException> processError() {
return (e) -> outputView.displayError(e.getMessage());
}
}
31 changes: 31 additions & 0 deletions src/main/java/controller/Retrier.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package controller;

import java.util.function.Consumer;
import java.util.function.Supplier;

public final class Retrier {
private Retrier() {
}

public static <T> T retry(Supplier<T> task, Consumer<IllegalArgumentException> consumer) {
while (true) {
try {
return task.get();
} catch (IllegalArgumentException e) {
consumer.accept(e);
}
}
}


public static void retry(Runnable task, Consumer<IllegalArgumentException> consumer) {
while (true) {
try {
task.run();
return;
} catch (IllegalArgumentException e) {
consumer.accept(e);
}
}
}
}
39 changes: 39 additions & 0 deletions src/main/java/model/JanggiGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package model;

import java.util.List;
import model.board.Board;
import model.board.Position;
import model.piece.Piece;

public class JanggiGame {

private final Board board;
private Team turn;

public JanggiGame(Board board) {
this.board = board;
this.turn = Team.CHO;
}

public void movePiece(Position current, Position next) {
Piece piece = selectPiece(current);

List<Position> path = piece.extractPath(current, next);
List<Piece> pieces = board.extractPiecesByPath(path);

piece.validatePathCondition(pieces);
board.move(current, next);

this.turn = turn.next();
}

public Piece selectPiece(Position position) {
Piece piece = board.pickPiece(position);
turn.validateAlly(piece);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

turn์˜ validateAlly์—์„œ piece์—๊ฒŒ ๋‹ค์‹œ turn์„ ๋„˜๊ฒจ์„œ ๊ฒ€์ฆ์„ ํ•˜๊ณ  ์žˆ๋˜๋ฐ ํ˜ธ์ถœ ๊ตฌ์กฐ๋ฅผ ์‹ฌํ”Œํ•˜๊ฒŒ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐ„๋‹จํžˆ JanggiGame์•ˆ์—์„œ validateAlly ๊ตฌํ˜„์„ ๋„ฃ์œผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

return piece;
}

public Team getTurn() {
return turn;
}
}
34 changes: 34 additions & 0 deletions src/main/java/model/Team.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package model;

import model.piece.Piece;

public enum Team {
HAN("ํ•œ๋‚˜๋ผ"), CHO("์ดˆ๋‚˜๋ผ");

private final String name;

Team(String name) {
this.name = name;
}

public void validateAlly(Piece piece) {
if (piece.isOtherTeam(this)) {
throw new IllegalArgumentException(this.name + "์˜ ๊ธฐ๋ฌผ์ด ์•„๋‹™๋‹ˆ๋‹ค.");
}
}

public boolean isHan() {
return this == HAN;
}

public Team next() {
if (isHan()) {
return CHO;
}
return HAN;
}

public String getName() {
return name;
}
}
Loading