用Python制作淘汰游戏:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报道3的人退出圈子。请问最后留下的是原来第几号的那位。请用程序实现。利用装饰器,当淘汰某个人时,装饰器打印信息为:现在淘汰了XXX号人。
People=int(input('输入人数:'))
People_list = [] # 人的列表
People_num = [] # 辅助列表
number=1
#组合人列表
for num in range(People):
People_list.append(num)
del People_list[0]
People_list.append(People)
while len(People_list)-1:#只剩一个人结束循环
#确定开始值
if len(People_num):
if number==3:
number = 1 # 报数记录
else:
number+=1
Surplus = len(People_list) # 剩余的人 确定辅助列表 长度
People_num=[]#辅助列表
#print('Surplus',Surplus)
#创建辅助列表
while Surplus:
if number==4:
number=1
else:
People_num.append(number)
number+=1
Surplus -= 1
print('People_num',People_num)#辅助列表
print('People_list',People_list)#剩余的人
number=People_num[-1]#取出辅助列表最后一个报数 为下一轮做准备
#print('number',number)
def wrap(runt):
def inner(*args,**kwargs):
print('现在【%s】退出了'%(People_list[People_index]))
runt(*args,**kwargs)
return inner
@wrap
def reserve(People_index,People_num,People_list):
del People_num[People_index]
del People_list[People_index]
#print('People_index', People_index)
#通过辅助列表 删除 人
while True:
try:
People_index = People_num.index(3)#得出 3 的索引
except ValueError:
break
else:
e=reserve(People_index,People_num,People_list)
print('剩下的人'+str(People_list))
运行结果
输入人数:5
People_num [1, 2, 3, 1, 2]
People_list [1, 2, 3, 4, 5]
现在【3】退出了
People_num [3, 1, 2, 3]
People_list [1, 2, 4, 5]
现在【1】退出了
现在【5】退出了
People_num [1, 2]
People_list [2, 4]
People_num [3, 1]
People_list [2, 4]
现在【2】退出了
剩下的人[4]