Exemple #1
0
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
Exemple #2
0
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