블랙잭 만들어보기 3

한포도·2024년 3월 8일
0

Python

목록 보기
3/4

오늘은 블랙잭 코드의 리펙토링을 해보도록 하겠다!
꽤 지난 코드였어서 블로그를 작성하면서 다시한번 보는 코드인데, 꽤나 고칠점이 많이 보였다....
오늘본 코드 내일본 코드 다르다는게 절실하게 느껴졌다.
때문에 실행하면서 불편한 점과 가독성 등등 고칠점을 개선해보자.

일단 먼저 실행을 해보자!

def BlackJack():
.
.
.

def loop_game():
    while True:
        BlackJack()
        if not ask_continue("You wanna play more? Y/N: "):
            break

loop_game()

시작부터 억까를당하는...

패배가 잘 작동했다. 이제 종료하지 않고 다시 실행해보자.

이번엔 이겼다! 🙌

근데 게임을 진행하는 동안에는 천천히 프린트 되기때문에 문제가 안됐지만, 지난 게임을 보기에는 불편했다. 가독성이 떨어졌다.

  • 언제 시작했는지?
  • 누가 뭘 뽑았는지?(누구의 차례인지)
  • 그래서 내 벨류가 얼마인지?
  • 다른 코드 작성시 불필요했던 요소들 제거

  • 기존에는 FACES와 NUMS로 명명되었던 변수를 SUITS와 RANKS로 변경했다. 적절한 명칭을 사용!
  • isinstance() 함수를 사용하면 코드가 더 유연하고 확장 가능해진다.
    이 함수는 지정된 클래스 또는 해당 클래스의 서브클래스의 인스턴스인지 확인하기 때문에, 사용자 정의 클래스와도 호환된다! 반면에 type() 함수는 정확한 클래스 일치를 필요로 하기 때문에 유연성이 떨어진다.

Deck 클래스에서 카드를 생성할때 for문 작성 방법을 바꿨다.
가독성을 높히면서 직관적으로 변경했다.

이 부분도 대,소문자를 조건에 다 넣지 않고 lower()을 사용해 소문자로 바꿔버리면 해결이었다.
그리고 strip() 으로 공백을 삭제해 불필요한 입력을 삭제했다.

벨류 계산에 대해서 고민을 많이 했었다.
ACE는 룰에서 1,11로 사용되기 때문이었다. 그러나 이걸 선택하는 부분을 추가 해보니 딜러가 ACE를 뽑았을때도 사용자에게 선택하게 됐었다.
때문에 21 이상일 경우만 ACE를 1로 사용하고 나머지는 11로 하도록 수정했다.

  • 함수는 주어진 핸드의 카드들을 이용하여 총 합계 계산.
  • 'Ace' 카드의 개수를 세어서 변수 num_aces에 저장.
  • 만약 합계가 21을 초과하고, 'Ace' 카드가 있는 경우에만 다음을 수행
    • 합계에서 10을 빼서 'Ace' 카드의 값을 1로 변경.
    • 'Ace' 카드의 개수를 하나 감소.
  • 변경된 합계를 반환.
    이렇게 함으로써 'Ace' 카드가 합계를 계산할 때 1 또는 11로 적절하게 처리되며, 합계가 21을 초과하는 경우에 'Ace' 카드의 값을 조절하여 합계를 맞추게 된다.

다음은 블랙잭 함수를 수정해보도록 하겠다.

profile
응애 개발맨

0개의 댓글