From a80487fa2851f1d14d2054f5b9cdcb00af86b2f5 Mon Sep 17 00:00:00 2001 From: Alex Bul Date: Thu, 11 Jul 2024 19:16:03 +0300 Subject: [PATCH 1/2] 'Solution' --- app/main.py | 81 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/app/main.py b/app/main.py index 626f41cf..257728af 100644 --- a/app/main.py +++ b/app/main.py @@ -1,34 +1,65 @@ 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.decks = [ + Deck(start[0], i) + if start[0] == end[0] + else Deck(a, 0) + for a in range(start[0], end[0] + 1) + for i in range(start[1], end[1] + 1) + ] + self.start = start + self.end = end + 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: + for i in range(len(self.decks)): + if self.decks[i].row == row and self.decks[i].column == column: + return self.decks[i] - 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: + for i in self.decks: + if i == self.get_deck(row, column): + i.is_alive = False + self.decks.remove(i) + if len(self.decks) == 0: + 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: list[tuple]) -> None: + self.ships = ships + self.field = {} + for i in range(len(self.ships)): + ship = Ship(self.ships[i][0], self.ships[i][1]) + for index in range(len(ship.decks)): + self.field[ship.decks[index]] = ship + + def fire(self, location: tuple) -> str: + list_keys = [(keys.row, keys.column) for keys in self.field.keys()] + if location not in list_keys: + return "Miss!" + + for keys, value in self.field.items(): + column = keys.column + row = keys.row + + if row == location[0] and column == location[1]: + column = keys.column + row = keys.row + value.fire(row, column) + if value.is_drowned is True: + return "Sunk!" + else: + return "Hit!" From ab4757e504ae7727094ebafb69758849fa57da42 Mon Sep 17 00:00:00 2001 From: Alex Bul Date: Thu, 11 Jul 2024 19:59:01 +0300 Subject: [PATCH 2/2] 'Solution' --- app/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/main.py b/app/main.py index 257728af..bd407fa7 100644 --- a/app/main.py +++ b/app/main.py @@ -61,5 +61,4 @@ def fire(self, location: tuple) -> str: value.fire(row, column) if value.is_drowned is True: return "Sunk!" - else: - return "Hit!" + return "Hit!"