12.16 TIL

천영석·2020년 12월 16일
post-thumbnail

블랙잭 게임

우아한테크코스 마지막 코딩 테스트를 대비하기 위해서 전 기수의 3차 프리코스였던 블랙잭 게임을 우연히 발견해 시도하게 되었다.

게임을 만들면서 내가 목표로 하는 것은 README를 잘 작성하는 것과 commit을 자세하게 하기, 마지막으로 한 함수에 한 가지 기능만을 하도록 만드는 것이다.
게임 자체는 그렇게 어려워 보이지 않았고, 기능 구현 목록을 정리하고 시작하는 데까지 30~40분 정도 걸렸다.

기능 구현 목록

  • 카드를 등록한다.
  • 게임에 참여할 사람의 이름을 쉼표로 구분받는다.
    • 예외처리)
      • 이름이기 때문에 영어와 한글만 가능
      • 중복 불가
      • 10자 이하만 가능
    • 게임에 참여할 사람을 등록한다.
  • 게임에 참가한 개인 별로 베팅 금액을 입력받아 저장한다.
    • 예외처리)
      • 숫자만 가능
  • 딜러와 참여한 사람들에게 2장의 카드를 랜덤으로 나누어준다.
  • 나누어준 카드를 화면에 출력한다.
  • 참가자에게 카드를 더 받을 것인지 응답을 받는다.
    • 예외처리)
      • y나 n을 입력하지 않은 경우
      • 모든 카드를 합쳐 21인 경우에 y를 했을 때 경고창
  • 모든 참가자가 카드 선택을 멈추면 딜러의 카드를 보고 16이하면 한 장 더 받고, 16이 넘는다면 결과를 확인한다.
  • 결과
    • 딜러가 21을 초과한 경우
      • 참가자들은 베팅한 금액을 돌려받는다.
    • 딜러가 가장 가까운 경우
      • 참가자들은 베팅 금액을 모두 잃는다.
    • 딜러와 참가자의 합계가 같은 경우
      • 참가자들은 베팅한 금액을 돌려받는다.
    • 21을 초과한 경우
      • 베팅 금액을 모두 잃는다.
    • 참가자가 블랙잭이나 21에 가장 가까운 경우
      • 베팅 금액의 1.5배를 받는다.

이렇게 기능 구현 목록을 작성했고, 꽤 복잡한 것 같지만 잘 들여다보면 이름을 받고, 베팅 금액을 받고, 카드를 더 받을 것인지 확인하고, 결과를 확인하는 단순한 절차이다.

처음에 이 문제를 보고 이번에 했던 지하철 노선도보다는 훨씬 쉽다는 느낌을 받았다. 그러고 실제로도 순조롭게 문제를 해결해 나가고 있었는데, 정말 예상치도 못한 곳에서 막혔고, 시간을 다 날리게 되었다.

어려웠던 부분

나에게 어려웠던 부분은

게임에 참가한 개인 별로 베팅 금액을 입력받아 저장한다.

이 부분였다.

만약 A, B, C라는 게임 플레이어가 있다고 가정하면 맨 처음에는 A라는 플레이어에게 베팅 금액을 입력 받고, 그 뒤에 B의 값을 입력 받고 마지막으로 C의 값을 입력 받으면 된다.

하지만 내 생각은 반복문으로 ["A", "B", "C"]의 배열을 돌면서 화면에 추가해 주고 싶은데 그럴 수 없었다. 반복문으로 화면에 추가를 하면 3개의 화면이 모두 추가되기 때문이었고, 단순히 생각해보면 A의 값을 입력 받았을 때 B에 대한 화면을 만드는 순서로 하면 될 것 같았다. 생각은 있었지만 어떻게 구현해야 할지 방법을 몰랐고, 2시간 정도 고민을 하다가 결국 한 번에 화면에 출력한 것으로 만족했었다.
저번 기수는 백엔드라서 자바로만 가능한 것이라고 믿으면서...

해결

해결 방법은 갑작스럽게 떠올랐다.

나누어준 카드를 화면에 출력한다.

이 부분에 대한 코딩을 하다가 나누어준 카드도 결국 베팅 금액을 모두 입력받고 나서 카드를 나누어주고, 그 뒤에 화면에 출력이 되는 것인데, 이미 내 코드는

게임에 참여할 사람의 이름을 쉼표로 구분받는다.

이 부분을 처리하고 나서 바로 화면을 출력하기 때문에 문제가 있었다.

그래서 새로 고쳐보겠다는 마음을 가지고 클로저를 사용해보기로 했고, 클로저로 ["A", "B", "C"]배열을 활용하면 될 것 같다는 생각을 했다.

즉, 한 번 함수가 실행될 때마다 배열의 첫 번째 요소를 shift 메소드로 삭제하고, 삭제된 요소를 화면 출력의 인수로 넘기면 될 것 같았다.
클로저이기 때문에 shift로 삭제하면 다음에 호출할 때는 ["B", "C"]만 들어있을 것 같았기 때문이다.

생각을 끝낸 후에 클로저로 구현을 하려고 하다가 어쩌피 변수 하나를 만들어야 하는데 굳이 클로저로 할 필요가 있을까? 라는 생각에 게임 플레이어를 생성할 때 변수에도 같이 push해서 player라는 배열을 하나 만들었고, 그 배열을 가지고 위에서 생각한 대로 구현을 했다.

기능이 정상적으로 작동하는 것을 보고 정말 기뻤다. 방에서 소리를 지를 뻔 했는데, 이런게 코딩의 매력이고 재미있는 점이라고 생각한다. 이렇게 하나하나씩 해결해가는 재미때문에 코딩을 시작하게 되었는데 잘 선택한 것 같다.

성능 상 좋은 코드인지, 이렇게 코드를 짜도 되는 것인지에 대해서는 정확하게 모르겠다. 더 공부를 해야 알 수 있을 것 같고, 우선은 해결하지 못할 것 같던 문제를 해결했고, 오늘도 조금이나마 발전했다는 것에 의미를 두고 싶다.

profile
느려도 꾸준히 발전하려고 노력하는 사람입니다.

0개의 댓글