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 ''
Example #2
0
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)
Example #3
0
    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)
Example #4
0
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 ''
Example #6
0
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)