From 6437d8d43dbfd00ef4505304c9921c4693309b3c Mon Sep 17 00:00:00 2001 From: Kyryl Zhelizko Date: Sun, 26 Nov 2023 16:29:48 +0200 Subject: [PATCH 1/3] Solution --- app/main.py | 75 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/app/main.py b/app/main.py index 626f41cf..7e5b47c2 100644 --- a/app/main.py +++ b/app/main.py @@ -1,34 +1,59 @@ 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 + + def __eq__(self, other: tuple) -> bool: + row, column = other + if self.row == row and self.column == column: + return True + return False 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[int], + end: tuple[int], + is_drowned: bool = False + ) -> None: + if start[0] == end[0]: + self.decks = [ + Deck(start[0], i) for i in range(start[1], end[1] + 1) + ] + else: + self.decks = [ + Deck(i, start[1]) for i in range(start[0], end[0] + 1) + ] + self.is_drowned = is_drowned - def get_deck(self, row, column): - # Find the corresponding deck in the list - pass + def get_deck(self, row: int, column: int) -> Deck | None: + for deck in self.decks: + if (row, column) == deck: + return deck + return None - 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: + deck = self.get_deck(row, column) + deck.is_alive = False + if all([not deck.is_alive for deck in self.decks]): + self.is_drowned = True 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: tuple[tuple[int]]) -> None: + self.ships = [Ship(ship[0], ship[1]) for ship in ships] + self.battlefield = [["~" for _ in range(10)] for _ in range(10)] + + def fire(self, location: tuple[int]) -> str: + for ship in self.ships: + if location in ship.decks: + ship.fire(*location) + if ship.is_drowned: + return "Sunk!" + else: + return "Hit!" + else: + return "Miss!" From 229acdc15a8ea80aa84cdeb310e4d0ffc0827819 Mon Sep 17 00:00:00 2001 From: Kyryl Zhelizko Date: Sun, 26 Nov 2023 16:46:25 +0200 Subject: [PATCH 2/3] fix --- app/main.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/main.py b/app/main.py index 7e5b47c2..87f4563b 100644 --- a/app/main.py +++ b/app/main.py @@ -53,7 +53,5 @@ def fire(self, location: tuple[int]) -> str: ship.fire(*location) if ship.is_drowned: return "Sunk!" - else: - return "Hit!" - else: - return "Miss!" + return "Hit!" + return "Miss!" From 27adadbcde39139ef427406626be69445628a2f7 Mon Sep 17 00:00:00 2001 From: Kyryl Zhelizko Date: Sun, 26 Nov 2023 20:03:27 +0200 Subject: [PATCH 3/3] fix --- app/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/main.py b/app/main.py index 87f4563b..bad01998 100644 --- a/app/main.py +++ b/app/main.py @@ -45,7 +45,6 @@ def fire(self, row: int, column: int) -> None: class Battleship: def __init__(self, ships: tuple[tuple[int]]) -> None: self.ships = [Ship(ship[0], ship[1]) for ship in ships] - self.battlefield = [["~" for _ in range(10)] for _ in range(10)] def fire(self, location: tuple[int]) -> str: for ship in self.ships: