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
class Queen(Piece):

View File

@ -1,4 +1,3 @@
from controller.gui_controller import GuiController
from logic.board import Board
from view.gui import GUI
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"
board = Board.setup_FEN_position(initial_board_position)
view = GUI()
controller = GuiController(board, view)
view = GUI(board)
view.show()

View File

@ -1,14 +1,13 @@
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) -> None:
super().__init__()
def __init__(self, board: Board) -> None:
super().__init__(board)
self.root = tk.Tk()
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.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
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 = []):
def _draw_chess_board(self):
colours = ["#F0D9B5", "#B58863"] # Light and dark squares
for y in range(8):
for x in range(8):
colour = colours[(x + y) % 2]
if selected_piece is not None:
possible_positions = [move.pos for move in legal_moves]
if self.state["selected_piece"]:
possible_positions = [move.pos for move in self.state["legal_moves"]]
if Position(x, 7-y) in possible_positions:
colour = "#ADD8E6" # Highlight legal moves
@ -51,7 +44,7 @@ class GUI(View):
outline=colour,
)
piece = board.piece_at(x, 7-y)
piece = self.board.piece_at(x, 7-y)
if piece:
text_colour = "white" if piece.colour == Colour.WHITE else "black"
@ -82,6 +75,23 @@ 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,18 +1,10 @@
from logic.board import Board
from logic.move import Move
from logic.pieces.piece import Piece
class View:
def __init__(self) -> None:
self._controller: "Controller" = None
def __init__(self, board: Board) -> None:
self.board: Board = board
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