2021-02-27-TIL

미션 5: 보드에 위치 부여 및 점수 계산

안녕하세요? 항상 친절한 리뷰 감사합니다. 이번 PR은 미션5에 관한 내용입니다. 미션1~4에 비해서 다소 어려운 난이도라고 느껴졌습니다. 그래서 한참을 고민하다가 중간중간에 자바지기님의 코드를 참조해가면서 단계별로 진행해보았습니다.

특히 가장 어려운 부분이 Rank의 리스트를 관리하고 인덱스로 접근하는 부분이었습니다. 그냥 이차원배열로 한번에 선언하였다면 row와 column을 조정해가면서 바로 접근하면 되겠지만, Rank를 별도로 선언하니깐 그게 쉽지 않았습니다. Rank에는 별도의 인덱스를 인자로 넘겨주는 방식으로 해결한다는 점을 참고했습니다.

구현 내용

  • Board

    • countPieces() : Board 전체에서 Color와 Type을 인자로 받아서 해당 플레이어의 해당 타입인 Piece가 몇 개 남았는지 총 개수를 리턴합니다.
    • initializeEmpty() : Board 전체를 빈칸으로 채웁니다.
    • initialize() : Boad에 체스게임 시작 시점으로 모든 Piece를 배치합니다.

    • findPiece() : 문자열 좌표값이 주어졌을 때 해당 Piece의 인스턴스를 얻어올 수 있습니다.
    • move(): Piece와 Position(에 대한 문자열)을 인자로 받아서 Position에 해당하는 Y좌표(row)에 해당하는 Rank를 찾고, 그 Rank에서 또 다시 Rank::move를 호출하여 X좌표(column)에 대한 이동을 set합니다.
    • calculatePoint(): findPiecesByColor()를 통해서 해당 색깔 플레이어의 Piece의 리스트를 얻어오고, 각 Piece에 해당하는(enum에 정의된) 점수를 모두 더해서 리턴합니다.
    • findPiecesByColor(): 모든 Rank를 돌면서 Rank::findPiecesByColor()을 호출하면서 해당 색깔의 Piece를 모두 리스트에 담아서 리턴합니다.
    • toString(): 이전과 동일합니다.
  • Game
    • 우선은 showScore()showScoreByPiece()를 게임이 시작하면 한번 호출하도록 작성하였는데, 추후 미션에서 게임을 시작한 이후의 로직을 별도로 분리할 계획입니다.
  • Rank
    • move(): 해당 Rank(row)내부에서 X좌표(column)에 대한 이동을 set하도록 값을 수정합니다.
    • countPieces(): 해당 Rank에서 Color와 Type을 인자로 받아서 해당 색깔 플레이어의 해당 타입의 Piece가 몇 개 남았는지를 리턴합니다.
    • initializeWhitePieces() : 팩토리 메서드로 해당 Rank의 각 위치에 흰색 플레이어의 Piece를 배치합니다.
    • initializeBlackPieces() : 팩토리 메서드로 해당 Rank의 각 위치에 검정색 플레이어의 Piece를 배치합니다.
    • initializeWhitePawns() : 팩토리 메서드로 Pawn을 해당 Rank에 8개 모두 배치합니다.
    • initializeBlackPawns() : 팩토리 메서드로 Pawn을 해당 Rank에 8개 모두 배치합니다.
    • initializeBlankLine() : 해당 Rank를 모두 공백으로 채웁니다.
    • findPiece() : X좌표를 인자로 받아서 리스트의 해당 인덱스에 위치한 Piece를 리턴합니다.
    • findPiecesByColor() : Color를 인자로 받아서 해당 Rank 내부에서 해당 색깔 플레이어의 모든 Piece를 담아서 리턴합니다. 이때 이 리스트가 외부에서 변경되는 것을 막아주기 위해서 Collections.unmodifialbeList로 제한하였습니다.
    • toString() : 기존과 동일합니다.
  • Color - 색깔의 종류를 갖는 enum 입니다.

  • Type - 타입의 종류를 갖는 enum입니다. 각 타입은 표기문자와 기본점수를 갖고 있으며, getDefaultPoint()를 통해서 해당 타입에 대한 점수를 얻어올 수 있습니다.

  • Position
    • 생성자는 문자열로 입력 받았을 때와 정수값으로 입력 받았을 때 모두 생성 가능하도록 오버라이딩 하였습니다.
    • 멤버필드의 x,y에는 1~8이 저장되도록 하였으므로, 실제 배열의 인덱스를 가져올 수 있도록 하는 메서드인 getXIndex()getYIndex()를 추가하였습니다.
    • Position객체가 Piece를 생성할 때 마다 생성자를 호출하면서 지정되므로, 같은 위치일 때 같은 객체라고 판단하도록 equals와 hashCode를 오버라이딩 하였습니다.
    • getPrevNextRows() : 해당 Position의 같은 X좌표에서 인접한 앞,뒤의 행(Y좌표, row, rank)의 Position을 리스트로 리턴합니다. (인접한 Pawn이 있을 경우, 0.5점을 감소시킨다는 조건 때문에 필요한 메서드입니다.)
  • PieceCreator
    • 각 Piece를 생성하는 팩토리 메서드를 모두 별도로 분리한 클래스 입니다.
  • Piece
    • getRepresentation() : 색깔에 따라 적절한 타입의 표기법을 리턴합니다.
    • verifyPiece() : 색깔과 타입을 검증합니다.
    • matchColor() : 색깔이 일치하는지 확인합니다.
    • matchType() : 타입이 일치하는지 확인합니다.
    • addPiecesByColor() : 색깔이 일치할때만 인자로 받은 리스트에 Piece객체 자신을 추가합니다.
    • getPoint() : Pawn이 아니면 해당 Piece에 대한 점수를 Type의 enum에 정의된 getDefaultPoint()로 부터 얻어와서 리턴합니다. Pawn이 세로로 인접해 있을 때 각 Pawn의 점수가 0.5점이 된다.라는 조건이 정말 어려웠는데, 이런식으로 구현할 수 있구나.. 하면서 자바지기님의 코드를 참고했습니다.
    • Piece 또한 VO로서 같은 타입과 같은 색깔일 때 서로 같은 Piece임을 보장하기 위해서 equals와 hashCode를 오버라이딩 해주었습니다.
    • compareTo() :각 Piece를 점수별로 정렬하도록 구현하라는 요구사항이 있어서 Comparable을 구현하도록 하여 compareTo()를 점수에 대한 비교구문으로 정의하였습니다.
  • PrintUtils
    • showScore() : Board::calculatePoint()를 사용하여 각 색깔의 플레이어 별로 점수를 출력합니다.
    • showScoreByPiece() : Board::findPiecesByColor()를 사용하여 점수에 대한 내림차순으로 각 색깔의 플레이어가 가지고 있는 Piece의 종류와 점수를 출력합니다.

https://sourcegraph.com/github.com/Polynomeer/java-chess@feature/position


안녕하세요? 백기선님의 라이브 스터디를 뒤늦게나마 따라가기위해 스터디 그룹을 만들었습니다. 다들 의견을 수렴하여 스터디 방향을 잡고 시작하려고 합니다.

스터디 개요

  1. 목표 : 백기선님의 라이브 스터디(18주 과정) 완료

  2. 시간 : 매주 토요일 10:00 ~ 12:00 (약 2시간)

    • 한 시간 단위로 각 주차 별 내용으로 스터디 진행
    • 각 주차별 학습내용을 발표하고, 서로 공유하면서 비교
    • 개인적으로 특정 주제를 깊이 파고들어도 상관없음
  3. 스터디 플랫폼
    • GitHub : 기존의 백기선 스터디와 동일하게 각 주차 별 Issue 를 만들고 진행합니다.

    • HackMD : 매주 토요일에 각자 학습한 내용을 실시간으로 이곳에 적으면서 토론하는 시간을 가집니다.
    • Google Meet : Zoom 대체용의 화상회의 플랫폼입니다.
    • Slack : 공지사항이나 간단한 대화 위주로 사용합니다. (주의 : 다 날아가 버릴 수 있으므로 중요한 것은 GitHub에 기록)
  4. 스터디 유의사항

    • 2주차의 진도를 한 주 만에 끝내는 것이 목표이므로 다소 빠를 수 있습니다. 하지만 ‘꼼꼼히 다 한다'보다는 ‘한번이라도 모든 범위를 다루는 것'이 목표입니다.
    • 보증금이나 벌금 같은 것은 별도로 시행하지 않으나, 이슈에 대한 코멘트, 과제 수행은 무조건 빠짐없이 참여한다는 것을 전제로 합니다.
  5. 참여인원

  6. 참고링크

스터디 진행

  1. 공유 하는 방법

    • https://github.com/study-whiteship/study-whiteship

    • 위 링크의 organization에서 모든 스터디 내용을 기록한다.
    • master(브랜치 생성x)에 Week별로 디렉터리를 생성하고 각자 자신닉네임.md 파일로 push
  2. 스터디 방식

    • Week 1, 2 주차에 대한 Issue_를 생성한 뒤, 잘 모르겠거나 공유하면 좋은 내용을 _Issue Comment 를 통해 공유
    • Issue 는 해당 Week Study 가 종료되면 Close 한다.
    • Slack 보다는 Issue 에 관한 Comment 로 토의하도록 한다 (→ 이력관리, 포트폴리오 및 학습기록에 이 방법이 좋다!)
    • Git Organization Wiki 에 매주 토요일에 HackMD 이용해서 스터디한 내용을 저장
  3. 스터디 진도

    • 일주일에 Week 2주차에 관한 내용을 정리한다. (단기간에 모든 범위를 한번씩은 다루기 위함)
  4. 스터디 규칙

    • Commit 컨벤션 - "[Week번호] 백기선 스터디 Issue 주차 별 제목"으로 커밋 메시지 작성. → ex) [Week1] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.
    • Issue 네임 컨벤션 (위와 동일) - "[Week번호] 백기선 스터디 Issue 주차 별 제목" → ex) [Week1] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

Q) 커밋을 처음에 컨벤셔에 맞추어 보내고, 추가적으로 수정사항이 생기면? 커밋 메시지를 어떻게 보내야하나?


ToDo

  • 백기선 스터디 1, 2주차
  • Naver 쇼핑 인턴 ~2.28
  • 라인 핀테크(~3/1) : https://careers.linecorp.com/jobs/275
  • 엔테크서비스 인턴십(~3/7) : https://recruit.nts-corp.com/nts/job/detail/developer?-