from __future__ import annotations import pygame from utilities.Board import Board from utilities.constants import GREEN, WHITE, BLUE, SQUARE_SIZE class GameManager: def __init__(self, win: pygame.display, colour: int) -> None: """ Constructor for the GameManager class :param win: The window :param colour: The colour of the player """ self._init(colour) self.win = win def _init(self, colour: int) -> None: """ Initializes the game :param colour: the colour of the player """ self.selected = None self.board = Board() self.turn = colour self.validMoves = {} self.legCount = 0 def update(self) -> None: """ Updates the GUI return: None """ self.board.draw(self.win) self.drawValidMoves(self.validMoves) pygame.display.update() def reset(self) -> None: """ Resets the game :return: None """ self._init(self.turn) def select(self, row: int, col: int) -> bool: """ Selects a piece :param row: Row of the piece :param col: Column of the piece :return: True """ if self.selected: result = self._move(row, col) if not result: self.selected = None self.select(row, col) piece = self.board.getPiece(row, col) if piece != 0 and piece.colour == self.turn: self.selected = piece self.validMoves = self.board.getValidMoves(piece) return True def _move(self, row: int, col: int) -> bool: """ Moves a piece :param row: Row of the piece :param col: Column of the piece :return: True if the move was successful, False otherwise """ piece = self.board.getPiece(row, col) if self.selected and piece == 0 and (row, col) in self.validMoves: self.board.move(self.selected, row, col) skipped = self.validMoves[row, col] if self.validMoves[list(self.validMoves.keys())[0]]: if self.validMoves[list(self.validMoves.keys())[0]][0].king: self.selected.makeKing() if skipped: self.board.remove(skipped) if len(self.validMoves) > 1: del self.validMoves[list(self.validMoves.keys())[0]] else: self.changeTurn() else: self.changeTurn() else: return False return True def changeTurn(self): self.validMoves = {} if self.turn == GREEN: self.turn = WHITE return self.turn = GREEN def drawValidMoves(self, moves: list) -> None: """ Draws the valid moves :param moves: list of valid moves :return: None """ for row, col in moves: pygame.draw.circle(self.win, BLUE, (col * SQUARE_SIZE + SQUARE_SIZE // 2, row * SQUARE_SIZE + SQUARE_SIZE // 2), 15) def winner(self) -> int or None: """ Gets the winner :return: The winner """ return self.board.winner() def getBoard(self) -> Board: """ Gets the board :return: The board """ return self.board def aiMove(self, board: Board) -> None: """ Makes a move for the AI :param board: The new board :return: None """ if board is None: # colour = "green" if self.turn == GREEN else "white" # print("no move left for " + colour + " to make") self.changeTurn() return self.board = board self.changeTurn()