added controller to model view controller
Some checks failed
pre-release / Pre Release (push) Waiting to run
tagged-release / Tagged Release (push) Has been cancelled

This commit is contained in:
Karma Riuk 2025-01-31 10:52:25 +01:00
parent ddfb95176b
commit ac85f3e6d3
5 changed files with 63 additions and 29 deletions

View File

@ -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")

View File

@ -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, [])

View File

@ -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()

View File

@ -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("<Button-1>", 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()

View File

@ -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