谁是卧底是现实中一款特别火的烧脑游戏。今天,我就用Python模拟一下
话不多说,上代码!
(虽然代码质量很低)
import time,random,os
#初始化列表和变量
while True:
persons=int(input('请输入游玩人数[3人及以上]'))
undercover=int(input('请输入卧底人数'))
if persons>=3 and undercover<persons-undercover:
break
else:
print('输入错误,请重新输入')
word=[('苹果','桃子'),('可乐','雪碧'),('空调','风扇'),('Python','C++'),('地铁','高铁')]
iden=[]
iden_dict={}
dictionary={}
iden=['平民']*(persons-undercover)+['卧底']*undercover
state_list=[]
for i in range(persons):
state_list.append('存活')
vote_state=input('是否要开启匿名投票?[是/否]')
#产生随机子数组
num=len(word)
sn=random.randint(0,num-1)
death=0
#输出身份和随机词
string=input( '按回车键开始随机身份')
for i in range(persons):
state_list.append('存活')
identity=random.choice(iden)
if identity=='卧底':
randword=word[sn][1]
print(f'{i+1}号玩家的身份是{identity},随机词是{randword}')
iden_dict[identity]=i+1
dictionary[i+1]=identity
time.sleep(2)
iden.pop(persons-i-1)
os.system('cls')
elif identity=='平民':
randword=word[sn][0]
print(f'{i+1}号玩家的身份是{identity},随机词是{randword}')
iden_dict[identity]=i+1
dictionary[i+1]=identity
time.sleep(2)
iden.pop(0)
os.system('cls')
if i<persons-1:
print('请下一位玩家查看身份' )
time.sleep(2)
os.system('cls')
#游戏主循环
while True:
vote_list=[]
for i in range(persons-death):
vote_list.append(0)
if undercover==0:
print('平民胜利')
os.system('pause')
break
elif death>=persons-undercover-1:
b=iden_dict['卧底']
print(f'卧底胜利,{b}号玩家是卧底')
os.system('pause')
break
number=1
for i in range(persons):
print(f'{number}号玩家 {state_list[i]}')
number+=1
#讨论必要条件
for i in range(persons):
if state_list[i]=='存活':
print(f'请{i+1}号玩家打出自己随机词的描述')
string=input()
else:
continue
print('\n')
print('讨论时间(按下回车停止)')
a=input()
print('现在,开始投票')
#投票
if vote_state=='是':
for i in range(persons):
if state_list[i]=='存活':
vote=int(input(f'请{i+1}号玩家投票(0表示弃票,1表示1号玩家,2表示2号玩家……)'))
os.system('cls')
if vote==0:
continue
elif state_list[vote-1]=='死亡':
print('不能投给已死亡玩家,此票无效!')
continue
else:
vote_list[vote-1-death]+=1
continue
else:
for i in range(persons):
if state_list[i]=='存活':
vote=int(input(f'请{i+1}号玩家投票(0表示弃票,1表示1号玩家,2表示2号玩家……)'))
if vote==0:
continue
elif state_list[vote-1]=='死亡':
print('不能投给已死亡玩家,此票无效!')
continue
else:
vote_list[vote-1-death]+=1
continue
max_value = max(vote_list)
max_index = vote_list.index(max_value)
#判断淘汰玩家
v=sorted(vote_list,reverse=True)
no_vote=0
for i in vote_list:
if i==0:
no_vote+=1
if no_vote==persons:
print('没有玩家被淘汰(弃票)')
time.sleep(2)
os.system('cls')
continue
elif v[0]==v[1]:
number=0
for i in range(persons):
if state_list[i]=='存活':
print(f'{number+1}号玩家被投了{vote_list[number]}票')
time.sleep(1)
number+=1
else:
continue
print('没有玩家被淘汰(平票)')
time.sleep(2)
os.system('cls')
continue
else:
number=0
for i in range(persons):
if state_list[i]=='存活':
print(f'{number+1+death}号玩家被投了{vote_list[number]}票')
time.sleep(1)
number+=1
else:
continue
print(f'{max_index+1+death}号玩家被淘汰')
time.sleep(2)
state_list.pop(max_index+death)
state_list.insert(max_index+death,'死亡')
if dictionary[max_index+1+death]=='卧底':
undercover-=1
print(f'{max_index+1+death}号玩家是卧底(还有{undercover}名卧底)')
else:
print(f'{max_index+1+death}号玩家是平民(还有{undercover}名卧底)')
death+=1
time.sleep(3)
os.system('cls')