diff --git a/src/controller/controller.py b/src/controller/controller.py new file mode 100644 index 0000000..739a00a --- /dev/null +++ b/src/controller/controller.py @@ -0,0 +1,13 @@ +from logic.board import Board +from view.view import View + + +class Controller: + def __init__(self, board: Board, view: View) -> None: + self._board = board + self._view = view + + self._view.set_controller(self) + + def on_tile_selected(self, x: int, y: int) -> None: + raise NotImplementedError(f"Cannot handle tile selected event, {type(self).__name__} did not implement it") diff --git a/src/controller/gui_controller.py b/src/controller/gui_controller.py new file mode 100644 index 0000000..953e53b --- /dev/null +++ b/src/controller/gui_controller.py @@ -0,0 +1,20 @@ +from logic.board import Board +from view.view import View +from .controller import Controller + + +class GuiController(Controller): + def __init__(self, board: Board, view: View) -> None: + super().__init__(board, view) + self._view.update_board(self._board, None, []) + + def on_tile_selected(self, x: int, y: int) -> None: + piece = self._board.piece_at(x, y) + print(f"Clicked on {x, y}, {piece = }") + + if piece: + self._view.update_board(self._board, piece, piece.legal_moves(self._board)) + else: + self._view.update_board(self._board, None, []) + + diff --git a/src/main.py b/src/main.py index 1c150a3..3610b3c 100644 --- a/src/main.py +++ b/src/main.py @@ -1,3 +1,4 @@ +from controller.gui_controller import GuiController from logic.board import Board from view.gui import GUI from view.tui import TUI @@ -6,6 +7,8 @@ if __name__ == "__main__": initial_board_position = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1" board = Board.setup_FEN_position(initial_board_position) - view = GUI(board) + view = GUI() + + controller = GuiController(board, view) view.show() diff --git a/src/view/gui.py b/src/view/gui.py index da3849a..5c6855d 100644 --- a/src/view/gui.py +++ b/src/view/gui.py @@ -1,13 +1,14 @@ import tkinter as tk from logic.board import Board +from logic.move import Move from logic.pieces.piece import Colour, Piece from logic.position import Position from view.view import View class GUI(View): - def __init__(self, board: Board) -> None: - super().__init__(board) + def __init__(self) -> None: + super().__init__() self.root = tk.Tk() self.root.title("Chess Board") @@ -18,20 +19,26 @@ class GUI(View): self.canvas = tk.Canvas(self.root, width=board_size, height=board_size) self.canvas.pack() - self.state = {"selected_piece": None, "legal_moves": []} - self.canvas.bind("", self._on_canvas_click) - self._draw_chess_board() + def _on_canvas_click(self, event): + x, y = event.x // self.tile_size, event.y // self.tile_size + y = 7 - y - def _draw_chess_board(self): + self._controller.on_tile_selected(x, y) + + def update_board(self, board: Board, selected_piece: Piece, legal_moves: list[Move]) -> None: + self.canvas.delete("all") + self._draw_chess_board(board, selected_piece, legal_moves) + + def _draw_chess_board(self, board, selected_piece = None, legal_moves = []): colours = ["#F0D9B5", "#B58863"] # Light and dark squares for y in range(8): for x in range(8): colour = colours[(x + y) % 2] - if self.state["selected_piece"]: - possible_positions = [move.pos for move in self.state["legal_moves"]] + if selected_piece is not None: + possible_positions = [move.pos for move in legal_moves] if Position(x, 7-y) in possible_positions: colour = "#ADD8E6" # Highlight legal moves @@ -44,7 +51,7 @@ class GUI(View): outline=colour, ) - piece = self.board.piece_at(x, 7-y) + piece = board.piece_at(x, 7-y) if piece: text_colour = "white" if piece.colour == Colour.WHITE else "black" @@ -75,23 +82,6 @@ class GUI(View): fill=text_colour, font=("Arial", 10, "bold") ) - - - def _on_canvas_click(self, event): - x, y = event.x // self.tile_size, event.y // self.tile_size - y = 7 - y - piece = self.board.piece_at(x, y) - print(f"Clicked on {x, y}, {piece = }") - - if piece: - self.state["selected_piece"] = piece - self.state["legal_moves"] = piece.legal_moves(self.board) - else: - self.state["selected_piece"] = None - self.state["legal_moves"] = [] - - self.canvas.delete("all") - self._draw_chess_board() def show(self) -> None: self.root.mainloop() diff --git a/src/view/view.py b/src/view/view.py index 840245e..8c1d357 100644 --- a/src/view/view.py +++ b/src/view/view.py @@ -1,10 +1,18 @@ from logic.board import Board +from logic.move import Move +from logic.pieces.piece import Piece class View: - def __init__(self, board: Board) -> None: - self.board: Board = board + def __init__(self) -> None: + self._controller: "Controller" = None def show(self) -> None: raise NotImplementedError(f"Can't show the board, the show() method of {type(self)} is not implemented") + def update_board(self, board: Board, selected_piece: Piece, legal_moves: list[Move]) -> None: + raise NotImplementedError(f"Can't update the board, the update_board() method of {type(self)} is not implemented") + + def set_controller(self, controller: "Controller") -> None: + self._controller = controller +