百家乐程序

import random
from concurrent.futures import ThreadPoolExecutor
# import matplotlib.pyplot as plt
player_amount = 100
epochs = 10

conse_thresh = 4
money = 1023
strt_bet = 1

A = 1
J = 20
Q = 30
K = 40

pokers = []
for i in range(4*8):
    for poker in [A,2,3,4,5,6,7,8,9,10,J,Q,K]:
        pokers.append((i+1)*100+poker)

def pick_poker(remain_pokers):
    if len(remain_pokers)==0:
        remain_pokers = pokers.copy()
        random.shuffle(remain_pokers)
    card = random.choice(remain_pokers)
    remain_pokers.remove(card)
    return card%10

def one_game(remain_pokers):
    card1 = pick_poker(remain_pokers)
    card2 = pick_poker(remain_pokers)
    card3 = pick_poker(remain_pokers)
    card4 = pick_poker(remain_pokers)
    player = (card1 + card3)%10
    banker = (card2 + card4)%10

    if player in [8,9] or banker in [8,9]:#天牌情况
        pass
    elif player in [6,7]:
        if banker in [0,1,2,3,4,5]:
            card5 = pick_poker(remain_pokers)
            banker = (banker + card5)%10
    elif player in [0,1,2,3,4,5]:  #闲补牌(0~6)
        card5 = pick_poker(remain_pokers)
        player = (player + card5)%10
        case1 = banker in [0,1,2]
        case2 = banker in [3] and card5 not in [8]
        case3 = banker in [4] and card5 not in [0,1,8,9]
        case4 = banker in [5] and card5 not in [0,1,2,3,8,9]
        case5 = banker in [6] and card5 not in [0,1,2,3,4,5,8,9]

        if case1 or case2 or case3 or case4 or case5:
            card6 = pick_poker(remain_pokers)
            banker = (banker + card6)%10

    if player > banker:
        return 0
    elif player < banker:
        return 1
    else:
        return 2

def one_player(money,strt_bet):
    remain_pokers = []
    rest_money = []
    cur_bet = strt_bet
    cur_money = money

    conse_time = 0
    last_res = -1
    for _ in range(10000):
        if cur_money == 0:
            return rest_money[-1]
        cur_bet1 = min(cur_bet1,cur_money)
        res = one_game(remain_pokers)
        if conse_time >= conse_thresh:
            if last_res == 1 and res == 0:#win
                cur_money += cur_bet
                cur_bet1 = strt_bet
            elif last_res == 0 and res == 1:#win
                cur_money += cur_bet*0.95
                cur_bet1 = strt_bet
            elif last_res == 2:
                pass
            else:
                cur_money -= cur_bet
                cur_bet1 *= 2
        if res == last_res:#post_process
            conse_time+=1
        else:
            conse_time=0
            last_res=res
        rest_money.append(cur_money)
        # if cur_money1 > 1033:
        #     break
    return rest_money[-1]

def one_epoch(player_amount):
    cnt = 0
    sum = 0

    # for _ in range(player_amount):
    #     rest_money = one_player(money,strt_bet)
    #     res = rest_money
    #     if res == 0:
    #         cnt += 1
    #     print(f"{(cnt/(_+1)):.6f}: {res:.2f}")

    with ThreadPoolExecutor() as executor:
        futures = [executor.submit(one_player, money, strt_bet) for _ in range(player_amount)]
        for future in futures:
            rest_money = future.result()
            res = rest_money
            if res == 0:
                cnt += 1
            sum += 1
            print(f"{(cnt/sum):.6f}: {res:.2f}")

        # fig, ax = plt.subplots()
        # # 绘制折线图
        # ax.plot(rest_money)
        # # 保存图像为 PNG 文件
        # plt.savefig(f'line_plot_{_}.png')

for _ in range(epochs):
    one_epoch(player_amount)