生活体验

python练习-模拟钓鱼钩的桌游结果

2019-12-28  本文已影响0人  魔王大柚子

规则:

1、 每人平分一半的牌
2、 一人先出牌
3、 如果是出牌的那张牌的相同数字牌在堆中,即可获得这之间和本身的牌
4、 如果出牌为Q对手就给2张牌、K给3张、小王给4张、大王给10张,先给牌,再拿牌,获得的牌放最下面
5、 谁先没牌谁就输了

使用python代码如下:

import random
#所有牌的dict
p={}
#发牌,n是几副牌
def fenpai(n=1):
    p1=[]

    for i in range(52*n):
        p[i]=i%13+1
        p1.append(i)
    for i in range(n):
        p[52*n+2*i]=14
        p[52*n+2*i+1]=15
    s=[]
    r=([],[])
    p2=([],[])
    for i in p:
        s.insert(random.choice(p1),i)
    for i in range(len(p)):

        r[i%2].append(s[i])
        p2[i%2].append(p[s[i]])

    return r,p2
# 钓鱼的排队
line={'p':[],'o':[]}
def role(u):
    dd=0
    pp=[]
    if u[1]==11:
        pp=line['o']
        line['p']=[]
        line['o']=[]
        pp.append(u[0])

    elif u[1]==12:
        dd=2
    elif u[1]==13:
        dd=3
    elif u[1]==14:
        dd=5
    elif u[1]==15:
        dd=10
    if u[1] in line['p']:
        while True:
            v=line['p'].pop()
            k=line['o'].pop()
            pp.insert(0,k)
            if u[1]==v:
                break
        pp.append(u[0])


    else:
        if u[1]!=11:
            line['p'].append(u[1])
            line['o'].append(u[0])
    return dd,pp

# 出牌,man是出牌人信息
def chupai(man):
    if len(man['o'])==0:
        return False,''
    else:
        v=(man['o'].pop(),man['p'].pop())
        return True,v
# 一轮牌堆交互
def geipai(l1,l2,nores=False):
    k,v=chupai(l1)
    again=False
    
    if k:
        if not nores:
            print(l1['name'],'出牌',v[1])
        dd,pp=role(v)
        if len(l2['o'])>dd:
            for _ in range(dd):
                if not nores:
                    print(l2['name'],'罚牌',l2['p'][-1])
                    print(l1['name'],'得牌',l2['p'][-1])

                l1['o'].insert(0,l2['o'].pop())
                l1['p'].insert(0,l2['p'].pop())
            for i in pp:
                l1['o'].insert(0,i)
                l1['p'].insert(0,p[i])
                again=True
                if not nores:
                    print(l1['name'],'得牌',p[i])
        else:
            l2['o']=[]
            l2['p']=[]
            if not nores:
                print(l2['name'],'被清空牌')
        return True,again
        
    else:
        if not nores:
            print(l2['name']+' win !')
        return False,''
# 整个牌局
def paiju(r,nores=False):
    l1={'o':r[0][0],'p':r[1][0],'name':'www'}
    l2={'o':r[0][1],'p':r[1][1],'name':'ccc'}
    init=1
    while  True:
        t,m=geipai(l1,l2,nores)
        if t:
            while True:
                if t:
                    if m:
                        t,m=geipai(l1,l2,nores)
                    else:
                        break
                else:
                    break
        else:
            break
        t,m=geipai(l2,l1,nores)
        if t:
            while True:
                if t:
                    if m:
                        t,m=geipai(l2,l1,nores)
                    else:
                        break
                else:
                    break

        else:
            break
        init+=1
        if not nores:
            print('_'*40)

    return init
# 最大回合数
max=0
# 最小回合数
min=12121
# 跑一千局结果
for i in range(1000):
    r=fenpai(2)
    ini=paiju(r,True)
    if ini>max:
        max=ini
    if ini <min:
        min=ini
print(min,max)



上一篇 下一篇

猜你喜欢

热点阅读