import random
class hackysacker:
counter = 0
turns = 0
def __init__(self, name, circle, scheduler):
self.name = name
self.circle = circle
circle[self.name] = self
self.message = None
self.scheduler = scheduler
def incrementCounter(self):
hackysacker.counter += 1
if hackysacker.counter >= hackysacker.turns:
for player_id in self.circle:
self.circle[player_id].message = 'exit'
self.scheduler.append(self.circle[player_id])
return False
return True
def mainloop(self):
circle_len = len(self.circle)
while 1:
if not self.message:
yield None
continue
if self.message == "exit":
debugPrint("%s is going home" % self.name)
self.circle.pop(self.name)
yield None
debugPrint("%s got it from %s" % (self.name, self.message.name))
kickTo = self.circle.get(str(random.randint(0,circle_len-1)))
debugPrint("%s kicking hackeysack to %s"%(self.name,kickTo.name))
if self.incrementCounter():
kickTo.message = self
self.scheduler.append(kickTo)
if not kickTo is self:
self.message = None
yield None
def debugPrint(x):
if DEBUG:
print x
DEBUG=1
def runit(hs=10,ts=10,dbg=1):
global DEBUG
hackysackers = hs
turns = ts
DEBUG = dbg
hackysacker.counter = 0
hackysacker.turns = turns
circle = {}
scheduler = []
for i in range(hackysackers):
hackysacker(`i`, circle, scheduler)
circle['2'].message = circle['1']
circle['2'].mainloop().next()
while circle:
scheduler.pop(0).mainloop().next()
if __name__=="__main__":
timed = 1
if timed:
loops = 10
players = 1000
turns = 1000
import timeit
setup = ("import hackysack\n")
t = timeit.Timer("hackysack.runit(%i,%i,0)"%(players, turns),setup)
print "%.2f msec/pass." % (1000 * t.timeit(number=loops)/loops),
print "%i loops, %i players, %i turns/game."%(loops,players,turns)
else:
runit(1000,1000,0)
## raw_input("enter to close")
last updated 2 years ago
#
history