八人转和多人转
本人是打羽毛球爱好者,对中羽联的八人转感兴趣,感觉非常好玩,但是这个八人转限制了人数,所以想写个程序实现不限制人数的多人转。
首先介绍八人转的规则,8个人参赛每人参赛7场,每个人分别和其余的人搭档一次,双打对手是随机配对。具体排名规则和计分规则不在此详述。
思路解析
规则看似简单,限制还是蛮多的。整体编程的思路是:
1.根据人数和人均局数,先确定好总局数;
2.确定需要多少组搭档,接着给每个人配好搭档;
3.进行配对打比赛。
直接上代码
先po上代码,再强行解释一波~
先是生成所有的搭档组合(candidate_pool),选手与其它人分别配对,从中挑选需要的数量(num_pair) 的组合,然后随机配对比赛对手,配对的规则是进行遍历,若选中的搭档中两个人的局数都未达到人均局数则选择放入参赛池(pari_pool)中,否则抛弃。直到多次遍历后,可能仍没法使得每个人的局数都达到人均局数,此时需要进行调整。
分为两种情况:
- 情况一:有至少两个人的局数未满足,则随机挑选其中两个人p1,p2,他们的搭档组合[p1,p2](此处忽略顺序,以下同),必定在参赛池中,否则放入参赛池会使两个人的局数都增加。为了使得两个人的局数增加,在参赛池中找到一对搭档[c1,c2],使得[c1,p1]和[c2,p2]都在候选池中,则将[c1,c2]放回候选池,[c1,p1]和[c2,p2]放入参赛池中,p1,p2两人的局数增加,c1,c2两人局数不变;
- 情况二:只有一个人p1的局数未满足,则在参赛池中挑选一对搭档[c1,c2],使得[c1,p1]和[c2,p1]都在候选池中,同上进行操作,p1局数增加2次,c1,c2两人局数不变。
对以上两种情况进行调整之后,每个人都满足局数,进入下一步,配对对阵对手。
def getLineupTable(num_people = 8,num_round = 7): pair_pool = getPairPool(num_people,num_round) all_round = len(pair_pool)//2 # 所有场 res =[] rivalry =[] for i in range(201):per = pair_pool.pop(0)if len(rivalry)==0: rivalry.append(per)elif len(set(per) & set(rivalry[0]))==0: rivalry.append(per)else: pair_pool.append(per)if len(rivalry)==2: res声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!