Ejemplo n.º 1
0
def tactic_push_forward(board, player):
    modifier = player_modifier(player)
    result = 0

    player_checkers = 0
    enemy_checkers = 0
    push_forward = 0

    for i, k in enumerate(board):
        if player_from_number(k) == player:
            push_forward += ((26 + modifier * i) % 26) * k / 28
            player_checkers += k
        elif player_from_number(k) == enemy(player):
            enemy_checkers += k
            push_forward -= ((26 + modifier * i) % 26) * k / 28

    push_forward -= player_checkers + enemy_checkers

    result += push_forward

    return result / 15
Ejemplo n.º 2
0
    def maximize(self, board, level=0, previous_value=None):
        modifier = 1 if level % 2 == 0 else -1
        if level == self.levels:
            return self.evaluate(board)

        result = 0
        for dices in it.combinations_with_replacement(range(1, 7), 2):
            multiplier = 1/36 if dices[0] == dices[1] else 1/18
            max_value = modifier * -2**31

            for _, possible_board in available_moves(board, dices,
                    player_from_number(modifier)):
                possible_board_value = self.maximize(possible_board, level+1,
                        max_value)
                if modifier * max_value < modifier * possible_board_value:
                    max_value = possible_board_value

                if previous_value is not None \
                        and modifier * max_value <= modifier * previous_value:
                    return max_value

            result += modifier * multiplier * max_value

        return result
Ejemplo n.º 3
0
def main(white=None, black=None, *args, **kwargs):
    pygame.init()

    screen = pygame.display.set_mode(BOARD_SIZE)
    clock = pygame.time.Clock()

    pygame.display.set_caption(WINDOW_TITLE)

    board = pygame.transform.scale(images.load_image('board.png'), BOARD_SIZE)
    checker = {
        'w': pygame.transform.scale(images.load_image('checker_white.png'),
                                    CHECKER_SIZE),
        'b': pygame.transform.scale(images.load_image('checker_black.png'),
                                    CHECKER_SIZE),
    }

    game = Game()
    human_players = {}
    bots = []

    if white is None:
        human_players['w'] = game.get_player('w')
    else:
        bots.append(white(game.get_player('w')))

    if black is None:
        human_players['b'] = game.get_player('b')
    else:
        bots.append(black(game.get_player('b')))

    is_running = True

    active_dice = 0
    active_dice_text_pos = None

    game.set_changed()
    game.notify_observers()

    while is_running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                is_running = False
            elif event.type == pygame.MOUSEBUTTONDOWN:
                x, y = event.pos

                # human move
                if game.active_player in human_players:
                    if active_dice_text_pos is not None \
                            and active_dice_text_pos.collidepoint((x, y)):
                        active_dice = (active_dice + 1) % len(game.dice)

                    for i, (field_x, field_y) in enumerate(FIELD_COORD):
                        field_size = FIELD_SIZE[i]
                        left = field_x
                        right = field_x + field_size[0]
                        if FIELD_SHIFT[i][1] > 0:
                            top = field_y
                            bottom = top + field_size[1]
                        else:
                            bottom = field_y + CHECKER_SIZE[1]
                            top = bottom - field_size[1]
                        if left < x < right and top < y < bottom:
                            try:
                                human_players[game.active_player].move(i,
                                    game.dice[active_dice])
                            except Game.LogicError as e:
                                log.info(e)
                            active_dice = min(active_dice, len(game.dice)-1)
                            break

        # print board
        screen.blit(board, (0, 0))

        # print checkers
        for i, row in enumerate(game.board):
            color = player_from_number(row)
            for count in range(abs(row)):
                screen.blit(checker[color], sum_by_index(FIELD_COORD[i],
                            multiply_by_value(FIELD_SHIFT[i], count)))

        # print dices
        font = pygame.font.Font(None, 36)
        dice_text = font.render(str(game.dice), 1, (255, 255, 255))
        dice_text_pos = dice_text.get_rect()
        dice_text_pos.centerx = screen.get_rect().centerx
        dice_text_pos.centery = screen.get_rect().centery
        screen.blit(dice_text, dice_text_pos)

        # print active dice
        font = pygame.font.Font(None, 36)
        dice = game.dice
        active_dice_text = font.render('-> {} <-'.format(
                    dice[active_dice] if dice else ""), 1, (255, 255, 255))
        active_dice_text_pos = active_dice_text.get_rect()
        active_dice_text_pos.centerx = dice_text_pos.centerx
        active_dice_text_pos.midtop = dice_text_pos.midbottom
        screen.blit(active_dice_text, active_dice_text_pos)

        # print active player
        font = pygame.font.Font(None, 36)
        player_text = font.render(str(game.active_player), 1, (255, 255, 255))
        player_text_pos = player_text.get_rect()
        player_text_pos.topright = screen.get_rect().topright
        screen.blit(player_text, player_text_pos)

        pygame.display.flip()
        clock.tick(60)

    pygame.quit()