diff --git a/.breakpoints b/.breakpoints deleted file mode 100644 index 77359743..00000000 --- a/.breakpoints +++ /dev/null @@ -1,12 +0,0 @@ -{ - "files": { - "report.tex": [ - { - "id": "a2e5af68-47fa-4920-aea5-ea9002a21051", - "line": 1, - "version": 8, - "index": 0 - } - ] - } -} \ No newline at end of file diff --git a/lab2/main.py b/lab2/main.py index e69de29b..3dc9263b 100644 --- a/lab2/main.py +++ b/lab2/main.py @@ -0,0 +1,201 @@ +""" +Program that plays draughts (checkers) with user on 8x8 board using min-max with alpha-beta prunning +""" + +class Game: + """Game""" + + def __init__(self, size): + self.board_size = size + self.white_positions = self.initialize_white() + self.black_positions = self.initialize_black() + print(self.white_positions) + print(self.black_positions) + self.check_move_piece_capable(1, 0, 1, 0, True) + + def initialize_white(self): + white_positions = [] + for y_coordinate in range(3): + for x_coordinate in range(self.board_size): + if y_coordinate % 2 == 0: + if x_coordinate % 2 == 1: + white_positions.append((x_coordinate, y_coordinate, False)) + else: + if x_coordinate % 2 == 0: + white_positions.append((x_coordinate, y_coordinate, False)) + return white_positions + + def initialize_black(self): + black_positions = [] + for y_coordinate in range(self.board_size - 3, self.board_size): + for x_coordinate in range(self.board_size): + if y_coordinate % 2 == 0: + if x_coordinate % 2 == 1: + black_positions.append((x_coordinate, y_coordinate, False)) + else: + if x_coordinate % 2 == 0: + black_positions.append((x_coordinate, y_coordinate, False)) + return black_positions + + def print_move_info(self, piece_x_coord, piece_y_coord, x_final, y_final): + print("(piece_x_coordinate, piece_y_coordinate): " + (piece_x_coord, piece_y_coord)) + print("(x_final_coordinate, y_final_coordinate): " + (x_final, y_final)) + + def check_move_out_of_bounds(self, piece_x_coord, piece_y_coord, x_final, y_final): + error = False + if x_final < 0: + print("Illegal move! final x coordinate can't be below 0!") + print_move_info(piece_x_coord, piece_y_coord, x_final, y_final) + error = True + if (x_final > self.board_size): + print(f"Illegal move! final x coordinate can't be above board size! board_size: ${self.board_size}") + print_move_info(piece_x_coord, piece_y_coord, x_final, y_final) + error = True + if y_final < 0: + print("Illegal move! final y coordinate can't be below 0!") + print_move_info(piece_x_coord, piece_y_coord, x_final, y_final) + error = True + if (y_final > self.board_size): + print(f"Illegal move! final y coordinate can't be above board size! board_size: ${self.size}") + print_move_info(piece_x_coord, piece_y_coord, x_final, y_final) + error = True + return error + + def check_spot_taken(self, piece_x_coord, piece_y_coord, x_final, y_final, player_color): + error = False + if player_color: + if (x_final, y_final) in self.white_positions or (x_final, y_final) in self.white_positions: + print("Illegal move! can't move into position taken by any other piece") + print_move_info(piece_x_coord, piece_y_coord, x_final, y_final) + error = True + return error + + def check_piece_exists(self, piece_x_coord, piece_y_coord, player_color): + error = False + if player_color: + if not (piece_x_coord, piece_y_coord) in self.white_positions: + print("Illegal move! There is no piece on those coordinates or piece does not belong to white player") + error = True + elif not (piece_x_coord, piece_y_coord) in self.black_positons: + print("Illegal move! There is no piece on those coordinates or piece does not belong to black player") + error = True + return error + + def check_move_diagonally(self, from, to, player_color, king): + if not king: + if player_color: + if to[0] == from[0] - 1 or to[0] == from[0] + 1: + if to[1] == from[1] + 1: + return False + elif x_final == piece_x_coord - 1 or x_final == piece_x_coord + 1: + if y_final == piece_y_coord - 1: + return False + if king: + if player_color: + if x_final == piece_x_coord - 1 or x_final == piece_x_coord + 1: + return False + elif x_final == piece_x_coord - 1 or x_final == piece_x_coord + 1: + return False + return True + + def check_piece_king(self, from, player_color): + if player_color == "white": + if (from[0], from[1], True) in self.white_positions: + return True + elif (from[0], from[1], True) in self.black_positions: + return True + return False + + # https://stackoverflow.com/a/2191707 + def check_move_piece_capable(self, from, to, player_color): + error = True + king = self.check_piece_king(from, player_color) + error = self.check_move_diagonally(from, to, player_color, king) + return error + + def check_capture(self, from, to, player_color): + capture = False + if player_color == "white": + if (to[0] - 1, to[1] - 1) in self.black_positions or (t[0] + 1, to[1] - 1) in self.black_positions + capture = True + elif (to[0], to[1] - 1) in self.white_positions or (to[0] + 1, t0[1] - 1) in self.white_positions + capture = True + return capture + + def check_move_legal(self, from, to, player_color): + if self.check_move_out_of_bounds(from, to): + return False + if self.check_piece_exists(from, to, player_color): + return False + if self.check_spot_taken(from, to, player_color): + return False + capture = self.check_capture(from, to, player_color) + if not capture: + return self.check_move_piece_capable(from, to, player_color): + + return True + + + + def make_move(self, from, to, color): + if(color == "white"): + self.white_pieces.remove(from) + self.white_pieces.append(to) + else: + self.black_pieces.remove(from) + self.black_pieces.append(to) + if not check_move_legal(piece_x_coord, piece_y_coord, x_final, y_final, player_color): + return False + return True + + + def print_board(self): + print(" ", end="") + for x in range(self.board_size): + print(" " + chr(97 + x), end=" ") + print(" ") + line = 0 + for y in range(self.board_size*4): + for x in range(self.board_size): + bg = "#" if x%2==(y//4)%2 else " " + checker = bg + if((x, y//4, False) in self.white_positions): + checker = "w" + elif((x, y//4, True) in self.white_positions): + checker = "W" + elif((x, y//4, False) in self.black_positions): + checker = "b" + elif((x, y//4, True) in self.black_positions): + checker = "B" + + if(x==0): + if(line%4==2): + print('{:3d}'.format(y//4), end="") + else: + print(" ", end="") + + match line%4: + case 0: + print("+---", end="") + case 1 | 3: + print("|" + 3*bg, end="") + case 2: + print("|" + bg + checker + bg, end="") + if(line%4==0): + print("+") + else: + print("|", end=f"{y//4}\n" if line%4==2 else "\n") + line+=1 + print(" ", end="") + for x in range(self.board_size): + print("+---", end="") + print("+\n ", end="") + for x in range(self.board_size): + print(" " + chr(97 + x), end=" ") + print() + +# Ran first in the code +if __name__ == "__main__": + game = Game(8) + game.print_board() + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 00000000..9dea89fb --- /dev/null +++ b/main.py @@ -0,0 +1 @@ +print("I lost the game") \ No newline at end of file diff --git a/lab1/poetry.lock b/poetry.lock similarity index 100% rename from lab1/poetry.lock rename to poetry.lock diff --git a/lab1/pyproject.toml b/pyproject.toml similarity index 100% rename from lab1/pyproject.toml rename to pyproject.toml diff --git a/lab1/replit.nix b/replit.nix similarity index 100% rename from lab1/replit.nix rename to replit.nix