diff --git a/.flake8 b/.flake8 index d7459204..3f5e06ff 100644 --- a/.flake8 +++ b/.flake8 @@ -4,4 +4,4 @@ ignore = E203, E266, W503, ANN002, ANN003, ANN101, ANN102, ANN401, N807, N818 max-line-length = 79 max-complexity = 18 select = B,C,E,F,W,T4,B9,ANN,Q0,N8,VNE -exclude = venv, tests +exclude = venv, tests, .venv diff --git a/app/main.py b/app/main.py index 626f41cf..5bd8a411 100644 --- a/app/main.py +++ b/app/main.py @@ -1,34 +1,64 @@ class Deck: - def __init__(self, row, column, is_alive=True): - pass + def __init__(self, row: int, column: int, is_alive: bool = True) -> None: + self.row = row + self.column = column + self.is_alive = is_alive class Ship: - def __init__(self, start, end, is_drowned=False): - # Create decks and save them to a list `self.decks` - pass + def __init__(self, start: int, end: int) -> None: + self.start = start + self.end = end + self.decks = self._create_decks() - def get_deck(self, row, column): - # Find the corresponding deck in the list - pass + def _create_decks(self) -> list | str: + (r1, c1), (r2, c2) = self.start, self.end - def fire(self, row, column): - # Change the `is_alive` status of the deck - # And update the `is_drowned` value if it's needed - pass + if r1 == r2: + start, end = sorted([c1, c2]) + return [Deck(r1, c) for c in range(start, end + 1)] + + elif c1 == c2: + start, end = sorted([r1, r2]) + return [Deck(r, c1) for r in range(start, end + 1)] + + raise ValueError + + def get_deck(self, row: int, column: int) -> list[Deck]: + for deck in self.decks: + if deck.row == row and deck.column == column: + return deck + + return None + + def fire(self, row: int, column: int) -> None | str: + deck = self.get_deck(row, column) + if deck is None: + return None + + deck.is_alive = False + + if all(not d.is_alive for d in self.decks): + self.is_drowned = True + return "Sunk!" + + return "Hit!" class Battleship: - def __init__(self, ships): - # Create a dict `self.field`. - # Its keys are tuples - the coordinates of the non-empty cells, - # A value for each cell is a reference to the ship - # which is located in it - pass - - def fire(self, location: tuple): - # This function should check whether the location - # is a key in the `self.field` - # If it is, then it should check if this cell is the last alive - # in the ship or not. - pass + def __init__(self, ships: list) -> None: + self.field = {} + + for start, end in ships: + ship = Ship(start, end) + for deck in ship.decks: + self.field[(deck.row, deck.column)] = ship + + def fire(self, location: tuple) -> str: + row, col = location + + if (row, col) not in self.field: + return "Miss!" + + ship = self.field[(row, col)] + return ship.fire(row, col)