写了几遍的python源码(考虑到时间因素 没有增加server和client 功能): (阶段I代码如下:实现两轮自动按不同键值筛选和复活赛传递. python 已经算是代码简化之王了,处理起赛程代码来还是要超出上百行,杯具吖,不过既然是第一次拿python写.py源程序 缺乏经验 原谅自己了。

import random
import string
import msvcrt
import sys

class player:
name=""
num=0
totalWin=0
compNum=0
sex=0 #'0' is female,'1' is male
ScoreList=range(15)
RivalList=range(15)
def __init__(self,_name,_num,_sex):
self.name=_name
self.num=_num
self.sex=_sex
def Record(self,score,RivalNum):
self.compNum=self.compNum+1
self.ScoreList[self.compNum]=score
self.RivalList[self.compNum]=RivalNum
if(score>0):
self.totalWin=self.totalWin+1

def getPlayersFromFile(path):
"""To get the students-list of the path"""

str = file(path).read()
str = str.replace("\n",";")
num = str.count(";")+1
str = str.split(";")
list = [elem.split(",") for elem in str ]
if list[-1]==['']:
num=num-1
del list[-1]

playerList=[player(list[0][1],string.atoi(list[0][0]),string.atoi(list[0][2]))]
for i in range(1,num):
playerList.append(player(list[i][1],string.atoi(list[i][0]),string.atoi(list[i][2])))
return (playerList,num)

def swap(a,b):
return (b,a)



class competition:
playerList = []
winPlayerList = []
winNum=0
winNumberList=[]
failPlayerList = []
failNum=0
failNumberList=[]
th=0
playerNumber=0
directUp =-1
def __init__(self,_playerList,_num,_index):
self.playerList=_playerList
self.playerNumber=_num
self.th=_index




def setDirectUp(self):
if(self.playerNumber%2==0):
print "move!"
return 1
b=0
for i in self.playerList:
if(i.sex==0):
b=b+1
else:
break
if(b%2!=0):
print "!!!!"
self.directUp=b-1
else:
#print "move!"
self.directUp=self.playerNumber-1

def setRival(self,isRandom=1,index=1):# index(1,2)=(sex,totalWin)
if(isRandom==1):
random.shuffle(self.playerList)
k=0

for i in range(1,self.playerNumber):
if(index==1):
while((k<self.playerNumber and k<i)and(self.playerList[i].sex==0)):
if(self.playerList[k].sex==1):
(self.playerList[i],self.playerList[k])=swap(self.playerList[i],self.playerList[k])
k=k+1
break
k=k+1
if(index==2):
while(k<self.playerNumber):
if(self.playerList[k].totalWin>self.playerList[i].totalWin):
(self.playerList[i],self.playerList[k])=swap(self.playerList[i],self.playerList[k])
k=k+1
break
k=k+1
self.setDirectUp()
def search(self,i):
for e in range(self.playerNumber):
if(self.playerList[e].num==i):
return self.playerList[e]
return 0
def findList(self,list,value):
for i in list:
if(value==i):
return 1
return 0
def setResult(self,winNumList):
k=[]
f=[]
if(self.directUp!=-1):
winNumList.append(self.playerList[-1].num)
#print "%d:",self.playerList[self.directUp].num
self.winNumberList=winNumList
for i in winNumList:
m=self.search(i)
if(not m):
print "!!-"
return 0
else:
k.append(m)
numList=[]
for i in self.playerList:
numList.append(i.num)
for i in numList:

v=self.findList(winNumList,i)
if(not v):
m=self.search(i)
if(m):
f.append(m)
self.failNumberList.append(m)
else:
print "\nERROR In Finding %d!!!!!"% i
self.winPlayerList=k
self.failPlayerList=f
self.winNum=self.playerNumber/2+self.playerNumber%2
self.failNum=self.playerNumber/2
return 1

def stoList(list):
t=0

t=list.count(',')+1
list=list.split(",")
listM=[]
for i in range(t):
listM.append(string.atoi(list[i]))
return listM


def printResult(comp):
print "\nWinners:"
for i in comp.winPlayerList:
print "%02d,%s" %(i.num,\
i.name)
print "\nTBA:"
for i in comp.failPlayerList:
print "%02d,%s" %(i.num,\
i.name)

def isInList(list,i):#whether i in list
for e in list:
if(e==i):
return 1
return 0
def belongList(list,subList):#whether subList belongs to list
for e in subList:
if(not isInList(list,e)):
return 0
return 1

def runComp(comp,p,num,th):
#print Init Player List
comp = competition(p,num,th)
comp.setRival(0,1)
te=0
#print "!!%d"%comp.directUp
if(comp.directUp!=-1):
te=comp.playerList[comp.directUp]
comp.playerList.append(te)
del(comp.playerList[comp.directUp])
print "\n\nInit Player List for [%f]Group\n" % comp.th
for i in range(0,comp.playerNumber-1,2):

print "(%02d,%s) - (%02d,%s)" %(comp.playerList[i].num,comp.playerList[i].name,\
comp.playerList[i+1].num,comp.playerList[i+1].name)

if(comp.directUp!=-1):
print "direct promotion:(%02d,%s)" %(comp.playerList[comp.playerNumber-1].num,\
comp.playerList[comp.playerNumber-1].name)
return comp


def runCompResult(comp):
list=""
#while(1):
print "Please enter[%d] winner's numbers such as '5,7,2,9,11 ' "%comp.th
sys.stdout.write('>>>')
list=raw_input()
"""print "Please enter ditto again for assurance:"
sys.stdout.write('>>>')
list2=raw_input()

if((list==list2) and belongList(comp.winNumberList,list) ):
print "Correct."
break
print "Your two inputs aren't equal,please enter again! "
"""
list=stoList(list)
comp.setResult(list)
printResult(comp)

if __name__ == "__main__":

(p,num)=getPlayersFromFile("g:\\cs_1.log")
comp1=0
comp2=0
comp3=0
comp4=0
comp5=0
comp6=0
comp7=0
comp8=0
comp9=0


comp1=runComp(comp1,p,num,1)
runCompResult(comp1)

print "%d,%d"%(comp1.winNum, comp1.failNum)
comp2=runComp(comp2,comp1.winPlayerList,comp1.winNum,2.1)
comp3=runComp(comp3,comp1.failPlayerList,comp1.failNum,2.2)
runCompResult(comp2)
runCompResult(comp3)
#comp4=competition(comp2.winPlayerList,comp2.winNum,4.1)#jump to directly 4.1th

comp5=runComp(comp5,comp2.failPlayerList,comp2.failNum,3.1)
comp6=runComp(comp6,comp3.winPlayerList,comp3.winNum,3.2)
comp7=runComp(comp7,comp3.failPlayerList,comp3.failNum,3.3)


runCompResult(comp5)
runCompResult(comp6)
runCompResult(comp7)



comp7=runComp(comp7,comp7.winPlayerList,comp7.winNum,3.32)
runCompResult(comp7)

comp8=runComp(comp8,comp2.winPlayerList+comp5.winPlayerList+comp6.winPlayerList+comp7.winPlayerList,\
comp2.winNum+comp5.winNum+comp6.winNum+comp7.winNum,4.1)

runCompResult(comp8)

j=0
while(1):
if(comp8.winNum>=2):
comp9=runComp(comp9,comp8.winPlayerList,comp8.winNum,5+j+0.1)
runCompResult(comp9)
comp8=comp9
j=j+1
else:
break

已经用于实际班级乒乓球比赛,缺点如下: 1 每一大轮一定要等到所有人都比赛完才开始随机下一轮选手,导致先比完的人只能等待而不能提前进入下一轮预先随机。 2 没有提供临场替换选手和取消选手的功能,导致中场退出的人只能被假设处理。 但都不是运行时致命缺点。
|