Compare commits
3 Commits
f7c0dcbd4b
...
51648a5960
Author | SHA1 | Date | |
---|---|---|---|
|
51648a5960 | ||
|
331c475c2a | ||
|
28ef132944 |
@ -2,8 +2,8 @@ from logic.position import Position
|
|||||||
|
|
||||||
|
|
||||||
class Piece:
|
class Piece:
|
||||||
WHITE = 0
|
WHITE = "white"
|
||||||
BLACK = 1
|
BLACK = "black"
|
||||||
|
|
||||||
def __init__(self, pos, colour) -> None:
|
def __init__(self, pos, colour) -> None:
|
||||||
self.pos = pos
|
self.pos = pos
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
from logic.board import create_board
|
from logic.board import create_board
|
||||||
|
from view.gui import GUI
|
||||||
from view.tui import TUI
|
from view.tui import TUI
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
board = create_board()
|
board = create_board()
|
||||||
|
|
||||||
view = TUI(board)
|
view = GUI(board)
|
||||||
|
|
||||||
view.show()
|
view.show()
|
||||||
|
94
src/view/gui.py
Normal file
94
src/view/gui.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
from logic.board import Board
|
||||||
|
from logic.pieces.piece import Piece
|
||||||
|
from logic.position import Position
|
||||||
|
from view.view import View
|
||||||
|
|
||||||
|
class GUI(View):
|
||||||
|
def __init__(self, board: Board) -> None:
|
||||||
|
super().__init__(board)
|
||||||
|
|
||||||
|
self.root = tk.Tk()
|
||||||
|
self.root.title("Chess Board")
|
||||||
|
|
||||||
|
self.tile_size = 80
|
||||||
|
board_size = self.tile_size * 8
|
||||||
|
|
||||||
|
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 _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 self.state["selected_piece"] and Position(x, 7-y) in self.state["legal_moves"]:
|
||||||
|
colour = "#ADD8E6" # Highlight legal moves
|
||||||
|
|
||||||
|
self.canvas.create_rectangle(
|
||||||
|
x * self.tile_size,
|
||||||
|
y * self.tile_size,
|
||||||
|
(x + 1) * self.tile_size,
|
||||||
|
(y + 1) * self.tile_size,
|
||||||
|
fill=colour
|
||||||
|
)
|
||||||
|
|
||||||
|
piece = self.board.piece_at(x, 7-y)
|
||||||
|
|
||||||
|
if piece:
|
||||||
|
text_colour = "white" if piece.colour == Piece.WHITE else "black"
|
||||||
|
self.canvas.create_text(
|
||||||
|
(x + 0.5) * self.tile_size,
|
||||||
|
(y + 0.5) * self.tile_size,
|
||||||
|
text=piece.__class__.__name__[0],
|
||||||
|
fill=text_colour,
|
||||||
|
font=("Arial", 32, "bold")
|
||||||
|
)
|
||||||
|
|
||||||
|
# Cell annotations
|
||||||
|
text_colour = colours[(x + y + 1) % 2] # the other colour
|
||||||
|
|
||||||
|
if x == 0: # numbers in the top left of the first column
|
||||||
|
self.canvas.create_text(
|
||||||
|
(x + 0.15) * self.tile_size,
|
||||||
|
(y + 0.15) * self.tile_size,
|
||||||
|
text=8-y,
|
||||||
|
fill=text_colour,
|
||||||
|
font=("Arial", 10, "bold")
|
||||||
|
)
|
||||||
|
if y == 7: # numbers in the top left of the first column
|
||||||
|
self.canvas.create_text(
|
||||||
|
(x + 0.85) * self.tile_size,
|
||||||
|
(y + 0.85) * self.tile_size,
|
||||||
|
text="abcdefgh"[x],
|
||||||
|
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()
|
Loading…
x
Reference in New Issue
Block a user