三国杀(HZNUOJ 2024程序设计基础综合作业 Hard )

三国杀(HZNUOJ 2024程序设计基础综合作业 Hard

2024程序设计基础综合作业 Hard 4:三国杀(模拟)

[题目链接](HZNUOJ–2023程序设计基础综合作业 Hard (dup4.cn) )

题目分析:

模拟

​ 这道题非常恶心。

​ 只能说你不是三国杀的忠诚用户大概率写不出来。

​ 想写的话可以先去看看三国杀的规则。

​ 反正我是没写出来,接下来出场的是三国杀业内大神: “黑神话:小黄龙(收徒, 不收毛毛流)”带来的python代码,大家有兴趣的可以研读一下,或许会有所启发。

代码实现:

python
t=int(input())
for y in range(t):
    o=[]                            #o为l的索引
    a=input()
    a=a.split()
    b=input()
    b=b.split()                     #b存放各个玩家的身份情况
    c={'ZG':0,'ZC':0,'NJ':0,'FZ':0} #c存放身份情况
    d={'ZG':0,'ZC':0,'NJ':0,'FZ':0} #d存放存活身份情况
    h={'ZG':0,'ZC':0,'NJ':0,'FZ':0} #h存放各个身份的基础得分
    for i in range(int(a[0])):
        c[b[i]]+=1
        d[b[i]]+=1
        o.append(i)
    e=[] #e存放击杀情况
    for i in range(int(a[1])):
        x=input()
        x=x.split()
        e.append(x)
    YZ=input()
    YZ=YZ.split()   #第一个元素为人数
    NH=input()
    NH=NH.split()   #第一个元素为人数
    f=[]            #f存放得分情况
    g=[]            #g存放额外加分情况
    flag=False      #是否进入主忠单挑
    k=[]            #k存放死亡名单
    for i in range(int(a[0])):
        g.append(0)
    for i in range(int(a[1])):
        d[b[int(e[i][1])]]-=1
        k.append(e[i][1])
        if (b[int(e[i][0])]=='ZG' or b[int(e[i][0])]=='ZC') and (b[int(e[i][1])]=='FZ' or b[int(e[i][1])]=='NJ'):
            g[int(e[i][0])]+=1
        elif b[int(e[i][0])]=='FZ':
            if b[int(e[i][1])]=='ZG':
                g[int(e[i][0])]+=2
            elif b[int(e[i][1])]=='ZC' or b[int(e[i][1])]=='NJ':
                g[int(e[i][0])]+=1
        if flag:
            l=e[i] #l存放主忠单挑结果
        if d['ZG']==1 and d['NJ']==1 and d['FZ']==0 and d['ZC']==0:
            flag=True
        if d['ZG']==0 and (d['ZC']>=1 or d['FZ']>=1):
            win=['FZ']
            break
        if d['ZG']==0 and d['NJ']==1 and d['FZ']==0 and d['ZC']==0:
            win=['NJ']
            break
        if d['FZ']==0 and d['NJ']==0:
            win=['ZG','ZC']
            break
    if win==['NJ']:
        h['NJ']+=(4+int(a[0])*2)
        h['ZG']+=1
    elif win==['FZ']:
        h['FZ']+=d['FZ']*3
    else:
        h['ZG']+=(4+d['ZC']*2)
        h['ZC']+=(5+d['ZC'])
    for i in range(int(a[0])):
        if b[i]!='NJ':
            if b[i] in win:
                f.append(h[b[i]]+g[i])
            else:
                f.append(h[b[i]])
        else:
            if win==['FZ']:
                if str(i) in k:
                    f.append(0)
                else:
                    f.append(1)
            elif win==['NJ']:
                if str(i) in k:
                    f.append(0)
                else:
                    f.append(h['NJ'])
            else:
                if flag:
                    if i==int(l[1]):
                        f.append(int(a[0]))
                    else:
                        f.append(0)
                else:
                    f.append(0)
    yz=0
    nh=0
    flag1=False
    flag2=False
    for i in range(1,len(YZ)):
        yz+=f[int(YZ[i])]
        if b[int(YZ[i])]=='NJ':
            flag1=True
    if flag1:
        yz+=1
    for i in range(1,len(NH)):
        nh+=f[int(NH[i])]
        if b[int(NH[i])]=='NJ':
            flag2=True
    if flag2:
        nh+=1
    print('Game '+str(y+1)+':')
    for i in range(len(f)-1):
        print(f[i],end=' ')
    print(f[-1])
    for i in range(len(f)-1):
        for j in range(len(f)-i-1):
            if f[j]<f[j+1] or (f[j]==f[j+1] and o[j]>o[j+1]):
                f[j],f[j+1]=f[j+1],f[j]
                o[j],o[j+1]=o[j+1],o[j]
    if str(o[0]) in YZ[1:]:
        yz+=3
    else:
        nh+=3
    if str(o[1]) in YZ[1:]:
        yz+=2
    else:
        nh+=2
    if str(o[2]) in YZ[1:]:
        yz+=1
    else:
        nh+=1
    print(str(yz)+' '+str(nh))
    if yz>nh:
        print('YZ WIN!')
    elif yz<nh:
        print('NH WIN!')
    else:
        print('TIE!')
    print()
    if y!=t-1:
        z=input()

我是BoBoowen,希望能在acm实验室遇见你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值