Compare commits

..

No commits in common. "ac85f3e6d3955a59aa8ba64eaafd6f9497078240" and "bb0a3266c7b44507ee8798120b1e287105337858" have entirely different histories.

6 changed files with 29 additions and 64 deletions

View File

@ -1,13 +0,0 @@
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

@ -1,20 +0,0 @@
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,4 +1,3 @@
from logic.move import Move
from .piece import Piece from .piece import Piece
class Queen(Piece): class Queen(Piece):

View File

@ -1,4 +1,3 @@
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
@ -7,8 +6,6 @@ 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() view = GUI(board)
controller = GuiController(board, view)
view.show() view.show()

View File

@ -1,14 +1,13 @@
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) -> None: def __init__(self, board: Board) -> None:
super().__init__() super().__init__(board)
self.root = tk.Tk() self.root = tk.Tk()
self.root.title("Chess Board") self.root.title("Chess Board")
@ -19,26 +18,20 @@ 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
self._controller.on_tile_selected(x, y) def _draw_chess_board(self):
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 selected_piece is not None: if self.state["selected_piece"]:
possible_positions = [move.pos for move in legal_moves] possible_positions = [move.pos for move in self.state["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
@ -51,7 +44,7 @@ class GUI(View):
outline=colour, outline=colour,
) )
piece = board.piece_at(x, 7-y) piece = self.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"
@ -82,6 +75,23 @@ 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,18 +1,10 @@
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) -> None: def __init__(self, board: Board) -> None:
self._controller: "Controller" = None self.board: Board = board
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