三国杀(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实验室遇见你!