用python实现羽毛球比赛中的八人转和多人转

八人转和多人转

本人是打羽毛球爱好者,对中羽联的八人转感兴趣,感觉非常好玩,但是这个八人转限制了人数,所以想写个程序实现不限制人数的多人转。

首先介绍八人转的规则,8个人参赛每人参赛7场,每个人分别和其余的人搭档一次,双打对手是随机配对。具体排名规则和计分规则不在此详述。

本文所说的多人转,是不限制人数的,这里假定总共参赛人数比每个人参赛的局数大,有以下限制:
1.每个人打得局数基本相同,因为一局必有4个人参赛,故会出现1~3个人多打一局的情况;
2.每个人不会和自己搭档过的人再搭;
3.搭档不能是自己,对手不能是自己。

思路解析

规则看似简单,限制还是蛮多的。整体编程的思路是:
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来源:Loysun
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月14日
下一篇 2020年10月14日

相关推荐