https://github.com/nbalance97/java-chess/tree/step1

 

GitHub - nbalance97/java-chess: 체스 게임 구현을 위한 저장소

체스 게임 구현을 위한 저장소. Contribute to nbalance97/java-chess development by creating an account on GitHub.

github.com

 


체스 미션


여지껏 진행한 미션 중에 페어와 이야기를 가장 많이 나눈 미션이 아닌가 싶다. 예를 들면 각각의 말을 board에서 관리해야 하는지, 말들이 가지고 있어야 하는지부터 시작해서 말들의 이동 규칙 검증은 어디서 해야 하는지 등등.

 

전체적으로 구현 자체가 오래 걸렸던 것 같아서 완성 후 직접 실행시켜 테스트 해보는데, 콘솔로 실제 말이 이동할 때 오오오 하면서 감탄했던 것 같다ㅋㅋㅋ😄

 

체스 게임을 구현하면서 가장 중점적으로 구현한건 체스 말의 이동 검증이다.

  1. 말이 해당 위치로 이동이 가능한지 여부 체크
  2. 퀸, 룩, 비숍의 경우 해당 위치로 이동하는데 가운데 가로막는 말이 있는지 확인
  3. 폰이 가장 처리가 복잡하다.. 졸개 주제에,,
    1. 폰은 처음에는 최대 2칸 이동할 수 있다. -> 폰이 2행/7행에 있는지 확인하여서 처리
    2. 폰은 대각선에 상대 말이 있는 경우에만 대각선으로 이동할 수 있다.
    3. 폰은 바로 앞에 상대 말이 있으면 앞으로 이동할 수 없다.

각각의 말 클래스를 만들어 두고, 각각의 말 클래스의 내부에 현재 위치와 목표 위치를 전달받으면 도달 가능한지 검증하는 메소드를 두었으며, 가로막는 말을 검증하기 위해서는 board와의 상호작용이 필요할 수 밖에 없어서, 가로막는 말 검증은 board에 두었다.

 

또한, 이전 미션에서는 사용하지 않았지만 이번 미션에서는 상태 패턴을 사용해 보았다.

턴 순서가 흰 팀, 검은 팀이 교차하면서 나타나고, 왕이 잡히는 순간 게임이 끝나기 때문에 전체적으로 상태를 3가지로 구성하였다.

  1. 흰 팀 상태
  2. 검은 팀 상태
  3. 왕이 사망한 상태

게임을 진행하다가 잡는 말이 왕인 경우 KingDeath 상태로 이동하도록

 

검은 팀 차례에선 하얀 팀 차례로 이동

 

whiteturn, blackturn에서 왕을 잡지 않는다면 각각 blackturn, whiteturn으로 이동하게 구성하였으며, 왕을 잡게 되는 순간 kingdeath 상태로 이동하여 게임이 종료된다.

 

상태 패턴을 실제로 미션에서 사용해본건 이번이 처음인데 도입해 보니 생각보다 훨씬 편했다. if문으로 검사를 많이 해줘야 하는 부분을 play() 메소드를 호출하게만 해서 편했고, 실제로 board에서는 상태가 finish인지 확인만 해주면 되었다.

 


피드백 및 리팩터링


가장 기억에 남는 건 Controller을 많이 고쳤다는 점이다😇 

여지껏 미션에서는 콘솔 단계에서 끝나서 Controller에서 View의 메서드를 마음껏 호출해서 값을 가져와서 사용해도 아무 문제가 없었다.

하지만 이번에 web ui가 적용된다고 하면 Controller에서 View의 메서드를 호출하면 안됐다.

Controller이 사용자의 요청에 대한 응답을 내뱉어주어야 하므로, 실행 로직 자체는 외부 Application으로 옮기고, Controller에서 출력을 위한 정보를 리턴해 주도록 변경하였다.

 

다음은 Application의 구성 방식이다.

명령어에 따라 각각의 메소드들을 호출
chesscontroller에서 가져온 결괏값을 출력시켜주도록 구현하였다.

이러한 구조로 코드를 작성하니까 controller에서 필요한 로직만 남게 되어 controller의 코드가 훨씬 짧아지기도 하고 이해하기도 쉬운 코드가 되었다. 

 


결론


전체적으로 구현 자체가 어렵게 느껴져서 힘든 미션이었다. 또한 Controller의 역할에 대해서 다시 한번 생각해보는 계기가 된 것 같다.

물론 콘솔로 끝냈다고 끝인건 아니지만, web 미션에서도 어떤 방식으로 구현을 하게 될 지 어느정도 생각하면서 리팩터링을 한거라 어느 정도는 괜찮지 않을까 생각한다😅 

+ Recent posts