Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
e8a296a
test: λ°μ΄ν„°λ² μ΄μŠ€ init 호좜 μ‹œ ν…Œμ΄λΈ” 생성 ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
1ddd06f
feat: λ°μ΄ν„°λ² μ΄μŠ€ init 호좜 μ‹œ ν…Œμ΄λΈ” 생성 κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
3c0d493
refactor: ν…Œμ΄λΈ”μ΄ μžˆμ„ μ‹œ λ‹€μ‹œ 생성 λ˜μ§€ μ•Šλ„λ‘ μŠ€ν‚€λ§ˆ μˆ˜μ •
jyt6640 Mar 31, 2026
e6725b9
refactor: urlκ³Ό μ‚¬μš©μž, λΉ„λ°€λ²ˆν˜Έλ₯Ό μ£Όμž…λ°›λ„λ‘ μ„€μ •
jyt6640 Mar 31, 2026
ff07bc8
docs: μΆ”κ°€λœ κΈ°λŠ₯ κ΅¬ν˜„ λͺ©λ‘ μž‘μ„±
jyt6640 Mar 31, 2026
696902f
feat: κ²Œμž„ μŠ€λƒ…μƒ· 및 μš”μ•½ dto 생성
jyt6640 Mar 31, 2026
a9b161e
feat: κ²Œμž„ μ €μž₯μ†Œ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
jyt6640 Mar 31, 2026
4b5d194
test: κ²Œμž„ μ €μž₯ 및 λͺ¨λ“  κ²Œμž„μ„ μ°Ύμ•„μ˜€λŠ” ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
00b9850
feat: κ²Œμž„ μ €μž₯ 및 λͺ¨λ“  κ²Œμž„μ„ μ°Ύμ•„μ˜€λŠ” κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
4727d5b
test: κ²Œμž„ id둜 μ €μž₯된 κ²Œμž„ 쑰회 ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
db807d1
feat: κ²Œμž„ id둜 μ €μž₯된 κ²Œμž„ 쑰회 κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
32a4ab0
test: κ²Œμž„ μƒνƒœ μˆ˜μ • ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
23c085e
feat: κ²Œμž„ μƒνƒœ μˆ˜μ • κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
5a49376
refactor: state 넀이밍 λ³€κ²½ 및 κΈ°λ¬Ό/μœ„μΉ˜ λ°˜ν™˜ κΈ°λŠ₯ μΆ”κ°€
jyt6640 Mar 31, 2026
6bd4415
test: Board ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
dd04223
test: Board ν˜„μž¬ μƒνƒœ λ°˜ν™˜ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
1af2477
feat: Board ν˜„μž¬ μƒνƒœ λ°˜ν™˜ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
2ab4efc
test: μž₯κΈ° κ²Œμž„ ν…ŒμŠ€νŠΈ 보강 및 μΆ”κ°€
jyt6640 Mar 31, 2026
42b8183
feat: μž₯κΈ° κ²Œμž„ κΈ°λŠ₯ μΆ”κ°€
jyt6640 Mar 31, 2026
c5679d5
test: μž₯κΈ° κ²Œμž„ μ €μž₯ κ²Œμž„ λͺ©λ‘ 쑰회 ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
e9af6c7
test: μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 라이브러리 제거
jyt6640 Mar 31, 2026
7fe74e2
feat: μ €μž₯된 κ²Œμž„ λͺ©λ‘ 쑰회 κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
53fe18d
test: μ €μž₯된 κ²Œμž„μ΄ 없을 μ‹œ μƒˆ κ²Œμž„ μ‹œμž‘ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
cfadd1c
test: μ €μž₯된 κ²Œμž„μ΄ 없을 μ‹œ μƒˆ κ²Œμž„ μ‹œμž‘ ν…ŒμŠ€νŠΈ μˆ˜μ •
jyt6640 Mar 31, 2026
b0d55fe
feat: μž₯κΈ° κ²Œμž„ μ‹œμž‘ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
4a57b58
test: μž₯κΈ° κ²Œμž„ μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
c8a327f
feat: μ„ νƒν•œ κ²Œμž„ μž¬μ‹œμž‘ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
b4fdc9b
test: 턴이 λ„˜μ–΄κ°€λ©΄ κ²Œμž„ μƒνƒœ μ €μž₯ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
cf3ea5b
feat: 턴이 λ„˜μ–΄κ°€λ©΄ κ²Œμž„ μƒνƒœ μ €μž₯ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
8e7d362
refactor: save() 리턴 κΈ°λŠ₯ Long νƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•˜λ„λ‘ λ³€κ²½
jyt6640 Mar 31, 2026
4dbbd4e
test: μƒˆ κ²Œμž„μ„ μƒμ„±ν•˜κ³  μ €μž₯ν•˜λŠ” ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Mar 31, 2026
5682555
feat: μƒˆ κ²Œμž„μ„ μƒμ„±ν•˜κ³  μ €μž₯ν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
1a122f7
feat: 상차림 κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Mar 31, 2026
67a37e8
feat: InputView κ΅¬ν˜„
jyt6640 Mar 31, 2026
cc71757
feat: OutputView κ΅¬ν˜„
jyt6640 Mar 31, 2026
1f89b60
feat: μž₯κΈ° κ²Œμž„ DB 연동 κ΅¬ν˜„
jyt6640 Mar 31, 2026
b7dad1a
refactor: μ—λŸ¬ λ©”μ„Έμ§€ μˆ˜μ •
jyt6640 Mar 31, 2026
3487575
refactor: νŒ¨ν‚€μ§€ λͺ… λ³€κ²½ 및 클래슀 μœ„μΉ˜ μˆ˜μ •
jyt6640 Apr 2, 2026
c0f023d
refactor: νŒ¨ν‚€μ§€ λͺ… λ³€κ²½ 및 클래슀 μœ„μΉ˜ μˆ˜μ •
jyt6640 Apr 2, 2026
88461d4
test: 좜발과 도착 μœ„μΉ˜κ°€ ꢁ성 μ•ˆμ— μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κΈ°λŠ₯ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 2, 2026
0ea1aa8
feat: 좜발과 도착 μœ„μΉ˜κ°€ ꢁ성 μ•ˆμ— μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
e7ab8d2
test: 좜발과 도착 μœ„μΉ˜κ°€ ꢁ성 μ•ˆμ—μ„œ λŒ€κ°μ„ μœΌλ‘œ μ΄λ™ν•˜λŠ”μ§€ νŒλ‹¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 2, 2026
a1134ad
feat: 좜발과 도착 μœ„μΉ˜κ°€ ꢁ성 μ•ˆμ—μ„œ λŒ€κ°μ„ μœΌλ‘œ μ΄λ™ν•˜λŠ”μ§€ νŒλ‹¨ν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
911e2be
test: ꢁ성 μ•ˆμ—μ„œ λŒ€κ°μ„ μœΌλ‘œ μ΄λ™ν•˜λŠ” κΈ°λŠ₯
jyt6640 Apr 2, 2026
382fe5e
feat: ꢁ성 μ•ˆμ—μ„œ λŒ€κ°μ„ μœΌλ‘œ μ΄λ™ν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
b4f7691
test: ꢁ성 λ‚΄μ—μ„œ μ΄λ™ν•˜μ§€ μ•Šμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 2, 2026
2a9a889
feat: ꢁ성 λ‚΄μ—μ„œ μ΄λ™ν•˜μ§€ μ•Šμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
152a826
test: 사가 ꢁ성 λ‚΄μ—μ„œ μ΄λ™ν•˜μ§€ μ•Šμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 2, 2026
aa8fa6d
feat: 사가 ꢁ성 λ‚΄μ—μ„œ μ΄λ™ν•˜μ§€ μ•Šμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ 처리
jyt6640 Apr 2, 2026
baf1b2b
test: 쑸의 κΈ°λ³Έ λŒ€κ°μ„  이동 μ˜ˆμ™Έ ν…ŒμŠ€νŠΈ 및 ꢁ성 λ‚΄μ˜ λŒ€κ°μ„  이동 ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 2, 2026
cee52ef
feat: 쑸의 κΈ°λ³Έ λŒ€κ°μ„  이동 μ˜ˆμ™Έ 및 ꢁ성 λ‚΄μ˜ λŒ€κ°μ„  이동 κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
7e53d4d
test: 포의 ꢁ성 λ‚΄μ˜ λŒ€κ°μ„  이동 κΈ°λŠ₯ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 2, 2026
27c7674
feat: 포의 ꢁ성 λ‚΄μ˜ λŒ€κ°μ„  이동 κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
3a65a83
fix: ꢁ성 λ‚΄μ—μ„œ λŒ€κ°μ„  μ΄λ™μ‹œ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ λŒ€κ°μ„  이동도 μ œν•œ λ˜λ„λ‘ 직접 λͺ…μ‹œ
jyt6640 Apr 2, 2026
c0a9f97
test: 각 ν…ŒμŠ€νŠΈμ˜ κΈ°λ¬Ό 객체λ₯Ό 잘λͺ» μƒμ„±ν•œ λ‚΄μš© μˆ˜μ •
jyt6640 Apr 2, 2026
c26f4ee
fix: ꢁ성 λ‚΄μ—μ„œ 2칸만 μ΄λ™λ˜λŠ” 버그 μˆ˜μ •
jyt6640 Apr 2, 2026
fd2cfc3
test: μž₯κ³Ό 쑸의 ꢁ성 λ‚΄μ—μ„œ μž‘λŠ” 것이 μ•„λ‹ˆμ—¬μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œ μˆ˜μ •
jyt6640 Apr 2, 2026
15e6fb6
style: κ°œν–‰ 일관화 및 μ—λŸ¬ 접두사 μΆ”κ°€
jyt6640 Apr 2, 2026
7b85362
feat: κΈ°λ¬Ό νƒ€μž…λ³„ 점수 μΆ”κ°€
jyt6640 Apr 2, 2026
ade537c
test: νŒ€λ³„ ν˜„μž¬ κΈ°λ¬Ό 점수 계산 ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 2, 2026
fe56b44
feat: νŒ€λ³„ ν˜„μž¬ κΈ°λ¬Ό 점수 계산 κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
ba9322f
feat: νŒ€λ³„ μ΅œμ’… κ²Œμž„ 점수 좜λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 2, 2026
3c14041
docs: λ¦¬λ“œλ―Έ μ΅œμ‹ ν™”
jyt6640 Apr 2, 2026
514531d
refactor: μž…/좜λ ₯ κ°œν–‰ μ‚¬μš©μž μΉœν™”μ μœΌλ‘œ λ³€κ²½
jyt6640 Apr 2, 2026
ae4682d
refactor: x,y 둜 넀이밍 일관화
jyt6640 Apr 2, 2026
8a55cc8
refactor: piece에 λ©”μ„Έμ§€λ₯Ό λ˜μ Έμ„œ νŒ€μ„ κ°€μ Έμ˜€λ„λ‘ λ³€κ²½
jyt6640 Apr 2, 2026
2539b16
test: ν”½μŠ€μ³ 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈλ₯Ό μš©μ΄ν•˜κ²Œ ν•˜λ„λ‘ μˆ˜μ •
jyt6640 Apr 2, 2026
ce01ab8
refactor: μ—λŸ¬ 클래슀 λ³€κ²½
jyt6640 Apr 2, 2026
7bfda5c
test: ν‘œμ€€ μ˜ˆμ™Έ 변경에 λ”°λ₯Έ ν…ŒμŠ€νŠΈ μ½”λ“œ μˆ˜μ •
jyt6640 Apr 4, 2026
e23fc4a
test: μ €μž₯된 κ²Œμž„μ΄ 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 4, 2026
ca81857
feat: μ €μž₯된 κ²Œμž„μ΄ 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 4, 2026
564d2ae
test: λ³΄λ“œ 일급 μ»¬λ ‰μ…˜ ν…ŒμŠ€νŠΈ μΆ”κ°€
jyt6640 Apr 4, 2026
8c4bfbe
feat: λ³΄λ“œ 일급 μ»¬λ ‰μ…˜ κΈ°λŠ₯ κ΅¬ν˜„
jyt6640 Apr 4, 2026
65897b1
test: ν…ŒμŠ€νŠΈ μˆ˜μ •μ— λ”°λ₯Έ Board ν…ŒμŠ€νŠΈ μˆ˜μ •
jyt6640 Apr 4, 2026
4f9debf
refactor: Boards κΈ°λŠ₯ κ΅¬ν˜„μ— λ”°λ₯Έ μ½”λ“œ μˆ˜μ •
jyt6640 Apr 4, 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
58 changes: 54 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
### μž₯κΈ° κ²Œμž„ (JanggiGame)
- [X] μž₯κΈ° κ²Œμž„ 흐름 관리
- [X] κ²Œμž„ ν„΄ 관리

- [X] 초기 μž₯기판 μ…‹μ—… (각 기물듀을 μ •ν•΄μ§„ 초기 Point에 배치)

### βœ‰οΈ 도메인 (Domain)
Expand Down Expand Up @@ -50,12 +49,63 @@

### πŸ“€ 좜λ ₯ (OutputView)
#### κ²Œμž„ μ§„ν–‰ μƒνƒœ 좜λ ₯
- [ ] κ²Œμž„ μ‹œμž‘ μ•ˆλ‚΄ λ©”μ‹œμ§€ 좜λ ₯
- [ ] λ§€ ν„΄λ§ˆλ‹€ ν˜„μž¬ λˆ„κ΅¬μ˜ 턴인지 좜λ ₯
- [X] κ²Œμž„ μ‹œμž‘ μ•ˆλ‚΄ λ©”μ‹œμ§€ 좜λ ₯
- [X] λ§€ ν„΄λ§ˆλ‹€ ν˜„μž¬ λˆ„κ΅¬μ˜ 턴인지 좜λ ₯
- [X] λ§€ ν„΄λ§ˆλ‹€ 이동 κ²°κ³Όκ°€ 반영된 ν˜„μž¬ μž₯기판의 μƒνƒœλ₯Ό μ‹œκ°μ μœΌλ‘œ 좜λ ₯

#### κ²Œμž„ μ’…λ£Œ 좜λ ₯
- [X] 승리 νŒ€ μ•ˆλ‚΄ 및 κ²Œμž„ μ’…λ£Œ λ©”μ‹œμ§€ 좜λ ₯

#### μ—λŸ¬ 좜λ ₯
- [ ] μ˜ˆμ™Έ 상황 λ°œμƒ μ‹œ μ—λŸ¬ 문ꡬ 좜λ ₯ (λ°˜λ“œμ‹œ [ERROR]둜 μ‹œμž‘)
- [X] μ˜ˆμ™Έ 상황 λ°œμƒ μ‹œ μ—λŸ¬ 문ꡬ 좜λ ₯ (λ°˜λ“œμ‹œ [ERROR]둜 μ‹œμž‘)

## μΆ”κ°€ κΈ°λŠ₯ λͺ©λ‘
### ꢁ성 κ·œμΉ™
- [X] μž₯κ³Ό μ‚¬λŠ” ꢁ성 μ•ˆμ—μ„œλ§Œ 이동할 수 μžˆλ‹€.
- [X] μž₯은 ꢁ성 λŒ€κ°μ„  이동 κ·œμΉ™μ„ λ”°λ₯Έλ‹€.
- [X] μ‚¬λŠ” ꢁ성 λŒ€κ°μ„  이동 κ·œμΉ™μ„ λ”°λ₯Έλ‹€.
- [X] μ°¨λŠ” ꢁ성 λŒ€κ°μ„  이동 κ·œμΉ™μ„ λ”°λ₯Έλ‹€.
- [X] ν¬λŠ” ꢁ성 λŒ€κ°μ„  이동 κ·œμΉ™μ„ λ”°λ₯Έλ‹€.
- [X] 쑸은 ꢁ성 μ•ˆμ—μ„œ λŒ€κ°μ„  이동 κ·œμΉ™μ„ λ”°λ₯Έλ‹€.

### κ²Œμž„ μ’…λ£Œ
- [X] μƒλŒ€ 왕이 작히면 κ²Œμž„μ„ μ’…λ£Œν•œλ‹€.
- [X] κ²Œμž„ μ’…λ£Œ μ‹œ 승자λ₯Ό λ°˜ν™˜ν•œλ‹€.

### 점수 계산
- [X] ν˜„μž¬ 남아 μžˆλŠ” 기물의 점수λ₯Ό κ³„μ‚°ν•œλ‹€.
- [X] νŒ€λ³„ 점수λ₯Ό 계산할 수 μžˆλ‹€.

### λ°μ΄ν„°λ² μ΄μŠ€ μ΄ˆκΈ°ν™”
- [X] H2 λ°μ΄ν„°λ² μ΄μŠ€μ— μ—°κ²°ν•œλ‹€.
- [X] μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ μ‹œ μŠ€ν‚€λ§ˆλ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.
- [X] games ν…Œμ΄λΈ”μ„ μƒμ„±ν•œλ‹€.
- [X] game_pieces ν…Œμ΄λΈ”μ„ μƒμ„±ν•œλ‹€.

### κ²Œμž„ μ €μž₯μ†Œ
- [X] κ²Œμž„ λͺ©λ‘μ„ μ‘°νšŒν•  수 μžˆλ‹€.
- [X] κ²Œμž„ id둜 κ²Œμž„μ„ μ‘°νšŒν•  수 μžˆλ‹€.
- [X] μƒˆ κ²Œμž„μ„ μ €μž₯ν•  수 μžˆλ‹€.
- [X] μ§„ν–‰ 쀑인 κ²Œμž„ μƒνƒœλ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€.
- [X] κ²Œμž„μ˜ ν˜„μž¬ ν„΄ 정보λ₯Ό μ €μž₯ν•œλ‹€.
- [X] κ²Œμž„μ˜ μ’…λ£Œ 여뢀와 승자λ₯Ό μ €μž₯ν•œλ‹€.
- [X] ν˜„μž¬ μ‚΄μ•„μžˆλŠ” 기물의 μœ„μΉ˜λ₯Ό μ €μž₯ν•œλ‹€.

### κ²Œμž„ 볡ꡬ
- [X] μ €μž₯된 κ²Œμž„ λͺ©λ‘μ„ 좜λ ₯ν•œλ‹€.
- [X] μ‚¬μš©μžκ°€ μ΄μ–΄μ„œ ν•  κ²Œμž„μ„ 선택할 수 μžˆλ‹€.
- [X] μ €μž₯된 κΈ°λ¬Ό μœ„μΉ˜λ‘œ μž₯κΈ°νŒμ„ λ³΅κ΅¬ν•œλ‹€.
- [X] μ €μž₯된 ν˜„μž¬ ν„΄μœΌλ‘œ κ²Œμž„μ„ λ³΅κ΅¬ν•œλ‹€.
- [X] μ €μž₯된 μ’…λ£Œ μƒνƒœλ‘œ κ²Œμž„μ„ λ³΅κ΅¬ν•œλ‹€.
- [X] μ €μž₯된 κ²Œμž„μ΄ μ—†μœΌλ©΄ μƒˆ κ²Œμž„μ„ μ‹œμž‘ν•œλ‹€.

### κ²Œμž„ μ§„ν–‰ 흐름
- [X] μƒˆ κ²Œμž„μ„ 생성할 수 μžˆλ‹€.
- [X] 수λ₯Ό λ‘˜ λ•Œλ§ˆλ‹€ κ²Œμž„ μƒνƒœλ₯Ό μ €μž₯ν•œλ‹€.
- [X] κ²Œμž„ μ’…λ£Œ μ‹œ μ΅œμ’… μƒνƒœλ₯Ό μ €μž₯ν•œλ‹€.

### μž…/좜λ ₯
- [X] κ²Œμž„ μ‹œμž‘ μ‹œ μƒˆ κ²Œμž„κ³Ό μ΄μ–΄ν•˜κΈ° 메뉴λ₯Ό 좜λ ₯ν•œλ‹€.
- [X] μ €μž₯된 κ²Œμž„ λͺ©λ‘μ„ μ‚¬μš©μžμ—κ²Œ 좜λ ₯ν•œλ‹€.
- [X] μ‚¬μš©μžκ°€ μ„ νƒν•œ κ²Œμž„μ„ λΆˆλŸ¬μ˜¨λ‹€.
- [X] ν˜„μž¬ ν„΄ 정보λ₯Ό 좜λ ₯ν•œλ‹€.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ repositories {
}

dependencies {
implementation 'com.h2database:h2:2.3.232'
testImplementation platform('org.junit:junit-bom:5.11.4')
testImplementation platform('org.assertj:assertj-bom:3.27.3')
testImplementation('org.junit.jupiter:junit-jupiter')
Expand Down
66 changes: 54 additions & 12 deletions src/main/java/janggi/JanggiApplication.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,70 @@
package janggi;

import janggi.domain.Board;
import janggi.domain.status.Team;
import janggi.repository.CsvInitialBoardProvider;
import janggi.repository.GameRepository;
import janggi.repository.InitialBoardProvider;
import janggi.service.JanggiGameService;
import janggi.dto.GameSummary;
import janggi.domain.JanggiGame;
import janggi.domain.Point;
import janggi.dto.GameStatusInfo;
import janggi.dto.PositionInfo;
import janggi.util.DatabaseInitializer;
import janggi.util.JdbcConnectionManager;
import janggi.repository.JdbcGameRepository;
import janggi.ui.InputView;
import janggi.ui.OutputView;
import janggi.util.FileParser;
import java.util.List;

public class JanggiApplication {

public static void main(String[] args) {
List<PositionInfo> positionInfos = FileParser.readCsvFile("/janggi.csv");
Board board = new Board();
board.init(positionInfos);
JanggiGame game = new JanggiGame(board);
OutputView.printGameStatus(GameStatusInfo.from(game.getBoardStatus()));
JdbcConnectionManager connectionManager = new JdbcConnectionManager(
"jdbc:h2:file:./storage/janggi;AUTO_SERVER=TRUE",
"sa",
""
);
DatabaseInitializer databaseInitializer = new DatabaseInitializer(connectionManager);
databaseInitializer.init();

GameRepository gameRepository = new JdbcGameRepository(connectionManager);
InitialBoardProvider initialBoardProvider = new CsvInitialBoardProvider();
JanggiGameService janggiGameService =
new JanggiGameService(gameRepository, initialBoardProvider);

Long gameId = selectGame(janggiGameService);
playGame(janggiGameService, gameId);
}

private static Long selectGame(JanggiGameService janggiGameService) {
String command = InputView.readGameCommand();
if (InputView.isNewGameCommand(command)) {
return janggiGameService.createGame();
}
if (InputView.isLoadGameCommand(command)) {
return loadGame(janggiGameService);
}
throw new IllegalArgumentException("[ERROR] 1 λ˜λŠ” 2λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”.");
}

private static Long loadGame(JanggiGameService janggiGameService) {
List<GameSummary> gameSummaries = janggiGameService.findAllGames();
OutputView.printSavedGames(gameSummaries);
return InputView.readGameId();
}
Comment on lines +50 to +54
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[NIT] μ €μž₯된 κ²Œμž„μ΄ μ—†λ‹€λ©΄, μ—¬κΈ°μ—μ„œ μ˜ˆμ™Έλ₯Ό λ˜μ§„λ‹€κ±°λ‚˜ ν˜Ήμ€ λ˜λŒμ•„κ°ˆ 수 μžˆλŠ” 선택지가 μžˆμ—ˆμ–΄λ„ μ’‹μ•˜μ„ 것 κ°™λ„€μš”.

(μ‚΄λ €μ£Όμ„Έμš”.. κ°‡ν˜”μ–΄μš” 😒 )
Image

Copy link
Copy Markdown
Author

@jyt6640 jyt6640 Apr 4, 2026

Choose a reason for hiding this comment

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

μ•—.. ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.. μΆ”κ°€ν•˜κ³  λ³΄λ‚΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€ !
(μ œκ°€ μ–Όλ₯Έ κ΅¬μΆœν•˜λ„λ‘ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€...γ…‹γ…‹γ…‹πŸ˜‚)


private static void playGame(JanggiGameService janggiGameService, Long gameId) {
JanggiGame janggiGame = janggiGameService.loadGame(gameId);
OutputView.printGameStatus(GameStatusInfo.from(janggiGame.getBoardStatus()));

while (!game.isFinished()) {
while (!janggiGame.isFinished()) {
OutputView.printCurrentTurn(janggiGame.currentTurn().getName());
List<Point> points = InputView.readPoints();
game.play(points.get(0), points.get(1));
OutputView.printGameStatus(GameStatusInfo.from(game.getBoardStatus()));
janggiGameService.play(gameId, points.get(0), points.get(1));
janggiGame = janggiGameService.loadGame(gameId);
OutputView.printGameStatus(GameStatusInfo.from(janggiGame.getBoardStatus()));
}
OutputView.printWinner(game.getWinner());
OutputView.printWinner(janggiGame.getWinner());
OutputView.printScore(janggiGame.scoreOf(Team.CHO), janggiGame.scoreOf(Team.HAN));
}
}
54 changes: 19 additions & 35 deletions src/main/java/janggi/domain/Board.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,79 +12,63 @@

public class Board {

private static final int BOARD_HEIGHT = 10;

private final Map<Point, Piece> state;
private final Map<Point, Piece> piecesByPoint;

public Board() {
this.state = new LinkedHashMap<>();
this.piecesByPoint = new LinkedHashMap<>();
}

public void init(List<PositionInfo> positionInfos) {
positionInfos.forEach(info -> state.put(info.point(), info.piece()));
positionInfos.forEach(info -> piecesByPoint.put(info.point(), info.piece()));
}

public void move(Point from, Point to, Team team) {
validateFromPoint(from, team);
validateToPoint(to, team);
Piece piece = state.get(from);
Piece piece = piecesByPoint.get(from);
List<Point> route = piece.getRoute(from, to);
Piece targetPiece = state.get(to);
Piece targetPiece = piecesByPoint.get(to);
if (targetPiece != null && !piece.canCapture(targetPiece)) {
throw new IllegalArgumentException("이 기물은 ν•΄λ‹Ή νƒ€κ²Ÿμ„ μž‘μ„ 수 μ—†μŠ΅λ‹ˆλ‹€.");
throw new IllegalStateException("[ERROR] 이 기물은 ν•΄λ‹Ή νƒ€κ²Ÿμ„ μž‘μ„ 수 μ—†μŠ΅λ‹ˆλ‹€.");
}
if (!piece.canMove(getPieces(route))) {
throw new IllegalArgumentException("ν•΄λ‹Ή 기물의 이동 κ²½λ‘œμ— μž₯애물이 μžˆκ±°λ‚˜ κ·œμΉ™μ— μ–΄κΈ‹λ‚©λ‹ˆλ‹€.");
}
state.remove(from);
state.put(to, piece);
}

public boolean isKingDie(Team team) {
return state.values().stream()
.noneMatch(piece -> piece.isSameType(PieceType.JANG) &&
piece.isSameTeam(team));
}

public List<List<Piece>> getPoints() {
List<List<Piece>> pieces = new ArrayList<>();
for (int i = 0; i < BOARD_HEIGHT; i++) {
pieces.add(
Point.getRow(i).stream()
.map(state::get)
.toList()
);
throw new IllegalStateException("[ERROR] ν•΄λ‹Ή 기물의 이동 κ²½λ‘œμ— μž₯애물이 μžˆκ±°λ‚˜ κ·œμΉ™μ— μ–΄κΈ‹λ‚©λ‹ˆλ‹€.");
}
return pieces;
piecesByPoint.remove(from);
piecesByPoint.put(to, piece);
}

public List<Piece> getPieces(List<Point> point) {
return point.stream()
.map(state::get)
.map(piecesByPoint::get)
.filter(Objects::nonNull)
.toList();
}

public Map<Point, Piece> getPiecesByPoint() {
return piecesByPoint;
}

private void validateFromPoint(Point from, Team team) {
if (isEmptyPoint(from)) {
throw new IllegalArgumentException("μΆœλ°œμ§€μ— 이동할 기물이 μ—†μŠ΅λ‹ˆλ‹€.");
throw new IllegalStateException("[ERROR] μΆœλ°œμ§€μ— 이동할 기물이 μ—†μŠ΅λ‹ˆλ‹€.");
}
if (!isSameTeam(from, team)) {
throw new IllegalArgumentException("μƒλŒ€λ°©μ˜ 기물은 움직일 수 μ—†μŠ΅λ‹ˆλ‹€.");
throw new IllegalStateException("[ERROR] μƒλŒ€λ°©μ˜ 기물은 움직일 수 μ—†μŠ΅λ‹ˆλ‹€.");
}
}

private void validateToPoint(Point to, Team team) {
if (!isEmptyPoint(to) && isSameTeam(to, team)) {
throw new IllegalArgumentException("도착지에 본인의 기물이 μžˆμŠ΅λ‹ˆλ‹€.");
throw new IllegalStateException("[ERROR] 도착지에 본인의 기물이 μžˆμŠ΅λ‹ˆλ‹€.");
}
}

private boolean isSameTeam(Point point, Team team) {
return state.get(point).isSameTeam(team);
return piecesByPoint.get(point).isSameTeam(team);
}

private boolean isEmptyPoint(Point point) {
return state.get(point) == null;
return piecesByPoint.get(point) == null;
}
}
52 changes: 52 additions & 0 deletions src/main/java/janggi/domain/Boards.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package janggi.domain;

import janggi.domain.piece.Piece;
import janggi.domain.piece.PieceType;
import janggi.domain.status.Team;
import janggi.dto.PositionInfo;
import java.util.ArrayList;
import java.util.List;

public class Boards {

private static final int BOARD_HEIGHT = 10;

private final Board board;

public Boards(Board board) {
this.board = board;
}

public void move(Point from, Point to, Team team) {
board.move(from, to, team);
}

public int scoreOf(Team team) {
return board.getPiecesByPoint().values().stream()
.filter(piece -> piece.isSameTeam(team))
.mapToInt(Piece::getScore)
.sum();
}

public boolean isKingDie(Team team) {
return board.getPiecesByPoint().values().stream()
.noneMatch(piece -> piece.isSameType(PieceType.JANG) &&
piece.isSameTeam(team));
}

public List<PositionInfo> getBoardStatus() {
return PositionInfo.from(board.getPiecesByPoint());
}

public List<List<Piece>> getPoints() {
List<List<Piece>> pieces = new ArrayList<>();
for (int i = 0; i < BOARD_HEIGHT; i++) {
pieces.add(
Point.getPointsAtY(i).stream()
.map(board.getPiecesByPoint()::get)
.toList()
);
}
return pieces;
}
}
28 changes: 23 additions & 5 deletions src/main/java/janggi/domain/JanggiGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,22 @@
import janggi.domain.status.ChoTurn;
import janggi.domain.status.GameStatus;
import janggi.domain.status.Team;
import janggi.dto.PositionInfo;
import java.util.List;

public class JanggiGame {

private final Board board;
private GameStatus gameStatus;
private final Boards boards;

public JanggiGame(Board board) {
this.board = board;
this.gameStatus = new ChoTurn();
this.boards = new Boards(board);
}

public JanggiGame(Board board, GameStatus gameStatus) {
this.boards = new Boards(board);
this.gameStatus = gameStatus;
}

public boolean isFinished() {
Expand All @@ -22,16 +28,28 @@ public boolean isFinished() {

public Team getWinner() {
if (!gameStatus.isFinished()) {
throw new RuntimeException("κ²Œμž„μ΄ 아직 λλ‚˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.");
throw new IllegalStateException("[ERROR] κ²Œμž„μ΄ 아직 λλ‚˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.");
}
return gameStatus.getTeam();
}

public List<List<Piece>> getBoardStatus() {
return board.getPoints();
return boards.getPoints();
}

public void play(Point from, Point to) {
this.gameStatus = gameStatus.move(from, to, board);
this.gameStatus = gameStatus.move(from, to, boards);
}

public Team currentTurn() {
return gameStatus.getTeam();
}

public List<PositionInfo> boardStatus() {
return boards.getBoardStatus();
}

public int scoreOf(Team team) {
return boards.scoreOf(team);
}
}
Loading