def test_getitem_square_reversed_stepped_on_y_grouped(): my_board_renderer = BoardRenderer(tile_w=2) board = Board(12, 13, default_renderer=my_board_renderer) for group_index, column in enumerate(board[9:2:-3, 11:3:-2, "y"].group_by_subcoord()): for index, tile in enumerate(column): tile.data = chr(group_index + ord("A")) + str(index) render_result = """ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C3. . B3. . A3. . . . . . . . . . . . . . . . . C2. . B2. . A2. . . . . . . . . . . . . . . . . C1. . B1. . A1. . . . . . . . . . . . . . . . . C0. . B0. . A0. . . . . . . . . . . . . . """ print(board.render()) assert strip_multiline(board.render()) == strip_multiline(render_result)
def test_both_coord_changed_render(): positions = [(0, 0), (0, 2), (2, 2), (1, 1), (1, 0), (3, 3), (0, 3)] my_board_renderer = BoardRenderer(tile_w=2, tile_padding_w=1, tile_padding_h=1, chr_fill_tile=".") board = Board(4, 5, default_renderer=my_board_renderer) board_iter_positions = BoardIteratorPositions(board, positions) for index, tile in enumerate(board_iter_positions): DICT_MARKERS = {False: "_", True: "B"} both_coord_marker = DICT_MARKERS[ board_iter_positions.both_coord_changed] tile.data = str(index) + both_coord_marker # Pour la toute première itération, both_coord_changed est à True. # On considère que le curseur passe de (rien, rien) à (0, 0), et que les deux coords changent. render_result = """ 0B 4_ .. .. .. 3B .. .. 1_ .. 2_ .. 6_ .. .. 5B .. .. .. .. """ assert strip_multiline(board.render()) == strip_multiline(render_result)
def test_both_coord_changed(): my_board_renderer = BoardRenderer(tile_w=2, tile_padding_w=1, tile_padding_h=1, chr_fill_tile=".") board = Board(2, 4, default_renderer=my_board_renderer) board_iter_rect = BoardIteratorRect(board) DICT_MARKERS = {False: "_", True: "B"} for index, tile in enumerate(board_iter_rect): both_coord_marker = DICT_MARKERS[board_iter_rect.both_coord_changed] tile.data = str(index) + both_coord_marker render_result = """ 0B 1_ 2B 3_ 4B 5_ 6B 7_ """ assert strip_multiline(board.render()) == strip_multiline(render_result)
def __init__(self, screen_size=(1280,720), tile_pad=10): pygame.init() self._screen_size = screen_size self._screen = pygame.display.set_mode(self._screen_size, 1) self._scroll_window = 30 self._clock = pygame.time.Clock() self._tile_pad=tile_pad self._board_renderer = \ BoardRenderer(self) self._move_renderer = \ MoveRenderer(self) self._font_manager = \ FontManager(self) self._pan_manager = None pygame.mouse.set_visible(True)
def __init__( self, w=1, h=1, class_tile=Tile, default_renderer=BoardRenderer(), class_adjacency=None, ): self.w = w self.h = h self._default_renderer = default_renderer self.class_adjacency = (class_adjacency if class_adjacency is not None else get_default_adjacency()) self.adjacency = self.class_adjacency(self) self.is_adjacent = self.adjacency.is_adjacent self._tiles = [[class_tile(x, y, self) for x in range(w)] for y in range(h)]
def test_jump_and_dir_change_render(): positions = [(1, 2), (1, 3), (1, 4), (2, 4), (3, 4), (5, 4), (6, 4), (8, 1)] my_board_renderer = BoardRenderer(tile_w=2, tile_padding_w=1, tile_padding_h=1, chr_fill_tile=".") board = Board(10, 6, default_renderer=my_board_renderer) board_iter_positions = BoardIteratorPositions(board, positions) for index, tile in enumerate(board_iter_positions): DICT_JUMP_DIR = { (False, False): "_", (True, False): "J", (False, True): "D", (True, True): "X", } jump_dir_marker = DICT_JUMP_DIR[( board_iter_positions.jumped, board_iter_positions.changed_direction)] tile.data = str(index) + jump_dir_marker render_result = """ .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 7X .. .. 0J .. .. .. .. .. .. .. .. .. 1_ .. .. .. .. .. .. .. .. .. 2_ 3D 4_ .. 5J 6_ .. .. .. .. .. .. .. .. .. .. .. .. .. """ assert strip_multiline(board.render()) == strip_multiline(render_result)
# Get an integer from standard input and return it # If a non-integer value is entered, continue to prompt the user def integer_input(str_prompt): while True: try: return int(input(str_prompt)) except ValueError: print("Please enter a valid integer") continue if __name__ == "__main__": terminal = blessings.Terminal() # Create a new game of Catan game = Game() # Set up board to render br = BoardRenderer(board=game.board, center=[math.floor(terminal.width / 2), math.floor(terminal.height / 2 - 1)]) # Draw the board br.render() # Starting phase # Twice for each player for p in game.players + list(reversed(game.players)): # Render the board br.render() # Place a free settlement with terminal.location(0, terminal.height - 1): # Prompt the player for input print("Player %s, it is your turn" % p.num) while True: # Get the row row = integer_input("Enter the row you want to place the settlement: ") # Get the index
def test_find_path_roads(): # Test ajouté suite à un bug trouvé lors du challenge CodinGame "XMas Rush". set_default_adjacency(AdjacencyEvaluatorCross) renderer = BoardRenderer( tile_w=3, tile_h=3, tile_padding_w=1, tile_padding_h=1, chr_fill_tile_padding=".", ) board = Board(7, 7, class_tile=XmasTile, default_renderer=renderer) definition_roads = ( (0, 3, "1010"), (0, 2, "1010"), (0, 1, "0111"), (1, 1, "1111"), (2, 1, "0011"), (1, 0, "0110"), (2, 0, "0101"), ) for x, y, input_def_roads in definition_roads: board[x, y].dirs_from_input(input_def_roads) for index, tile in enumerate( BoardIteratorFindPath(board, (0, 3), (2, 0), pass_through_xmas)): tile.mid_marker = str(index) print(board.render()) render_result = """ . . . . . . . 4-.-5-. . . . . | . . . . . ........................... . | . . . . . -2-.-3-.- . . . . | . | . | . . . . ........................... | . . . . . . 1 . . . . . . | . . . . . . ........................... | . . . . . . 0 . . . . . . | . . . . . . ........................... . . . . . . . . . . . . . . . . . . ........................... . . . . . . . . . . . . . . . . . . ........................... . . . . . . . . . . . . . . . . . . """ assert strip_multiline(board.render()) == strip_multiline(render_result)
class MasterRenderer: def __init__(self, screen_size=(1280,720), tile_pad=10): pygame.init() self._screen_size = screen_size self._screen = pygame.display.set_mode(self._screen_size, 1) self._scroll_window = 30 self._clock = pygame.time.Clock() self._tile_pad=tile_pad self._board_renderer = \ BoardRenderer(self) self._move_renderer = \ MoveRenderer(self) self._font_manager = \ FontManager(self) self._pan_manager = None pygame.mouse.set_visible(True) def load_game(self, game): self._game = game board = game.board self._board_renderer.load_board(board) self._pan_manager = PanManager(self) self._move_renderer.reset() def process_events(self): events = pygame.event.get() #if self._look_renderer.has_focus(): # self._look_renderer.process_events(events) #elif self._init_renderer.has_focus(): # self._init_renderer.process_events(events) #elif self._move_renderer.has_focus(): # self._move_renderer.process_events(events) #elif self._fire_renderer.has_focus(): # self._fir_renderer.process_events(events) for event in events: if event.type == pygame.QUIT: exit(0) self._move_renderer.process_events(events) #mouse_pos = pygame.mouse.get_pos() #if mouse_pos[0] < self._scroll_window: # self._pan_manager.scroll_left() #if mouse_pos[1] < self._scroll_window: # self._pan_manager.scroll_up() #if mouse_pos[0] > (self._screen_size[0] - self._scroll_window - 1): # self._pan_manager.scroll_right() #if mouse_pos[1] > (self._screen_size[1] - self._scroll_window - 1): # self._pan_manager.scroll_down() def render(self): """ Render the whole game. """ self._clock.tick() pygame.display.set_caption("FPS %.2f" % self._clock.get_fps()) self._pan_manager.update_pan() self._board_renderer.render_board() self._move_renderer.render() # self._message_renderer.render_messages(pan) pygame.display.flip() ### --------------------------------------------------- ### EXTERNAL PROPERTY ACCESS ### --------------------------------------------------- @property def hex_rad(self): return self._game.hex_rad @property def tile_pad(self): return self._tile_pad @property def screen_size(self): return self._screen_size @property def screen(self): return self._screen @property def game(self): return self._game @property def board_renderer(self): return self._board_renderer @property def move_renderer(self): return self._move_renderer @property def pan_manager(self): return self._pan_manager @property def font_manager(self): return self._font_manager