Esempio n. 1
0
class CodenamesSolverApp(object):
    def __init__(self, data_dir):
        self.jinja_env = Environment(
            loader=PackageLoader('webserver', 'templates'))
        self.solver = Solver(data_dir, 100000)
        self.game_words = self.solver.filter_in_vocab(load_game_words())

    @staticmethod
    def create_board():
        board = Board(n_p1=9, n_p2=8, n_neutral=7, n_assassin=1)
        cherrypy.session['board'] = board
        return board

    @staticmethod
    def get_board():
        try:
            return cherrypy.session['board']
        except KeyError:
            raise cherrypy.HTTPRedirect('/')

    @cherrypy.expose
    def index(self):
        tmpl = self.jinja_env.get_template('setup.html')
        board = self.create_board()
        return tmpl.render(words=self.game_words,
                           p1=board.get_html_names(PLAYER1),
                           p2=board.get_html_names(PLAYER2),
                           neutral=board.get_html_names(NEUTRAL),
                           assassin=board.get_html_names(ASSASSIN))

    @cherrypy.expose
    def display(self):
        board = self.get_board()
        tmpl = self.jinja_env.get_template('board.html')
        return tmpl.render(p1=board.get_filtered_words(PLAYER1),
                           p2=board.get_filtered_words(PLAYER2),
                           neutral=board.get_filtered_words(NEUTRAL),
                           assassin=board.get_filtered_words(ASSASSIN),
                           current=board.get_current_player())

    @cherrypy.expose
    def start(self, **kwargs):
        board = self.get_board()
        for player in [PLAYER1, PLAYER2, NEUTRAL, ASSASSIN]:
            board.set_words(player,
                            {kwargs[x]
                             for x in board.get_html_names(player)})
        board.reset_game()
        raise cherrypy.HTTPRedirect('/display/')

    @cherrypy.expose
    def random(self):
        board = self.get_board()
        board.generate_random_setup(self.game_words)
        board.reset_game()
        raise cherrypy.HTTPRedirect('/display/')

    @cherrypy.expose
    def turn(self, **kwargs):
        board = self.get_board()
        for key, item in kwargs.items():
            if isinstance(item, list):
                board.set_words(COVERED, board.get_words(COVERED) | set(item))
            else:
                board.set_words(COVERED, board.get_words(COVERED) | {item})
        board.next_turn()
        raise cherrypy.HTTPRedirect('/display/')

    @cherrypy.expose
    def solve(self):
        board = self.get_board()
        suggested_moves = self.solver.solve(
            num_results=5,
            words={
                solver.names.PLAYER: list(board.get_player_words()),
                solver.names.OPPONENT: list(board.get_opponent_words()),
                solver.names.NEUTRAL: list(board.get_words(NEUTRAL)),
                solver.names.ASSASSIN: list(board.get_words(ASSASSIN)),
                solver.names.COVERED: list(board.get_words(COVERED))
            })

        tmpl = self.jinja_env.get_template('suggestions.html')
        return tmpl.render(suggestions=suggested_moves)