def make_board(size: int, filler = 0) -> list: return [[filler for _ in range(size)] for _ in range(size)] class DrawerHelper: @staticmethod def draw_columnsnrows(board) -> None: max_num_len = len(str(len(board) - 1)) # Currently inserts the columns and rows into the board for i in range(len(board)): for j in range(len(board[i])): if i == 0 and j == 0: board[i][j] = " " * max_num_len elif i == 0: board[i][j] = chr(j + 64) elif j == 0: board[i][j] = str(i).rjust(max_num_len) else: board[i][j] = " " def draw_ships(board, ships) -> None: for i in range(len(ships)): for j in range(len(ships[i])): if ships[i][j] == 1: board[i + 1][j + 1] = "B" def draw_shots(board, hit_ships) -> None: for i in range(len(hit_ships)): for j in range(len(hit_ships[i])): if hit_ships[i][j] == 1: board[i + 1][j + 1] = "X" if hit_ships[i][j] == -1: board[i + 1][j + 1] = "O" def draw_board(board) -> None: for i in range(len(board)): for j in range(len(board[i])): print(board[i][j], end=" ") print() class Game: def __init__(self, board_size: int, enemy_amount: int = 5) -> None: self.my_ships = make_board(board_size) # Two different boards, one to show your ships and one to show the places you have shot self.hit_ships = make_board(board_size) # -1 = shot but not hit, 0 = not hit, 1 = hit self.total_enemy_amount = enemy_amount self.my_drawn_board = make_board(board_size + 1, " ") self.enemy_drawn_board = make_board(board_size + 1, " ") @property def enemy_amount(self) -> int: # Get the enemy amount based on the amount of ships that are not hit in the hit ships var return self.total_enemy_amount - sum([row.count(1) for row in self.hit_ships]) def draw(self) -> None: DrawerHelper.draw_ships(self.my_drawn_board, self.my_ships) DrawerHelper.draw_shots(self.my_drawn_board, self.hit_ships) DrawerHelper.draw_board(self.my_drawn_board) def hit(self, x: int, y: int, state: int) -> None: self.hit_ships[x][y] = state def shoot(self, x: int, y: int) -> int: """Shot at own board and return hit or not hit""" if self.my_ships[x][y] == 1: return 1 return -1 na = Game(5) DrawerHelper.draw_columnsnrows(na.my_drawn_board) na.my_ships[2][2] = 1 na.hit(1, 2, na.shoot(1, 2)) na.draw()