ランダムに抽出した5枚のトランプのタイプを検査する

3888 ワード

ランダムにトランプを5枚抽出し、得られるタイプは以下の通りです.
pair/two pair /three of a kind/four of a kind/flush/straight/straight flush/high card 
具体的な定義はウィキペディアを参照https://en.wikipedia.org/wiki/Poker_probability
 
このプログラムの目的は、5枚のカードを受け取り、以上のどのタイプに属するかを識別することです.
このタイプに属していることを確認すると、対応する文が印刷されtrueが返されます.そうでなければfalseを返します.
ランダムに大量の5枚の1組のトランプを生成し、このプログラムを適用してその出現頻度が理論確率値に近いかどうかを検証することができる.理論確率値の詳細はhttps://en.wikipedia.org/wiki/Poker_probability
def get_value_from_hands(hands):
    values = []
    for i in range(0,5):
        values.append(hands[i]['value'])
    return values

def get_suits_from_hands(hands):
    suits = []
    for i in range(0,5):
        suits.append(hands[i]['suit'])
    return suits

def appear_time_from_hands(hands):
    values = get_value_from_hands(hands)
    times = [0, 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0]
    for j in range(0,5):
        for i in range(2,15):
            if values[j] == i:
                times[i-2] += 1
            else:
                i += 1
    return times

def common_value_from_hands(hands):
    times = appear_time_from_hands(hands)
    appear_time =[]
    for time in times:
        if time != 0:
            appear_time.append(time)
    return appear_time

def is_flush(hands):
    suits = get_suits_from_hands(hands)
    if suits[0] == suits[1] == suits[2] == suits[3] == suits[4]:
        print('Hand contains flush')
        return True
    else:
        return False

def is_high_card(hands):
    if is_straight(hands):
        return False
    else:
        if is_flush(hands):
            return False
        else:
            times = common_value_from_hands(hands)
            if len(times) == 5:
                print('Hand contains high card')
                return True
            else:
                return False

def is_pair(hands):
    times = common_value_from_hands(hands)
    if len(times) == 4:
        if 2 in times:
            print('Hand contains one pair')
            return True
    else:
        return False

def is_2_pair(hands):
    times = common_value_from_hands(hands)
    if len(times) == 3:
        for i in range(0,3):
            if 2 in times :
                print('Hand contains 2 pair')
                return True
            else:
                i += 1
        else:
            return False
    else:
        return False

def is_3_of_a_kind(hands):
    times = common_value_from_hands(hands)
    if 3 in times:
        print('Hand contains 3 of a kind')
        return True
    else:
        return False

def is_4_of_a_kind(hands):
    times = common_value_from_hands(hands)
    if len(times) == 2:
        for i in range(0, 3):
            if 4 in times:
                print('Hand contains 4 of a kind')
                return True
            else:
                i += 1
        else:
            return False
    else:
        return False

def is_full_house(hands):
    times = common_value_from_hands(hands)
    if len(times) == 2:
        if 3 in times and 2 in times:
            print('Hand contains full house')
            return True
        else:
            return False
    else:
        return False

def is_straight(hands):
    times = common_value_from_hands(hands)
    if len(times) == 5:
        numbers = sorted(get_value_from_hands(hands))
        if numbers[0] + 4 == numbers[4]:
            print('Hand contains straight')
            return True
        else:
            return False
    else:
        return False

def is_straight_flush(hands):
    if is_straight(hands):
        suits = get_suits_from_hands(hands)
        if suits[0] == suits[1] == suits[2]== suits[3]== suits[4]:
            print('Hand contains straight flush')
            return True
        else:
            return False
    else:
        return False