class Board(QWidget): # pylint: disable=R0903 """The board widge""" def __init__(self, board_size: int = 4) -> None: """ Creates a 2048 board Args: board (Table[Table[int]]) = The 2048 game board Returns (QtWidgets.QWidget) = The game board as qt widget """ super().__init__() self.board = QGridLayout(self) self.board_size = 100 self._font_size = round(self.board_size / 5) self._default_bg_color = COLORSET_2[0] self._default_color = "#" + contrasting_text_color( self._default_bg_color[1:]) self.__create_cells(board_size) @Slot(MoveResult) def update_cells(self, move_result: MoveResult) -> None: """update the cells with the new board data""" for y_position, row in enumerate(move_result["board"]): for x_position, value in enumerate(row): cell = self.board.itemAtPosition(y_position, x_position).widget() self._update_cell(cell, value) def _update_cell(self, cell: QWidget, value: int): cell_label = cell.findChild(QLabel) cell_text = str(value).strip("0") cell_label.setText(cell_text) bg_color = COLORSET_2[ value] if value in COLORSET_2 else self._default_bg_color font_color = "#" + contrasting_text_color(bg_color[1:]) cell.setStyleSheet(f"background-color:{bg_color}; color:{font_color};") def __create_cells(self, board_size: int): size_range = range(board_size) for y_position in size_range: for x_position in size_range: cell = self.__create_cell() self.board.addWidget(cell, y_position, x_position, Qt.AlignCenter) def __create_cell(self) -> QWidget: cell_label = QLabel() cell_label.setAlignment(Qt.AlignCenter) cell_label.setStyleSheet("QLabel {font-size: " + str(self._font_size) + "px;}") cell_content = QHBoxLayout() cell_content.addWidget(cell_label) cell = QWidget() cell.setLayout(cell_content) cell.setStyleSheet( f"background-color:{self._default_bg_color}; color:{self._default_color};" ) cell.setFixedSize(self.board_size, self.board_size) return cell
class GameWindow(QtWidgets.QWidget): grid: QGridLayout label: QLabel game_state: GameState def __init__(self, is_server: bool): super().__init__() self.is_server = is_server self.game_state = GameState(GAME_SZIE, self._refresh_ui) self._init_window() self._init_ui() self.game_state.setup_multiplayer_connection(is_server) def _init_window(self): self.resize(800, 800) if self.is_server == None: postfix = "single player" else: if self.is_server: postfix = "multi player (server)" else: postfix = "multi player (client)" self.setWindowTitle(f"Multiplayer Tic Tac Teo - {postfix}") self.show() def _init_ui(self): hbox = QVBoxLayout() self.setLayout(hbox) self.label = QLabel() self.label.setText(f"Turn {self.game_state.turn.value}") f: QtGui.QFont = self.label.font() f.setPixelSize(50) self.label.setFont(f) hbox.addWidget(self.label, alignment=Qt.AlignCenter) self.grid = QGridLayout() hbox.addLayout(self.grid) for y in range(0, GAME_SZIE): for x in range(0, GAME_SZIE): button = QPushButton() button.setText(self.game_state.get(x, y).value) f: QtGui.QFont = button.font() f.setPixelSize(50) button.setFont(f) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) button.clicked.connect( self.get_tile_clicked_listener(button, x, y)) self.grid.addWidget(button, y, x) def _get_button_at(self, x, y) -> QPushButton: return self.grid.itemAtPosition(y, x).widget() def _refresh_ui(self): self.label.setText(f"Turn {self.game_state.turn.value}") for y in range(0, GAME_SZIE): for x in range(0, GAME_SZIE): txt = self.game_state.get(x, y).value self._get_button_at(x, y).setText(txt) winner = self.game_state.winner if winner: msgBox = QMessageBox() if winner == TileState.EMPTY: msgBox.setText(f"Tie") else: msgBox.setText(f"Winner is {winner.value}") msgBox.exec() self.game_state.new_game() def get_tile_clicked_listener(self, button: QPushButton, x: int, y: int): def click_action(): if self.game_state.user_tile_type == self.game_state.turn: self.game_state.set(x, y, self.game_state.user_tile_type) return click_action