홀덤기준 파이썬


01(A),02,03,04,05,06,07,08,09,10(T),11(J),12(Q),13(K)로 숫자를 구분, 이를 14진법으로서 인식한다.

1,2,3,4,5,6,7,8,9,A,B,C,D


스페이드 다이아몬드 하트 클로버를 순서대로 0,1,2,3으로 구분한다.


스페이드 킹, 다이아 8, 스페이드 잭, 클로버 10, 하트 에이스를 표현할 경우,

D0,81,B0,A3,12 을 합친 D081의 14진법 10자리 숫자로서 표현


이때, 족보를 계산하기 쉽도록 미리 5장의 카드를 내림차순으로 정렬한다 *1)

그경우 D0,B0,A0,81,12가 되겠다. (키커, rank등을 판단하기 쉽게 하기 위함)

#Q. 14진법을 쓰는게 좋은 생각인가? 

#A. 어차피 빼기 수준, 어쩌면 더 낮은 수준의 연산을 할 것이기 때문에 별로 관련없을듯



5장에 대한 족보의 판단

먼저 플러쉬 여부를 확인

Y. 스트레이트 여부를 확인 (T, J, Q, K, A 로 이루어진 마운틴은 이후 확인)

Y-Y. 스트레이트 플러쉬, 현재 내림차순으로 14진법의 5자리로 rank를 결정

Y-N. 마운틴 여부를 확인

Y-N-Y. 로열 스트레이트 플러쉬.

Y-N-N. 플러쉬, 현재 내림차순으로 14진법의 5자리로 rank를 결정

이때, 플러쉬는 페어를 가질 수 없기에 이걸로 끝이다.


N. 스트레이트 여부를 확인 (T, J, Q, K, A 로 이루어진 마운틴은 이후 확인)

N-Y. 스트레이트, 현재 내림차순으로 14진법의 5자리로 rank를 결정

N-N. 마운틴 여부를 확인

N-N-Y. 마운틴(브로드웨이 스트레이트.)

N-N-N. 같은 숫자 조합이 있는지 확인. 

해당 로직 : 

페어 수 리스트 = []

해당 페어의 중복수(pair? triple? quads?) = 1


카드 인덱스(i) = 1

for i == 4 : #5인가?

if i 의 숫자 == i+1 의 숫자 : 해당 페어의 중복수 += 1, 

else :

if 해당 페어의 중복수 == 1 : pass

else :  페어 수 리스트.append( (해당 페어의 중복수, i의 숫자) )
i += 1

페어 수 리스트의 n = 0 : 노페어, 현재 내림차순으로 14진법의 5자리로 rank를 결정
페어 수 리스트의 n = 1 : 
해당 페어의 중복수 = 4 : 포카드(quads), i의 숫자 + 나머지 한장의 카드의 숫자를 내림차순으로 붙여 14진법의 2자리수로 rank를 결정
ex) (다이아8, 클로버8, 스페이드8, 스페이드 8, 다이아 에이스)의 rank = 81

해당 페어의 중복수 = 3 : 트리플, i의 숫자 + 나머지 두장의 카드의 숫자를 내림차순으로 붙여 14진법의 3자리수로 rank를 결정
ex) (다이아8, 클로버8, 스페이드8, 스페이드 킹, 다이아 에이스)의 rank = 8D1

해당 페어의 중복수 = 2 : 원페어, i의 숫자 + 나머지 세장의 카드의 숫자를 내림차순으로 붙여 14진법의 4자리수로 rank를 결정
ex) (다이아8, 클로버8, 스페이드 퀸, 스페이드 킹, 다이아 에이스)의 rank = 8CD1

페어 수 리스트의 n = 2 : 
해당 페어의 중복수 중 3이 있다면 : 풀하우스, 중복수3의 i의 숫자 + 중복수2의 i의 숫자 를 붙여 14진법의 2자리수로 rank를 결정
ex) (다이아8, 클로버8, 스페이드8, 스페이드 킹, 다이아 킹)의 rank = 8D

해당 페어의 중복수 중 3이 없다면 : 투페어. 현재 페어 수 리스트의 i의 숫자는 내림차순으로 정렬되어 있음이 신뢰가능한 바, 
페어 수 리스트[0][1] + 페어 수 리스트[1][1] + 나머지 한장의 숫자로 rank를 결정
ex) (다이아킹, 클로버킹, 스페이드4, 클로버4, 하트 퀸)의 rank = D4C

족보의 순서는
9 로열 스트레이트 플러쉬
8 스트레이트 플러쉬
7 포카드
6 풀하우스
5 플러쉬
4 스트레이트
3 트리플
2 투페어
1 원페어                                 
0 노페어(하이카드)
로 결정되는 바, 숫자는 다음과 같이 지정된다.

따라서, 해당 5장의 핸드의 세기는 (족보, rank)로 저장한다.

ex) 
(다이아킹, 클로버킹, 스페이드4, 클로버4, 하트 퀸)의 핸드 세기 = (3, D4C)
(다이아킹, 다이아퀸, 다이아10, 다이아5, 다이아2)의 핸드 세기 = (5, DCA52)



사용하는 카드는 7장(핸드 / 커뮤니티 구분 x)

가능한 콤보는 5C7 = 7*6 / 2*1  = 21개

21개 콤보 리스트는 미리 작성할까함 [ (1,1,1,1,1,0,0) , (1,1,1,1,0,1,0), (1,1,1,1,0,0,1), (1,1,1,0,1,1,0), ... (0,0,1,1,1,1,1) ] 

# 좋은 생각인가?

7장의 카드를 튜플(D2, D1. D0. C2, 82, 62, 22)로 만든다. 

이때, 내림차순을 7장에서 미리 해두면 5장을 뽑을 때 무조건 내림차순이 되는바, 여기서 미리 해두고 이를 신뢰하자.



초기 핸드파워는 (0, 76542)로 가장 낮은 수준으로 만들어 둔다.

씨발. 에이스를 1이 아니라 E로 했어야 됐네.... 시발시발 1로하니까 가장 낮은 파워가 (0, 65431)이 되잖아

그래도 정리는 충분히 했으니 이제 코딩해야겠다.


고마워용~