Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1단계 - 장기] 차니(이동찬) 미션 제출합니다. #71

Merged
merged 46 commits into from
Mar 25, 2025
Merged
Changes from 1 commit
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
03c73ec
docs: 기능 목록 정리
ppparkta Mar 18, 2025
4726844
feat: 좌표 관련 모델 구현
DongchannN Mar 18, 2025
0bb6140
refactor: 매직넘버 제거
ppparkta Mar 18, 2025
b35e6b2
feat: 수직,수평인지 판단한다
ppparkta Mar 18, 2025
7c3cc88
feat: 차의 이동을 구현한다
ppparkta Mar 18, 2025
248a6bc
test: 수직, 수평 테스트
ppparkta Mar 18, 2025
d0fd565
feat: 궁, 사 기물을 구현한다
ppparkta Mar 18, 2025
da4566c
style: 개행 규칙
ppparkta Mar 18, 2025
a1f8ee3
feat: 장기말 세팅
ppparkta Mar 19, 2025
fb95774
docs: 기능 구현 목록 업데이트
ppparkta Mar 19, 2025
9443472
feat: "차" 기물이 가질 수 있는 모든 경로 탐색 로직 구현
ppparkta Mar 19, 2025
7d0593d
feat: "졸"의 이동 가능한 모든 경로 구현
ppparkta Mar 19, 2025
1e03a13
feat: "마"의 이동 가능한 모든 경로 구현
ppparkta Mar 19, 2025
4f75b0b
feat: "상"의 이동 가능한 모든 경로 구현
ppparkta Mar 19, 2025
cbe9296
feat: "포"의 이동 가능한 모든 경로 구현
ppparkta Mar 19, 2025
5e96303
feat: try-catch 추가
ppparkta Mar 19, 2025
0dcc7c8
feat: 엔드포인트에 턴과 동일한 팀의 기물이 있으면 경로 제거
ppparkta Mar 19, 2025
9855aaa
refactor: 장기판 초기화 로직 간소화
ppparkta Mar 19, 2025
7a14f39
feat: 포 이동 가능한 구간 확인
ppparkta Mar 20, 2025
6aba16d
refactor: Janggi 클래스 메서드 분리
ppparkta Mar 20, 2025
52dc337
refactor: 기물 종류 열거형 분리
ppparkta Mar 20, 2025
d710e96
refactor: 패키지 분리
ppparkta Mar 20, 2025
0d38e84
refactor: "상"과 "마" 이동 로직 간소화
ppparkta Mar 20, 2025
caa798b
refactor: 디랙토리 정리
ppparkta Mar 20, 2025
45f304f
feat: view 구현
ppparkta Mar 20, 2025
496e4ba
feat: 장기 게임의 한 개 Turn 구현
ppparkta Mar 20, 2025
91f2625
feat: 사용자 콘솔 인터페이스 구현
ppparkta Mar 20, 2025
5c7b98b
docs(README.md) : 기능 요구사항 정리 및 피드백 반영 예정사항 작성
DongchannN Mar 23, 2025
ab79815
refactor: 장기 기획서를 준수하는 네이밍으로 변경
DongchannN Mar 23, 2025
3c8af9b
refactor: 컨벤션 반영 및 불필요한 메서드 제거
DongchannN Mar 23, 2025
211d248
refactor: View 출력 계산 시 if문에 도달하지 않는 경우에 대해 예외처리
DongchannN Mar 23, 2025
f259b0d
refactor: 기존 Janggi의 턴 수정 방식을 Janggi와 Team 사이의 메시지 전달로 수정
DongchannN Mar 23, 2025
5a6af00
refactor: Unit이 Position을 관리했던 책임을 Janggi로 이관
DongchannN Mar 23, 2025
e82967f
refactor: 구체적인 예외 메시지 작성
DongchannN Mar 23, 2025
5790ae7
refactor: 디렉토리 분리
DongchannN Mar 23, 2025
f228648
refactor: Janggi 클래스 메서드명 변경 및 메서드간 책임 준수
DongchannN Mar 23, 2025
e263dc6
fix: 경로의 도착지 계산 방식 수정
DongchannN Mar 23, 2025
97231e7
refactor: Position 객체 생성 시 정적 팩토리 메서드 사용
DongchannN Mar 24, 2025
5eba43f
refactor: 컨벤션 통일
DongchannN Mar 24, 2025
98dbb2a
feat: 장기판 내에서 장기말을 이동하는 로직 구현
DongchannN Mar 24, 2025
f4ac3e9
refactor: 장기 출력 방식 사용자 친화적으로 수정
DongchannN Mar 24, 2025
a9385af
refactor: 불필요한 if문 indent 제거
DongchannN Mar 24, 2025
efbc7d8
refactor(README.md): 완료한 기능 요구사항 정리
DongchannN Mar 24, 2025
1752f6f
fix: stackOverflow 예외 해결
DongchannN Mar 25, 2025
b7ceb0f
refactor: 불필요한 개행 제거
DongchannN Mar 25, 2025
2468b88
refactor: 외부에서 사용하지 않는 메서드 private 으로 변경
DongchannN Mar 25, 2025
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
Prev Previous commit
Next Next commit
refactor: Janggi 클래스 메서드 분리
ppparkta committed Mar 20, 2025
commit 6aba16dbd69994ca1e36e0b67a84a2f037aeb8dc
39 changes: 18 additions & 21 deletions src/main/java/domain/Janggi.java
Original file line number Diff line number Diff line change
@@ -14,7 +14,6 @@ public class Janggi {

public Janggi() {
turn = Team.CHO;
// han
List<Unit> hanUnits = settingUnits(Team.HAN);
List<Unit> choUnits = settingUnits(Team.CHO);
this.units.addAll(Stream.concat(hanUnits.stream(), choUnits.stream()).toList());
@@ -28,45 +27,46 @@ private List<Unit> settingUnits(Team team) {
return units;
}

// 가능한 모든 경로 반환
public List<Route> searchAvailableRoutes(Point pick) {
Unit pickedUnit = findUnitByPoint(pick)
.orElseThrow(() -> new IllegalArgumentException(""));
// 기물 상관없는 모든 경로
List<Route> totalRoutes = pickedUnit.calculateRoutes();
return applyUnitProperty(pickedUnit, pick, totalRoutes);
}

private List<Route> applyUnitProperty(Unit pickedUnit, Point pick, List<Route> totalRoutes) {
String type = pickedUnit.getType();
if (type.equals("포")) {
// 경로 중에 포가 있는지 확인 & 다른 기물이 1개인지 확인
totalRoutes = totalRoutes.stream().filter(this::canBombJump).toList();
return totalRoutes.stream().filter(this::isAvailableEndPoint).toList();
}
//
totalRoutes = findAvailableRoute(totalRoutes);
if (type.equals("졸")) {
if (pickedUnit.getTeam() == Team.HAN) {
return totalRoutes.stream()
.filter(route -> route.getPoints().getFirst().getY() >= pick.getY())
.toList();
}
return searchJolRoutes(pick, pickedUnit, totalRoutes);
}
return findAvailableRoute(totalRoutes);
}

private static List<Route> searchJolRoutes(Point pick, Unit pickedUnit, List<Route> totalRoutes) {
if (pickedUnit.getTeam() == Team.HAN) {
return totalRoutes.stream()
.filter(route -> route.getPoints().getFirst().getY() <= pick.getY())
.filter(route -> route.getPoints().getFirst().getY() >= pick.getY())
.toList();
}
return totalRoutes;
return totalRoutes.stream()
.filter(route -> route.getPoints().getFirst().getY() <= pick.getY())
.toList();
}

private boolean canBombJump(Route route) {
int count = 0;
for (Point point : route.getPointsExceptEndPoint()) {
Optional<Unit> unit = findUnitByPoint(point);
if (unit.isEmpty()) {
continue;
}
if (unit.get().getType().equals("포")) {
if (unit.isPresent() && unit.get().getType().equals("포")) {
return false;
}
count++;
if (unit.isPresent()) {
count++;
}
}
return (count == 1);
Copy link

Choose a reason for hiding this comment

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

1이 어떤 의미를 가지는건지 이해하기가 조금 어려운 것 같네요. 🤔
상수로 뽑고 네이밍을 통해서 의도를 드러내보면 어떨까요?

}
@@ -77,21 +77,18 @@ private Optional<Unit> findUnitByPoint(Point pick) {
.findFirst();
}

// 유효한 경로를 반환
private List<Route> findAvailableRoute(List<Route> routes) {
return routes.stream()
.filter(this::isAvailableRoute)
.filter(this::isAvailableEndPoint)
.toList();
}

// 경로에 기물이 없어야 함
public boolean isAvailableRoute(Route route) {
return route.getPointsExceptEndPoint().stream()
.allMatch(this::isEmptyPoint);
}

// 엔드포인트에 기물이 없거나, 기물이 있다면 상대편 기물이어야 함
public boolean isAvailableEndPoint(Route route) {
Point endPoint = route.searchEndPoint();
Optional<Unit> endPointUnit = findUnitByPoint(endPoint);