Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
187d101
docs: ๊ธฐ๋Šฅ๋ช…์„ธ ์ถ”๊ฐ€
boyekim Mar 25, 2026
c9434e9
feat: Team ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€
boyekim Mar 25, 2026
b6cb083
feat: Team ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ดˆ๋‚˜๋ผ, ํ•œ๋‚˜๋ผ ๋„๋ฉ”์ธ ์ถ”๊ฐ€
boyekim Mar 25, 2026
3ea93c4
feat: Board ๋„๋ฉ”์ธ ์ถ”๊ฐ€
boyekim Mar 25, 2026
5542ff4
feat: ๊ธฐ๋ฌผ์„ ํ‘œํ˜„ํ•˜๋Š” Piece ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€
boyekim Mar 25, 2026
e01fb6a
feat: ๋ฐฉํ–ฅ์„ ๊ด€๋ฆฌํ•˜๋Š” Delta ๋„๋ฉ”์ธ ์ถ”๊ฐ€
boyekim Mar 25, 2026
9dab556
feat: Delta์˜ ์ง‘ํ•ฉ ๋„๋ฉ”์ธ ์ถ”๊ฐ€
boyekim Mar 25, 2026
911e4ea
feat: ๊ธฐ๋ฌผ์˜ ์ ์ˆ˜์™€ ํ•œ๊ธ€ ์ด๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š” enum ์ถ”๊ฐ€
boyekim Mar 25, 2026
6b40cfd
feat: ํ•œ๋‚˜๋ผ์™€ ์ดˆ๋‚˜๋ผ๋ฅผ ๋ช…์‹œํ•˜๋Š” enum ์ถ”๊ฐ€
boyekim Mar 25, 2026
a969e12
feat: ๊ธฐ๋ฌผ ๋ณ„ ์ด๋™ ํŒ๋‹จ ๋กœ์ง ๊ตฌํ˜„
boyekim Mar 25, 2026
f637cef
feat: ๊ธฐ๋ฌผ ๋ฌถ์Œ ๋„๋ฉ”์ธ ์ถ”๊ฐ€
boyekim Mar 25, 2026
974e9ae
feat: ์œ„์น˜ ๊ฐ์ฒด ์ถ”๊ฐ€
boyekim Mar 25, 2026
4f8bd85
refactor: score ํ•„๋“œ ๊ฐ’ ์ œ๊ฑฐ
boyekim Mar 25, 2026
e0bc871
feat: ๊ฒฝ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  Turn ๋„๋ฉ”์ธ ์ถ”๊ฐ€
boyekim Mar 25, 2026
4d70770
feat: ์œ„์น˜์ •๋ณด ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
boyekim Mar 25, 2026
3ea6046
feat: ์žฅ๊ธฐํŒ ์ดˆ๊ธฐํ™” ๊ธฐ๋Šฅ
boyekim Mar 25, 2026
8bdc49c
feat: ๊ธฐ๋ฌผ ์ขŒํ‘œ ์ž…๋ ฅ ๋ฐ ๋ฐ˜ํ™˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„
boyekim Mar 25, 2026
02e3cc8
feat: ์žฅ๊ธฐ ์ด๋™ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
boyekim Mar 26, 2026
af928a6
feat: ์žฅ๊ธฐ ํƒ€์ž… ๋ฐ˜ํ™˜ ๊ตฌํ˜„๋ถ€ ์ถ”๊ฐ€
boyekim Mar 26, 2026
c5900f0
refactor: findTeamPiece ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ • ๋ฐ ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ
Chocoding1 Mar 27, 2026
57b9d55
refactor: ํด๋ž˜์Šค๋ช… Turns -> JanggiGame ๋ณ€๊ฒฝ
Chocoding1 Mar 27, 2026
9e4a136
refactor: ํด๋ž˜์Šค๋ช… Turns -> JanggiGame ๋ณ€๊ฒฝ
Chocoding1 Mar 27, 2026
829e685
refactor: View ๋ฉ”์„œ๋“œ static ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝ
Chocoding1 Mar 27, 2026
08a72d1
refactor: ์ดˆ๊ธฐ JanggiGame ์ƒ์„ฑ ๋กœ์ง ์ˆ˜์ •
Chocoding1 Mar 27, 2026
0b38b64
refactor: ๊ธฐ๋ฌผ ์ด๋™ ์‹œ ๊ธฐ๋ฌผ ์กฐํšŒ ๋กœ์ง ์ˆ˜์ •
Chocoding1 Mar 27, 2026
d0a9671
feat: ํ„ด ๋ช…์‹œ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
boyekim Mar 27, 2026
106c6ad
feat: ํ•œ ํ„ด ์ข…๋ฃŒ ์ดํ›„ ๋ณด๋“œ ํ˜„ํ™ฉ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
boyekim Mar 27, 2026
40bdea8
chore: ์ฃผ์„ ์‚ญ์ œ
boyekim Mar 27, 2026
74fc4e6
refactor: ๋น ์ง„ ๊ฒ€์ฆ๋ถ€ ์ถ”๊ฐ€
boyekim Mar 27, 2026
3d674d3
refactor: ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ์‚ญ์ œ ๋ฐ ๋ชจํ˜ธํ•œ ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝ
boyekim Mar 27, 2026
8ac9048
refactor: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์‚ญ์ œ
boyekim Mar 27, 2026
f718e15
refactor: ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์‚ญ์ œ
boyekim Mar 27, 2026
068f2af
test: ๊ธฐ๋ฌผ ์ฐจ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 27, 2026
918e074
test: ๊ธฐ๋ฌผ ๊ถ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 27, 2026
bc5c056
refactor: JanggiGame ๊ฐ€๋ณ€์œผ๋กœ ๋ณ€๊ฒฝ
boyekim Mar 27, 2026
6cd1332
refactor: ์ค‘๋ณต ๊ฒ€์ฆ ์ œ๊ฑฐ
boyekim Mar 27, 2026
329e9c2
refactor: ๋ฉ”์„œ๋“œ๋ช… ๋ณ€๊ฒฝ
boyekim Mar 27, 2026
32ff357
refactor: ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
Chocoding1 Mar 27, 2026
4f1273b
test: Board ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
1dbfe6b
test: Chu ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
00832cc
test: Han ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
31678c3
test: Jol ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
1b40919
test: Ma ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
1c6c40c
test: MovePath ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
c41f608
test: Pieces ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
214dbaf
test: Position ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
88cef72
test: Po ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
64a72f4
test: Sang ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
28279e8
test: Sa ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
a3ff7c5
test: Turn ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
boyekim Mar 30, 2026
d03b4bf
refactor: ๋ฉ”์„œ๋“œ ์ปจ๋ฒค์…˜ ์ค€์ˆ˜
Chocoding1 Mar 30, 2026
70ccba4
refactor: ์ƒ์„ฑ์ž ์ ‘๊ทผ ์ œ์–ด์ž ์ˆ˜์ •
Chocoding1 Mar 30, 2026
7723bfb
refactor: ๋ฉ”์„œ๋“œ๋ช…, ๋ณ€์ˆ˜๋ช… ์ˆ˜์ •
Chocoding1 Mar 30, 2026
3a5c315
refactor: ๋ฏธ์‚ฌ์šฉ ํ•„๋“œ ์ œ๊ฑฐ
Chocoding1 Mar 30, 2026
0df1517
refactor: ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
Chocoding1 Mar 30, 2026
14b6120
refactor: ์žฅ๊ธฐํŒ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ์ˆ˜์ •
boyekim Mar 30, 2026
6f5bc1c
refactor: ExceptionHandler -> ActionExecutor ํด๋ž˜์Šค๋ช… ๋ณ€๊ฒฝ
boyekim Mar 30, 2026
5f63b19
refactor: ๊ธฐ๋ฌผ ์ด๋™ ์‹œ ์ค‘๋ณต ๊ฒ€์ฆ ๋กœ์ง ์ œ๊ฑฐ
Chocoding1 Mar 30, 2026
bb76c43
docs: readme ์ˆ˜์ •
Chocoding1 Mar 30, 2026
5e1f8c5
refactor: ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
Chocoding1 Mar 30, 2026
8c1b511
refactor: Pieces์—์„œ Map์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์—ฌ ํ•œ ์ค„์— . ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋„๋ก ์ˆ˜์ •
Chocoding1 Mar 30, 2026
61e83d6
chore: ๋ฏธ์‚ฌ์šฉ import๋ฌธ ์ œ๊ฑฐ
Chocoding1 Mar 30, 2026
0c11a06
refactor: JanggiGame์„ JanggiRunner์˜ ํ•„๋“œ๋กœ ๋ณ€๊ฒฝ
Chocoding1 Mar 30, 2026
7ab7e22
refactor: ๊ธฐ๋ฌผ ์กฐํšŒ ๊ธฐ๋Šฅ์— ์ ํ•ฉํ•œ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
Chocoding1 Mar 30, 2026
7ddf820
refactor: ํ•œ ์ค„์— . ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ฌผ ์ด๋ฆ„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
Chocoding1 Mar 30, 2026
c24802b
๊ธฐ๋ฌผ๋ณ„ ์ด๋™ ๊ทœ์น™ ๋กœ์ง ์ˆ˜์ •
Chocoding1 Mar 31, 2026
4b66bfa
refactor: ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ ๋ณ€๊ฒฝ
Chocoding1 Mar 31, 2026
8b6c273
refactor: ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
Chocoding1 Mar 31, 2026
0a2f89b
chore: ๋ณ€์ˆ˜๋ช…, ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ •
Chocoding1 Mar 31, 2026
dbb4aae
chore: ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •
Chocoding1 Mar 31, 2026
ae37c36
chore: ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ •
Chocoding1 Mar 31, 2026
0026eb7
refactor: ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
Chocoding1 Mar 31, 2026
4590338
refactor: ์ค‘๋ณต ๋กœ์ง ๋ฉ”์„œ๋“œ ์ถ”์ถœ
Chocoding1 Mar 31, 2026
544c68f
refactor: ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
Chocoding1 Mar 31, 2026
baa91d4
refactor: Piece ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ถˆํ•„์š” ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •
Chocoding1 Mar 31, 2026
1c198af
refactor: ๋ถˆํ•„์š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ œ๊ฑฐ ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •
Chocoding1 Mar 31, 2026
aa9d572
refactor: BoardSpot์—์„œ Position ํ•„๋“œ ์ œ๊ฑฐ
Chocoding1 Mar 31, 2026
e3d00ea
refactor: ๋™์ผ ์œ„์น˜ ๊ฒ€์ฆ ๋กœ์ง Position ๊ฐ์ฒด๋กœ ์ด์ „
Chocoding1 Apr 1, 2026
8f0f014
refactor: ํ•œ ์นธ๋งŒ ๊ฐ”๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ Position ๊ฐ์ฒด๋กœ ์ด์ „
Chocoding1 Apr 1, 2026
95a3b05
refactor: ์ง์„  ์ด๋™ ์ฒดํฌ ๋กœ์ง Position ๊ฐ์ฒด๋กœ ์ด๋™
Chocoding1 Apr 1, 2026
604b712
refactor: delta ๊ณ„์‚ฐ ๋กœ์ง Position ๊ฐ์ฒด ๋‚ด๋ถ€๋กœ ์ด๋™
Chocoding1 Apr 1, 2026
53f1b21
refactor: Delta๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— enum ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ
Chocoding1 Apr 1, 2026
d4aa367
refactor: MovePath๊ฐ์ฒด ๋งค๋ฒˆ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋กœ ์ˆ˜์ •
Chocoding1 Apr 1, 2026
31c58d9
refactor: Piece interface๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ค‘๋ณต ๋ฉ”์„œ๋“œ ๋ฐ ์ค‘๋ณต ํ•„๋“œ ์ œ๊ฑฐ
Chocoding1 Apr 1, 2026
dfac78c
refactor: ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
Chocoding1 Apr 2, 2026
6fbbd6e
refactor: ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •
Chocoding1 Apr 2, 2026
871c469
chore: ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ •
Chocoding1 Apr 2, 2026
3ee750c
refactor: ๊ธฐ๋ฌผ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๊ฒ€์ฆ ๋กœ์ง ์ˆ˜์ •
Chocoding1 Apr 2, 2026
5f067b4
refactor: ์ค‘๋ณต ๋ฉ”์„œ๋“œ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ด๋™
Chocoding1 Apr 2, 2026
26e1f8b
chore: ๋นˆ ์ค„ ์ œ๊ฑฐ
Chocoding1 Apr 2, 2026
079cf1e
refactor: ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
Chocoding1 Apr 2, 2026
b0619a0
refactor: ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ์˜ˆ์™ธ ๋ฐœ์ƒ ์œ„์น˜ ๋ณ€๊ฒฝ
Chocoding1 Apr 2, 2026
bceaae4
refactor: Pieces ํด๋ž˜์Šค ์ œ๊ฑฐ & Team ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ
Chocoding1 Apr 2, 2026
9c14ad8
refactor: getter์— ๋ฐฉ์–ด์  ๋ณต์‚ฌ ์ ์šฉ
Chocoding1 Apr 2, 2026
5ab4d46
refactor: DTO ๋‚ด๋ถ€์— ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋„๋ฉ”์ธ์—์„œ DTO ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฅด๋„๋ก ์ˆ˜์ •
Chocoding1 Apr 2, 2026
ad0ab80
chore: ๋ฉ”์„œ๋“œ ์ˆœ์„œ ๋ณ€๊ฒฝ
Chocoding1 Apr 2, 2026
1270f39
refactor: ๋กœ์ง ๋ฉ”์„œ๋“œ ์ถ”์ถœ
Chocoding1 Apr 2, 2026
ba02709
refactor: ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ค‘๋ณต ๋กœ์ง ์ œ๊ฑฐ
Chocoding1 Apr 2, 2026
2ffdaf4
refactor: Piece์™€ Board ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ ์ œ๊ฑฐ
Chocoding1 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
61 changes: 60 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,62 @@
# java-janggi

์žฅ๊ธฐ ๋ฏธ์…˜ ์ €์žฅ์†Œ
## ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„
1. **[์ถœ๋ ฅ] ์žฅ๊ธฐ ๊ฒŒ์ž„ ์‹œ์ž‘ ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.**
2. **[์ค‘๊ฐ„ ๊ณผ์ •] ์žฅ๊ธฐํŒ์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.**
3. **[์ถœ๋ ฅ] ์ดˆ๊ธฐํ™”๋œ ์žฅ๊ธฐํŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.**
4. **[์ž…๋ ฅ] ์›€์ง์ผ ๊ธฐ๋ฌผ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.**

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์ขŒํ‘œ๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์ขŒํ‘œ๋ฅผ ์ˆซ์ž๋กœ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ๋ฐ–์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์ž…๋ ฅํ•œ ์ขŒํ‘œ์— ๊ธฐ๋ฌผ์ด ์—†์„ ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
5. **[์ž…๋ ฅ] ๋ชฉ์ ์ง€ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.**

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์ขŒํ‘œ๋ฅผ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์ขŒํ‘œ๋ฅผ ์ˆซ์ž๋กœ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ๋ฐ–์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

[์˜ˆ์™ธ์ฒ˜๋ฆฌ] ์ž…๋ ฅํ•œ ์ขŒํ‘œ ๋˜๋Š” ์ด๋™ ๊ฒฝ๋กœ์— ์•„๊ตฐ ๊ธฐ๋ฌผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ IllegalArgmentException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
6. **[์ค‘๊ฐ„ ๊ณผ์ •] ๊ธฐ๋ฌผ์„ ์ด๋™์‹œํ‚จ๋‹ค.**
7. **[์ถœ๋ ฅ] ๊ฐฑ์‹ ๋œ ์žฅ๊ธฐํŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.**

## ์ถœ๋ ฅ์˜ˆ์‹œ
```
์žฅ๊ธฐ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ใ€€ใ€€๏ผ‘ใ€€๏ผ’ใ€€๏ผ“ใ€€๏ผ”ใ€€๏ผ•ใ€€๏ผ–ใ€€๏ผ—ใ€€๏ผ˜ใ€€๏ผ™ใ€€
๏ผ‘๏ผใ€€์ฐจใ€€๋งˆใ€€์ƒใ€€์‚ฌใ€€๏ผŽใ€€์‚ฌใ€€์ƒใ€€๋งˆใ€€์ฐจใ€€
ใ€€๏ผ™ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๊ถใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ˜ใ€€๏ผŽใ€€ํฌใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€ํฌใ€€๏ผŽใ€€
ใ€€๏ผ—ใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€
ใ€€๏ผ–ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ•ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ”ใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€
ใ€€๏ผ“ใ€€๏ผŽใ€€ํฌใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€ํฌใ€€๏ผŽใ€€
ใ€€๏ผ’ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๊ถใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ‘ใ€€์ฐจใ€€๋งˆใ€€์ƒใ€€์‚ฌใ€€๏ผŽใ€€์‚ฌใ€€์ƒใ€€๋งˆใ€€์ฐจใ€€
์ดˆ๋‚˜๋ผ์˜ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.
์›€์ง์ผ ๊ธฐ๋ฌผ์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. (ex. 1,3)
1,1
์ฐจ์˜ ๋ชฉ์  ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. (ex. 1,3)
1,3
ใ€€ใ€€๏ผ‘ใ€€๏ผ’ใ€€๏ผ“ใ€€๏ผ”ใ€€๏ผ•ใ€€๏ผ–ใ€€๏ผ—ใ€€๏ผ˜ใ€€๏ผ™ใ€€
๏ผ‘๏ผใ€€์ฐจใ€€๋งˆใ€€์ƒใ€€์‚ฌใ€€๏ผŽใ€€์‚ฌใ€€์ƒใ€€๋งˆใ€€์ฐจใ€€
ใ€€๏ผ™ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๊ถใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ˜ใ€€๏ผŽใ€€ํฌใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€ํฌใ€€๏ผŽใ€€
ใ€€๏ผ—ใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€
ใ€€๏ผ–ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ•ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ”ใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€๏ผŽใ€€์กธใ€€
ใ€€๏ผ“ใ€€์ฐจใ€€ํฌใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€ํฌใ€€๏ผŽใ€€
ใ€€๏ผ’ใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๊ถใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€๏ผŽใ€€
ใ€€๏ผ‘ใ€€๏ผŽใ€€๋งˆใ€€์ƒใ€€์‚ฌใ€€๏ผŽใ€€์‚ฌใ€€์ƒใ€€๋งˆใ€€์ฐจใ€€
ํ•œ๋‚˜๋ผ์˜ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.
์›€์ง์ผ ๊ธฐ๋ฌผ์˜ ์ขŒํ‘œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. (ex. 1,3)

```
Empty file removed src/main/java/.gitkeep
Empty file.
9 changes: 9 additions & 0 deletions src/main/java/janggi/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package janggi;

public class Application {

public static void main(String[] args) {
JanggiRunner janggiRunner = new JanggiRunner();
janggiRunner.execute();
}
}
50 changes: 50 additions & 0 deletions src/main/java/janggi/JanggiRunner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package janggi;

import janggi.domain.JanggiGame;
import janggi.domain.Position;
import janggi.util.DelimiterParser;
import janggi.util.ActionExecutor;
import janggi.view.InputView;
import janggi.view.OutputView;
import java.util.List;

public class JanggiRunner {

private final JanggiGame janggiGame;

public JanggiRunner() {
this.janggiGame = JanggiGame.createInitialJanggiGame();
}

public void execute() {
OutputView.printStartMessage();

while (true) {
OutputView.printBoard(janggiGame.makeCurrentTurnBoardSnapShot());
Position startPosition = ActionExecutor.retryUntilSuccess(this::readValidStartPosition);
Position endPosition = ActionExecutor.retryUntilSuccess(() -> readValidEndPosition(startPosition));
janggiGame.doGame(startPosition, endPosition);
}
}

private Position readValidStartPosition() {
OutputView.printTurnNotice(janggiGame.getCurrentTurnTeamName());
OutputView.printAskPiecePosition();
Position startPosition = createPosition();
janggiGame.validatePieceExists(startPosition);
return startPosition;
}

private Position readValidEndPosition(Position startPosition) {
OutputView.printAskMovePosition(janggiGame.getPieceName(startPosition));
Position endPosition = createPosition();
janggiGame.validateValidEndPosition(startPosition, endPosition);
return endPosition;
}

private static Position createPosition() {
String rawPiecePosition = InputView.readLine();
List<String> parsedPiecePosition = DelimiterParser.parse(rawPiecePosition);
return Position.makePosition(parsedPiecePosition);
}
}
143 changes: 143 additions & 0 deletions src/main/java/janggi/domain/Board.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
package janggi.domain;

import janggi.domain.piece.Piece;
import janggi.domain.side.Chu;
import janggi.domain.side.Han;
import janggi.domain.side.Team;
import janggi.domain.side.TeamType;
import janggi.dto.BoardSpots;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class Board {

private static final int FIRST_INDEX = 1;
private static final int LAST_X_INDEX = 9;
private static final int LAST_Y_INDEX = 10;

private final Team chu;
private final Team han;

private Board(Team chu, Team han) {
this.chu = chu;
this.han = han;
}

public static Board createInitialBoard() {
return new Board(Chu.createInitialChu(), Han.createInitialHan());
}

public BoardSpots makeSnapShot() {
Map<Position, Piece> allPieces = new HashMap<>(chu.getPieces());
allPieces.putAll(han.getPieces());
return BoardSpots.from(allPieces);
}

public boolean isPieceExists(Position position, TeamType currentTeamType) {
validateRange(position);
Team currentTeam = currentTeam(currentTeamType);
return currentTeam.isPieceExists(position);
}

public String getPieceName(Position position, TeamType currentTeamType) {
Piece piece = findTeamPiece(position, currentTeam(currentTeamType));
return piece.name();
}

public void validateCanMove(Position start, Position end, TeamType currentTeamType) {
validateRange(end);
checkSamePosition(start, end);
validateTeamPieceExistsAtEnd(currentTeam(currentTeamType), end);
validatePiecesInPath(start, end, currentTeam(currentTeamType));
}

public Optional<Piece> findPiece(Position position) {
Optional<Piece> chuPiece = chu.findPiece(position);
if (chuPiece.isPresent()) {
return chuPiece;
}
return han.findPiece(position);
}

public Board move(Position start, Position end, TeamType currentTeamType) {
Team updatedCurrentTeam = currentTeam(currentTeamType).move(start, end);
Team updatedOpponentTeam = removeOpponentPiece(currentTeamType, end);
return createMovedBoard(currentTeamType, updatedCurrentTeam, updatedOpponentTeam);
}

private void validateRange(Position inputPosition) {
int x = inputPosition.getX();
int y = inputPosition.getY();
if (isNotInRange(FIRST_INDEX, LAST_X_INDEX, x) || isNotInRange(FIRST_INDEX, LAST_Y_INDEX, y)) {
throw new IllegalArgumentException("์ž…๋ ฅํ•œ ์ขŒํ‘œ๊ฐ€ ์žฅ๊ธฐํŒ ๋ฒ”์œ„ ๋ฐ–์ž…๋‹ˆ๋‹ค.");
}
}

private boolean isNotInRange(int start, int last, int index) {
return !isInRange(start, last, index);
}

private boolean isInRange(int start, int last, int index) {
return index >= start && index <= last;
}

private void checkSamePosition(Position start, Position end) {
if (start.isSamePosition(end)) {
throw new IllegalArgumentException("์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€๊ฐ€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.");
}
}

private void validateTeamPieceExistsAtEnd(Team team, Position end) {
if (team.isPieceExists(end)) {
throw new IllegalArgumentException("์•„๊ตฐ์ด ์กด์žฌํ•˜๋Š” ์ขŒํ‘œ๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
}

private Team currentTeam(TeamType currentTeamType) {
if (currentTeamType == TeamType.CHU) {
return chu;
}
return han;
}

private void validatePiecesInPath(Position start, Position end, Team currentTeam) {
Piece piece = findTeamPiece(start, currentTeam);
List<Position> piecePositionsInPath = piece.getPiecePositionsInPath(start, end);
List<Piece> piecesInPath = piecePositionsInPath.stream()
.map(this::findPiece)
.filter(Optional::isPresent)
.map(Optional::get)
.toList();
piece.validateCanMove(piecesInPath);
}

private Piece findTeamPiece(Position position, Team currentTeam) {
return currentTeam.findPiece(position)
.orElseThrow(() -> new IllegalArgumentException("์ž…๋ ฅํ•œ ์œ„์น˜์— ๊ธฐ๋ฌผ์ด ์—†์Šต๋‹ˆ๋‹ค."));
}

private Team removeOpponentPiece(TeamType currentTeamType, Position end) {
Team opponentTeam = opponentTeam(currentTeamType);
if (opponentTeam.findPiece(end).isEmpty()) {
return opponentTeam;
}
return opponentTeam.remove(end);
}

private Team opponentTeam(TeamType currentTeamType) {
if (currentTeamType == TeamType.CHU) {
return han;
}
return chu;
}

private Board createMovedBoard(TeamType currentTeamType, Team updatedCurrentTeam, Team updatedOpponentTeam) {
if (currentTeamType == TeamType.CHU) {
return new Board(updatedCurrentTeam, updatedOpponentTeam);
}
return new Board(updatedOpponentTeam, updatedCurrentTeam);
}
Comment on lines +137 to +142
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Board๋ฅผ ๋ถˆ๋ณ€๊ฐ์ฒด๋กœ ๋งŒ๋“ค๋ฉด ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋‚˜์š”??

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํ˜„์žฌ List์„ ํ†ตํ•ด ๊ธฐ๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก ์„ค๊ณ„๋ฅผ ํ–ˆ๊ณ , ๊ฐ Turn ์•ˆ์—๋Š” ํ„ด๋งˆ๋‹ค์˜ Board ์ƒํƒœ๊ฐ€ ํ•„๋“œ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
์ด Board๋ฅผ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๋ฉด ๋‹ค๋ฅธ Turn์—์„œ์˜ Board ๋ณ€๊ฒฝ์ด ์ด์ „ Turn์˜ Board์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ๋˜๊ณ , ์ด๋กœ ์ธํ•ด ๊ฐ ํ„ด์—์„œ์˜ Board ์ƒํƒœ๋ฅผ ์˜จ์ „ํžˆ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

}
30 changes: 30 additions & 0 deletions src/main/java/janggi/domain/Delta.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package janggi.domain;

public enum Delta {

UP(0, 1),
DOWN(0, -1),
RIGHT(1, 0),
LEFT(-1, 0),
RIGHT_UP(1, 1),
LEFT_UP(-1, 1),
RIGHT_DOWN(1, -1),
LEFT_DOWN(-1, -1),
;

private final int dx;
private final int dy;

Delta(int dx, int dy) {
this.dx = dx;
this.dy = dy;
}

public int getDx() {
return dx;
}

public int getDy() {
return dy;
}
}
55 changes: 55 additions & 0 deletions src/main/java/janggi/domain/JanggiGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package janggi.domain;

import janggi.dto.BoardSpots;

import java.util.ArrayList;
import java.util.List;

public class JanggiGame {

private final List<Turn> turns;

private JanggiGame(List<Turn> turns) {
this.turns = new ArrayList<>(turns);
}

public static JanggiGame createInitialJanggiGame() {
return new JanggiGame(List.of(Turn.createInitialTurn()));
}

public BoardSpots makeCurrentTurnBoardSnapShot() {
Turn lastTurn = getLastTurn();
return lastTurn.makeBoardSnapShot();
}

public String getCurrentTurnTeamName() {
Turn lastTurn = getLastTurn();
return lastTurn.nextTurnTeam();
}

public void validatePieceExists(Position position) {
Turn lastTurn = getLastTurn();
if (!lastTurn.isNextTurnTeamPieceExists(position)) {
throw new IllegalArgumentException("๊ธฐ๋ฌผ์ด ์กด์žฌํ•˜๋Š” ์ขŒํ‘œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.");
}
}

public String getPieceName(Position position) {
return getLastTurn().getPieceName(position);
}

public void validateValidEndPosition(Position start, Position end) {
Turn lastTurn = getLastTurn();
lastTurn.validateCanMove(start, end);
}

public void doGame(Position start, Position end) {
Turn lastTurn = getLastTurn();
Turn newTurn = lastTurn.move(start, end);
turns.add(newTurn);
}

private Turn getLastTurn() {
return turns.getLast();
}
}
Loading