def play(self): sys.stdout.write('Iterating') startDeck = CardCounts({Copper.Copper():7, Estate.Estate():3}) for chrm in self.chromosomes: sys.stdout.write('.') sys.stdout.flush() if chrm.gamesPlayed == self.times_to_play: continue who_to_play = filter((lambda x: x.gamesPlayed < self.times_to_play), self.chromosomes) tourn = random.sample(who_to_play, 2) tourn.insert(0, chrm) gameType = random.choice(self.games) players = [] for player in tourn: players.append(GUMDRP(gameType[1], *player.genes)) gs = GameState.setup(gameType[0], startDeck, players) numPlayers = len(gs.players); numDepleted = 0 numMoves = 0 while (gs.stacks[Province.Province()] != 0) and numDepleted < 3 and not self.suboptimalDeck(gs, gameType[1]) and numMoves < 80: curPlayer = gs.players[gs.turn] gs.abcs[gs.turn] = {'actions':1, 'buys':1, 'coins':0} gs = curPlayer.playActionPhase(gs) bought = gs.stacks.copy() gs = curPlayer.playBuyPhase(gs) gs = curPlayer.playDiscardPhase(gs) gs.turn = (gs.turn + 1) % numPlayers numDepleted = len(filter(lambda c: gs.stacks[c] == 0, gs.stacks)) numMoves += 1 cards_left = [((gameType[1] - gs.pcards[i].allCards()).count, i) for i in xrange(numPlayers)] cards_left.sort() for people in cards_left: tourn[people[1]].incr(people[0]) print ''
def evalDeck(player, stacks, deck, trials=5, coinsPerBuy=8, aquireFilter=lambda c: True): totalBuyingPower = 0 totalAquiredValue = 0 state = GameState.setup(stacks.copy(), deck.copy(), [player]) #print str(deck) for t in xrange(trials): #state = GameState.setup(deck.copy(), deck.copy(), [player]) state.abcs[0] = {'actions': 1, 'buys': 1, 'coins': 0} #print str(state.pcards[0].hand) aquired = state.stacks.copy() state = state.players[0].playActionPhase(state) aquired -= state.stacks totalAquiredValue += sum( [c.cost * n for c, n in aquired.items() if aquireFilter(c)]) totalCoins = state.abcs[0]['coins'] + sum( [c.coins * n for c, n in state.pcards[0].hand.items()]) totalBuyingPower += min(state.abcs[0]['buys'] * coinsPerBuy, totalCoins) state = state.players[0].playDiscardPhase(state) #print totalBuyingPower, '~\tbuys:', state.abcs[0]['buys'], '\tcoins:', totalCoins, '\taquired:', str(aquired), '\n' return (totalBuyingPower, totalAquiredValue)
def __init__(self): # 0 additional arguments, self is self-reference pygame.init() # Renderer, handles rendering functions on behalf of the game rendererOptions = type('', (), {})() rendererOptions.width = 800 rendererOptions.height = 600 self.gameRenderer = Renderer(rendererOptions) # Renderer before GameState, since Spritesheet depends on display.set_mode # Game state object, tracks state of game and all objects in game self.gameState = GameState() # Example of tightly coupled code. # TODO: Refactor coupled code, separate dependencies self.gameRenderer.game = self.gameState # Internal variables to handle frame ticks/FPS self.clock = pygame.time.Clock() self.currentTime = 0 # Event Handler dictionaries self.keydownHandlers = defaultdict(list) self.keyupHandlers = defaultdict(list)
def evalDeck(player, stacks, deck, trials = 5, coinsPerBuy=8, aquireFilter = lambda c:True): totalBuyingPower = 0 totalAquiredValue = 0 state = GameState.setup(stacks.copy(), deck.copy(), [player]) #print str(deck) for t in xrange(trials): #state = GameState.setup(deck.copy(), deck.copy(), [player]) state.abcs[0] = {'actions':1, 'buys':1, 'coins':0} #print str(state.pcards[0].hand) aquired = state.stacks.copy() state = state.players[0].playActionPhase(state) aquired -= state.stacks totalAquiredValue += sum([c.cost*n for c,n in aquired.items() if aquireFilter(c)]) totalCoins = state.abcs[0]['coins'] + sum([c.coins*n for c,n in state.pcards[0].hand.items()]) totalBuyingPower += min(state.abcs[0]['buys']*coinsPerBuy, totalCoins) state = state.players[0].playDiscardPhase(state) #print totalBuyingPower, '~\tbuys:', state.abcs[0]['buys'], '\tcoins:', totalCoins, '\taquired:', str(aquired), '\n' return (totalBuyingPower, totalAquiredValue)
def play(self): sys.stdout.write('Iterating') startDeck = CardCounts({Copper.Copper(): 7, Estate.Estate(): 3}) for chrm in self.chromosomes: sys.stdout.write('.') sys.stdout.flush() if chrm.gamesPlayed == self.times_to_play: continue who_to_play = filter( (lambda x: x.gamesPlayed < self.times_to_play), self.chromosomes) tourn = random.sample(who_to_play, 2) tourn.insert(0, chrm) gameType = random.choice(self.games) players = [] for player in tourn: players.append(GUMDRP(gameType[1], *player.genes)) gs = GameState.setup(gameType[0], startDeck, players) numPlayers = len(gs.players) numDepleted = 0 numMoves = 0 while (gs.stacks[Province.Province()] != 0) and numDepleted < 3 and not self.suboptimalDeck( gs, gameType[1]) and numMoves < 80: curPlayer = gs.players[gs.turn] gs.abcs[gs.turn] = {'actions': 1, 'buys': 1, 'coins': 0} gs = curPlayer.playActionPhase(gs) bought = gs.stacks.copy() gs = curPlayer.playBuyPhase(gs) gs = curPlayer.playDiscardPhase(gs) gs.turn = (gs.turn + 1) % numPlayers numDepleted = len( filter(lambda c: gs.stacks[c] == 0, gs.stacks)) numMoves += 1 cards_left = [((gameType[1] - gs.pcards[i].allCards()).count, i) for i in xrange(numPlayers)] cards_left.sort() for people in cards_left: tourn[people[1]].incr(people[0]) print ''
class Driver: # Constructor function, creates new instance of class def __init__(self): # 0 additional arguments, self is self-reference pygame.init() # Renderer, handles rendering functions on behalf of the game rendererOptions = type('', (), {})() rendererOptions.width = 800 rendererOptions.height = 600 self.gameRenderer = Renderer(rendererOptions) # Renderer before GameState, since Spritesheet depends on display.set_mode # Game state object, tracks state of game and all objects in game self.gameState = GameState() # Example of tightly coupled code. # TODO: Refactor coupled code, separate dependencies self.gameRenderer.game = self.gameState # Internal variables to handle frame ticks/FPS self.clock = pygame.time.Clock() self.currentTime = 0 # Event Handler dictionaries self.keydownHandlers = defaultdict(list) self.keyupHandlers = defaultdict(list) # Event Handler function def handle_events(self): # pygame.event.get() clears the event queue, prevents crashing/freezing for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit(0) elif event.type == pygame.KEYDOWN: for handler in self.keydownHandlers[event.key]: handler(event.type) elif event.type == pygame.KEYUP: for handler in self.keyupHandlers[event.key]: handler(event.type) elif event.type == VICTORY_EVENT: font = pygame.font.SysFont("sysfont10", 48) text = font.render("VICTORY!!!", False, (255, 255, 255)) textRect = text.get_rect() textRect.center = (400, 300) self.gameRenderer.screen.blit(text, textRect) pygame.display.flip() pygame.time.wait(1500) pygame.quit() sys.exit(0) def start(self): # Initial Key Bindings # Sets actions for both key up and key down # Could also handle other events (mouse events, etc.) self.keydownHandlers[pygame.K_LEFT].append(self.gameState.action_left) self.keydownHandlers[pygame.K_RIGHT].append(self.gameState.action_right) self.keydownHandlers[pygame.K_UP].append(self.gameState.action_up) self.keydownHandlers[pygame.K_DOWN].append(self.gameState.action_down) self.keyupHandlers[pygame.K_LEFT].append(self.gameState.action_left) self.keyupHandlers[pygame.K_RIGHT].append(self.gameState.action_right) self.keyupHandlers[pygame.K_UP].append(self.gameState.action_up) self.keyupHandlers[pygame.K_DOWN].append(self.gameState.action_down) # Game Loop Start # TODO: Implement some kind of "done/not done", not infinite loop while True: # Increment time tracker with ms passed since last call self.currentTime += self.clock.get_time() # Process current event queue self.handle_events() # While enough time has passed to process at least one frame while self.currentTime >= LOOP_MS_PF: # Update the game state one tick for each frame time block self.gameState.update() # Passing in update MS diff? self.currentTime -= LOOP_MS_PF # Once game state is caught up, render the game self.gameRenderer.render() # TODO: Passing in leftover ticks for delta rendering? # self.gameRenderer.drawDebug() # TODO: Need to comment this out for live # Tracking FPS in window caption, should be for debug only fps = self.clock.get_fps() pygame.display.set_caption("FPS: {0:2f}".format(fps)) # Tell the system to wait until enough time has passed to hit the next frame self.clock.tick(TARGET_FPS)