From c7f09f6b069b35c70b907695391f4a783bc8caf0 Mon Sep 17 00:00:00 2001 From: Hlova Oleh Date: Tue, 10 Oct 2023 18:05:34 +0300 Subject: [PATCH 1/2] implemented py-battleship task --- app/main.py | 72 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/app/main.py b/app/main.py index 626f41cf..7e3e4379 100644 --- a/app/main.py +++ b/app/main.py @@ -1,34 +1,58 @@ 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: tuple, + end: tuple, + is_drowned: bool = False + ) -> None: + self.is_drowned = is_drowned + self.decks = [] + if start[0] != end[0]: + for x_position in range(start[0], end[0] + 1): + self.decks.append(Deck(x_position, start[1])) + elif start[1] != end[1]: + for y_position in range(start[1], end[1] + 1): + self.decks.append(Deck(start[0], y_position)) + else: + self.decks.append(Deck(start[0], end[1])) - def get_deck(self, row, column): - # Find the corresponding deck in the list - pass + def get_deck(self, row: int, column: int) -> Deck: + for deck in self.decks: + if deck.row == row and deck.column == column: + return deck - def fire(self, row, column): - # Change the `is_alive` status of the deck - # And update the `is_drowned` value if it's needed - pass + def fire(self, row: int, column: int) -> None: + self.get_deck(row, column).is_alive = False + self.is_drowned = all([not deck.is_alive for deck in self.decks]) 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 __init__(self, ships: list[tuple]) -> None: + self.field = {} + for ship in ships: + boat = Ship(ship[0], ship[1]) + if ship[0][0] != ship[1][0]: + for x_position in range(ship[0][0], ship[1][0] + 1): + self.field[(ship[0][1], x_position)] = boat + elif ship[0][1] != ship[1][1]: + for y_position in range(ship[0][1], ship[1][1] + 1): + self.field[(ship[0][0], y_position)] = boat + else: + self.field[ship[0]] = boat - 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 fire(self, location: tuple) -> str: + if location not in self.field: + return "Miss!" + if location in self.field: + self.field[location].fire(location[0], location[1]) + if self.field[location].is_drowned: + return "Sunk!" + else: + return "Hit!" From 6a02d72b2b27c9c70e8fe9842e80484606b84c8d Mon Sep 17 00:00:00 2001 From: Hlova Oleh Date: Tue, 10 Oct 2023 21:12:46 +0300 Subject: [PATCH 2/2] fixed type hints --- app/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/main.py b/app/main.py index 7e3e4379..679782f4 100644 --- a/app/main.py +++ b/app/main.py @@ -8,8 +8,8 @@ def __init__(self, row: int, column: int, is_alive: bool = True) -> None: class Ship: def __init__( self, - start: tuple, - end: tuple, + start: tuple[int, int], + end: tuple[int, int], is_drowned: bool = False ) -> None: self.is_drowned = is_drowned @@ -47,7 +47,7 @@ def __init__(self, ships: list[tuple]) -> None: else: self.field[ship[0]] = boat - def fire(self, location: tuple) -> str: + def fire(self, location: tuple[int, int]) -> str: if location not in self.field: return "Miss!" if location in self.field: