[우아한테크코스 백엔드 4기] 레벨1 - "체스" STEP 1 회고
🔗 관련 링크
⚙️ 구현 기능 목록
입력
-
체스 게임 시작을 위해 입력해야 할 명령어의 문구를 출력한다.
-
체스 게임 시작을 위해서 명령을 입력받는다.
- 게임 명령은 start, move, end로 구성된다.
- [예외처리] 구성외의 입력은 받을 수 없다.
-
move {원래 칸} {이동할 칸}
의 형태로 입력받는다.- [예외처리] move 뒤 값이
{원래 칸} {이동할 칸}
형태여야 한다.
- [예외처리] move 뒤 값이
- 게임이 끝났을 경우
- status를 입력받울 수 있다.
- [예외처리] start, move, end를 입력받을 수 없다.
명령 수행
- 체스 게임을 시작한다
- 체스 게임에서 말의 이동을 수행한다.
- 위치가 변경될 때 마다 체스판을 출력한다
- 체스 게임을 끝낸다.
체스 판 초기 세팅
- 체스 판은 게임 시작시 초기화 된다.
- 체스 판은 가로 8, 세로 8의 길이로 구성한다.
- 체스 말을 배치한다
- 위 : 대문자 줄 RNBQKBNR , 둘째줄은 P로 이뤄진다
- 중간: 나머지 부분은
.
으로 배치한다. - 아래 : 소문자 첫줄 p, 둘째줄은 rnbqkbnr
말 이동
- 첫번째 전달 인자는 현재 위치, 두번째는 이동할 위치로 구성된다.
- 현재 위치에서 이동할 위치로 갈 수 있는지 검증한다.
- [예외처리] 현재 위치의 말은 해당 턴에 이동가능한 색의 말이어야 한다.
- [예외처리] 이동할 위치가 체스판을 벗어날 수 없다.
- [예외처리] 이동할 위치에 같은 색깔의 말이 있어선 안된다.
- [예외처리] 이동할 위치가 말이 이동 가능한 규칙에 해당해야 한다.
- 이동할 위치로 말을 이동한다.
- 이동할 위치에 말이 존재할 경우 다른 색깔의 말을 제거한다.
- 이동한 위치에 말이 존재하지 않을 경우 현재 위치를 비우고 이동할 위치로 말을 변경한다.
게임 종료
- King이 잡혔을 때, 게임을 종료한다.
점수 계산
- 각 말들이 점수를 가질 수 있다.
- 퀸 : 9점
- 룩 : 5점
- 비숍 : 3점
- 나이트 : 2.5점
- 폰 : 1점
- 킹 : 0점
- 킹이 잡히면 점수를 계산한다
- 같은 세로줄에 같은 색의 폰이 있는 경우, 폰은 0.5점이다.
출력
- 체스판을 출력한다
- 각 진영의 점수와 어느 진영이 이겼는지를 출력한다.
⛳ 피드백
@사이드 피드백
1.PR 가이드
- 이미 끝났다고 생각한 PR 대화도
Unresolve
로 처리하자 - 미션과 무관한 파일들은 .gitgnore에 추가하자
- 파일 끝에 개행을 추가하자
2.네이밍
- getter는 주로 인스턴스 변수를 불러올 때 사용
- 되도록 줄임말은 쓰지 않기
3.Controller
패키지
- 꼭
~~controller
클래스만 있을 필요 없음 - 흐름을 제어하는 역할인
Command
객체는Controller
패키지 안인 편이 어울림
@불변 구조로 설계하자
while (!movedPosition.equals(to)) {
positions.add(movedPosition);
movedPosition = movedPosition.advancePosition(direction);
- 위의 구조는 값(movedPosition)을 재할당하게 됨. 불변 X
- 값이 불변이 아닌 경우에, 참조로 인해서 찾기 어려운 버그를 만들어낼 수 있다. for문
을 통해 목적지까지 이동한 새로운 포지션을 매번 생성하고, 그 값을 리스트에 담자
@전략패턴에 테스트 코드용 전략을 만들어도 될까?
- 고민되지만, 경우에 따라 하나의 방법
- BUT 실제 환경과 동일한 방식의 테스트가 이뤄지지 않는다
- 가능하다면
Fixtures
안에 해당 로직을 넣자! - (통합테스트/인수테스트는 이후 스프링과 함께 알아갈 예정)
@도메인과 OutputView
사이 의존을 끊자
- 인자 값으로
getter
나DTO
를 사용하자
-View
에getter
로 값을 넘기는 것은 괜찮다!- 정 불안하면
getter
를 더 안전하게 만들자!(VO
,copyOf()
...)
- 정 불안하면
🖋 소감
미친듯이 바빴고 즐거웠다
이번 미션은 전 기수부터 악명이 자자했다.
실제로 구현사항을 하나씩 읽는데 눈앞이 캄캄했다.
체스 룰을 잘 몰랐기 때문에 각 기물(말)들의 이동패턴 부터, 승리 조건까지 공부해야 했다.
온라인 vs 오프라인
이번 페어프로그래밍 때 유독 협업용 인텔리제이 플러그인 Code With Me
가 말썽이었다.
핑도 높고 자꾸 인텔리제이가 꺼졌다. 대안으로 TeamViewer
를 사용했지만 단축키가 씹히는 문제가 있었다.
결국 페어 루키가 내쪽 지역으로 와 같이 코딩했다.
사실 페어 프로그래밍을 이전까진 거의 온라인으로 진행했다.
코로나 이슈도 있었고, 굳이 움직이기 귀찮았기 때문이었다.
막상 만나서 페어프로그래밍을 하니, 온라인으로 진행할 때와 비교해 생각치 못한 장점들이 있었다.
- 의사소통 비용이 줄었다.
온라인으로 대화할 때는 서로의 말에 반응하는 속도가 느리다.
이게 신경쓰이고 스트레스로 다가온다. 서로 말이 겹쳐 어색해질 때 특히😅
오프라인으로 만나니 목소리도 더 잘 들리고 비언어적인 부분까지 포괄해 의사소통이 가능했다.
- 펜과 종이를 쓸 수 있다.
물론 온라인에서도 아이패드를 연동하거나 기타 협업툴을 쓰면 되지만
직접 그려가며 설명하기엔 오프라인이 좋았다.
- 진행이 루즈해지지 않는다
이거 하겠다고 밖에 나왔으니 최대한 빨리 끝내고 싶은 마음이 생긴다.
자연스럽게 집중력이 높아지고 서로의 설명들을 잘 이해하게 된다.
- 밖에 나가게 된다
요새 혼밥이 유행이지만 아직 2인분부터 주문 가능한 곳도 많고,
집에 있으면 굳이 나가서 사먹지 않게된다.
바깥바람도 쐬고 맛있는 것도 먹을 수 있다.
그래서 내 생각엔 오프라인 페어프로그래밍이 더 좋다.
앞으로는 오프라인으로 페어 프로그래밍을 해야 하는데 기대된다👍
miro 사용기
예전 조별 과제 때 사용했던 디자인씽킹 툴이다.
미리 구조설계를 빠르게 고민할 수 있다.
이때의 설계 다수가 끝까지 갔던 것 같다.
이번 체스미션 구조가 많이 복잡해서 코드 작성 전에 설계고민을 해보는 것이 큰 도움이 되었다.
앞으로도 많이 쓸 생각이다!
Author And Source
이 문제에 관하여([우아한테크코스 백엔드 4기] 레벨1 - "체스" STEP 1 회고), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@betterfuture4/우아한테크코스-백엔드-4기-레벨1-체스-STEP-1-회고저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)