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 logic.board import Board
from view.gui import GUI from view.gui import GUI
from view.tui import TUI 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" initial_board_position = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
board = Board.setup_FEN_position(initial_board_position) board = Board.setup_FEN_position(initial_board_position)
view = GUI(board) view = GUI()
controller = GuiController(board, view)
view.show() view.show()

View File

@ -1,13 +1,14 @@
import tkinter as tk import tkinter as tk
from logic.board import Board from logic.board import Board
from logic.move import Move
from logic.pieces.piece import Colour, Piece from logic.pieces.piece import Colour, Piece
from logic.position import Position from logic.position import Position
from view.view import View from view.view import View
class GUI(View): class GUI(View):
def __init__(self, board: Board) -> None: def __init__(self) -> None:
super().__init__(board) super().__init__()
self.root = tk.Tk() self.root = tk.Tk()
self.root.title("Chess Board") 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 = tk.Canvas(self.root, width=board_size, height=board_size)
self.canvas.pack() self.canvas.pack()
self.state = {"selected_piece": None, "legal_moves": []}
self.canvas.bind("<Button-1>", self._on_canvas_click) 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 colours = ["#F0D9B5", "#B58863"] # Light and dark squares
for y in range(8): for y in range(8):
for x in range(8): for x in range(8):
colour = colours[(x + y) % 2] colour = colours[(x + y) % 2]
if self.state["selected_piece"]: if selected_piece is not None:
possible_positions = [move.pos for move in self.state["legal_moves"]] possible_positions = [move.pos for move in legal_moves]
if Position(x, 7-y) in possible_positions: if Position(x, 7-y) in possible_positions:
colour = "#ADD8E6" # Highlight legal moves colour = "#ADD8E6" # Highlight legal moves
@ -44,7 +51,7 @@ class GUI(View):
outline=colour, outline=colour,
) )
piece = self.board.piece_at(x, 7-y) piece = board.piece_at(x, 7-y)
if piece: if piece:
text_colour = "white" if piece.colour == Colour.WHITE else "black" text_colour = "white" if piece.colour == Colour.WHITE else "black"
@ -75,23 +82,6 @@ class GUI(View):
fill=text_colour, fill=text_colour,
font=("Arial", 10, "bold") 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: def show(self) -> None:
self.root.mainloop() self.root.mainloop()

View File

@ -1,10 +1,18 @@
from logic.board import Board from logic.board import Board
from logic.move import Move
from logic.pieces.piece import Piece
class View: class View:
def __init__(self, board: Board) -> None: def __init__(self) -> None:
self.board: Board = board self._controller: "Controller" = None
def show(self) -> None: def show(self) -> None:
raise NotImplementedError(f"Can't show the board, the show() method of {type(self)} is not implemented") 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