Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Damagucci-Juice] step4-2 족보를 구현해 패를 내놓음 #115

Open
wants to merge 25 commits into
base: gucci
Choose a base branch
from

Conversation

Damagucci-Juice
Copy link

구현 내용

  • Computer 라는 클래스로 패를 계산
  • 로직 흐름을 Poker Game -> Player + Computer 조합으로 패를 내놓음
  • 추상 인터페이스로 Playable 프로토콜을 구현하고 Participant 클래스가 이를 채택하도록 한 후,
    Player 와 Dealer 가 Participant 를 채택하도록 설정
  • 5카드 스터드 로직을 구현
  • 패가 나오는 흐름을 유닛 테스트로 구현

고민과 해결

1. 가지고 있는 패를 어떻게 나타낼까?

  • Computer 클래스를 어떤 식으로 구현해야할지 감을 못잡음

    • Participant 안에 로직을 구현하려하다가 Computer 클래스에 이관하였고, 속성값으로 어떤 패를 가지는지 확인하는 속성을 설정하였다.

  • 패를 전체 가지고 있는 모습을 보여주는 타입을 어떻게 하면 좋을까 하다가 딕셔너리 형식으로 구현하였다.

    • let shapeRankTable : [Shape, [Int]]

  • Rank 는 배열의 인덱스로 표현하였다.

카드가 있으면 1, 없으면 0 0에이스 1 2 3 4 5 6 7 8 9 10 11 12킹
스페이드 0 0 0 0 0 0 0 1 0 0 0 0 0
다이아몬드 0 1 1 0 0 0 0 0 0 0 0 0 0
하트 0 0 0 0 0 0 0 0 0 0 1 0 0
클로버 0 0 0 0 0 0 1 0 0 1 0 0 1

위는 7 카드 스터드 예시

2. 연산 프로퍼티에 너무 과한 계산을 넣은게 아닌가 하는 문제

    private var isStraight : (back: Bool, straight: Bool) {
        guard let sumOfShapes = self.sumOfShapes else {
            return (false ,false)
        }
        for index in 0..<10 {
            if sumOfShapes[index] > 0 &&
                sumOfShapes[index+1] > 0 &&
                sumOfShapes[index+2] > 0 &&
                sumOfShapes[index+3] > 0 &&
                sumOfShapes[index+4] > 0 {
                if index == 0 {
                    return (true, true)
                } else {
                    return (false,true)
                }
            }
        }
        return (false,false)
    }
  • 스트레이트 속성을 지니는지 판단하는 연산 프로퍼티이다.
    • 이 속성이 호출될 때마다 저 많은 명령줄이 다 호출이 된다 하면 아주 비효율적일거같은데.. 또 한편으로는 저장 속성으로 선언하고 메서드를 선언해준다고 하면 그거대로 코드 낭비이지 않을까 싶어서 일단은 이렇게 했다.

3. 같은 족보의 패가 나왔을 때, 승자를 가리는 로직을 구현하지 못했다.

enum Shape: Comparable {
    
    case club
    case heart
    case diamond
    case spade
    
    var picture: String {
        switch self {
        case .spade:
            return ""
        case .diamond:
            return ""
        case .heart:
            return ""
        case .club:
            return ""
        }
    }
}

같은패승자선택오류
위 사진은 flush 일 때 딜러가 다이아몬드라 이겨야 하는데, 하트 플러쉬인 크롱이 이긴모습

이런 식으로 구현은 했는데, 이 때 나누는 방법이 two pair 일때 다르고, one pair일 때 다르고, flush 일때 다르고, straight 일 때 다르게 구현해야해서 어느 정도 시간을 넣으면 하긴 할 거같은데, 일단은 코드 제출을 위해 여기까지는 구현하지 못했다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant