diff --git a/.DS_Store b/.DS_Store index 1b232ba..a29a714 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/HNS/.DS_Store b/HNS/.DS_Store index 3175dc3..0ebef95 100644 Binary files a/HNS/.DS_Store and b/HNS/.DS_Store differ diff --git a/HNS/Excercises/.DS_Store b/HNS/Excercises/.DS_Store index 979d852..892a14b 100644 Binary files a/HNS/Excercises/.DS_Store and b/HNS/Excercises/.DS_Store differ diff --git a/HNS/Excercises/ShipCraft/.DS_Store b/HNS/Excercises/ShipCraft/.DS_Store index 07bf8be..7cc5cb1 100644 Binary files a/HNS/Excercises/ShipCraft/.DS_Store and b/HNS/Excercises/ShipCraft/.DS_Store differ diff --git a/HNS/Excercises/ShipCraft/Переделка/Files.py b/HNS/Excercises/ShipCraft/Переделка/Files.py index 5a541a6..1f44ee6 100644 --- a/HNS/Excercises/ShipCraft/Переделка/Files.py +++ b/HNS/Excercises/ShipCraft/Переделка/Files.py @@ -1,30 +1,30 @@ -import os - - -def list_levels(): - files = os.listdir(path=".") - result = [] - for file in files: - if file.lower().endswith('.txt'): - result.append(file) - - return result - - -def load(file): - # 1 загрузить весь файл в строку - f = open(file, "r") - s = f.read() - - # 2 заменить все пробелы и переводы строки на ничего - s = s.replace(" ", "") - s = s.replace('\n', "") - - # 3 из полученной строки создать массив используя разделитель "," - a = s.split(",") - - # а - массив строк, в которых хранятся числа - b = [] - - f.close() - return a +import os + + +def list_levels(): + files = os.listdir(path=".") + result = [] + for file in files: + if file.lower().endswith('.txt'): + result.append(file) + + return result + + +def load(file): + # 1 загрузить весь файл в строку + f = open(file, "r") + s = f.read() + + # 2 заменить все пробелы и переводы строки на ничего + s = s.replace(" ", "") + s = s.replace('\n', "") + + # 3 из полученной строки создать массив используя разделитель "," + a = s.split(",") + + # а - массив строк, в которых хранятся числа + b = [] + + f.close() + return a diff --git a/HNS/Excercises/ShipCraft/Переделка/GameMode.py b/HNS/Excercises/ShipCraft/Переделка/GameMode.py index 8ae75d1..3b8ac6f 100644 --- a/HNS/Excercises/ShipCraft/Переделка/GameMode.py +++ b/HNS/Excercises/ShipCraft/Переделка/GameMode.py @@ -1,16 +1,16 @@ -from enum import Enum - - -class GameMode(Enum): - MENU = 'MENU' - PLAN = 'PLAN' - BATTLE = 'BATTLE' - END = 'END' - - @staticmethod - def from_string(raw_value): - if raw_value: - value = raw_value.upper() - if value in GameMode.__members__: - return GameMode[value] - return GameMode.MENU +from enum import Enum + + +class GameMode(Enum): + MENU = 'MENU' + PLAN = 'PLAN' + BATTLE = 'BATTLE' + END = 'END' + + @staticmethod + def from_string(raw_value): + if raw_value: + value = raw_value.upper() + if value in GameMode.__members__: + return GameMode[value] + return GameMode.MENU diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipDirection.py b/HNS/Excercises/ShipCraft/Переделка/ShipDirection.py index c794076..78153f0 100644 --- a/HNS/Excercises/ShipCraft/Переделка/ShipDirection.py +++ b/HNS/Excercises/ShipCraft/Переделка/ShipDirection.py @@ -1,15 +1,15 @@ -from enum import Enum - - -class ShipDirection(Enum): - VERTICAL = 'VERTICAL' - HORIZONTAL = 'HORIZONTAL' - UNKNOWN = 'UNKNOWN' - - @staticmethod - def from_string(raw_value): - if raw_value: - value = raw_value.upper() - if value in ShipDirection.__members__: - return ShipDirection[value] - return ShipDirection.UNKNOWN +from enum import Enum + + +class ShipDirection(Enum): + VERTICAL = 'VERTICAL' + HORIZONTAL = 'HORIZONTAL' + UNKNOWN = 'UNKNOWN' + + @staticmethod + def from_string(raw_value): + if raw_value: + value = raw_value.upper() + if value in ShipDirection.__members__: + return ShipDirection[value] + return ShipDirection.UNKNOWN diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipField.py b/HNS/Excercises/ShipCraft/Переделка/ShipField.py index e2a1486..c296e4f 100644 --- a/HNS/Excercises/ShipCraft/Переделка/ShipField.py +++ b/HNS/Excercises/ShipCraft/Переделка/ShipField.py @@ -1,331 +1,380 @@ -import copy - -from ShootResult import ShootResult -from ShipDirection import ShipDirection -from ShipMode import ShipMode - - -class ShipField: - field_size = 10 - - def __init__(self): - self.field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] - - self.ships = [4, 3, 3, 2, 2, 2, 1, 1, 1, 1] - self.field_mode = ShipMode.INACTIVE - self.ship_size = 4 - self.ship_direction = ShipDirection.VERTICAL - - def from_json(self, obj): - self.field = obj['field'] - self.ships = obj['ships'] - self.field_mode = ShipMode.from_string(obj['field_mode']) - self.ship_size = obj['ship_size'] - self.ship_direction = ShipDirection.from_string(obj['ship_direction']) - - def __getitem__(self, item): - if item is None: - return None - - if type(item) is not int and item.isnumeric(): - item = int(item) - - if type(item) is int and 0 <= item < len(self.field): - return self.field[item] - - return None - - def check_killed(self, row, col): - if row < 0 or row > ShipField.field_size: - return - if col < 0 or col > ShipField.field_size: - return - - ship_killed = True - ship_direction = ShipDirection.UNKNOWN - - #check vertical - for r in range(row + 1, ShipField.field_size): - if self.check_ship(r, col): - return False - - elif self.check_empty(r, col): - break - - for r in range(row - 1, -1, -1): - if self.check_ship(r, col): - return False - - elif self.check_empty(r, col): - break - - # проверим горизонталь - for c in range(col + 1, ShipField.field_size): - if self.check_ship(row, c): - ship_direction = ShipDirection.HORIZONTAL - else: - break - - for c in range(col + 1, ShipField.field_size): - if self.check_ship(row, c): - return False - - elif self.check_empty(row, c): - break - return True - - def fill_empty_killed(self, row, col): - pass - - def action(self, row, col): - self.clear_marker() - - if self.field_mode == ShipMode.PUT: - if self.check_ship(row, col): - self.get_ship(row, col) - - elif self.ship_size in self.ships and self.check_possible(row, col): - self.set_ship(row, col) - - elif self.field_mode == ShipMode.SHOOT: - shoot_result = self.shoot(row, col) - - if shoot_result == ShootResult.KILLED: - self.fill_empty_killed(row, col) - - return shoot_result == ShootResult.EMPTY - - return False - - def target(self, row, col): - self.clear_marker() - - if self.field_mode == ShipMode.PUT: - if self.check_possible(row, col): - if self.ship_direction == ShipDirection.VERTICAL: - for r in range(row, row + self.ship_size): - if self.ship_size in self.ships: - self.field[r * ShipField.field_size + col] = "p" - else: - self.field[r * ShipField.field_size + col] = "r" - - if self.ship_direction == ShipDirection.HORIZONTAL: - for c in range(col, col + self.ship_size): - if self.ship_size in self.ships: - self.field[row * ShipField.field_size + c] = "p" - else: - self.field[row * ShipField.field_size + c] = "r" - elif self.field_mode == ShipMode.SHOOT: - self.field[row * ShipField.field_size + col] += "+" - - def clear_marker(self): - for i in range(0, len(self.field)): - if self.field[i] == "p" or self.field[i] == "r": - self.field[i] = "" - - if "+" in self.field[i]: - self.field[i] = self.field[i].replace("+", "") - - def set_ship(self, row, col): - if row < 0 or row > ShipField.field_size: - return - if col < 0 or col > ShipField.field_size: - return - index = row * ShipField.field_size + col - if self.ship_direction == ShipDirection.VERTICAL: - if ShipField.field_size - row < self.ship_size: - return - for r in range(row, row + self.ship_size): - index = r * ShipField.field_size + col - self.field[index] = "1" - if self.ship_direction == ShipDirection.HORIZONTAL: - if ShipField.field_size - col < self.ship_size: - return - for c in range(col, col + self.ship_size): - index = row * ShipField.field_size + c - self.field[index] = "1" - - if self.ship_size in self.ships: - self.ships.remove(self.ship_size) - self.print_field() - - if self.ship_size not in self.ships and len(self.ships) > 0: - self.ship_size = max(self.ships) - - def get_ship(self, row, col): - if row < 0 or row > ShipField.field_size: - return - if col < 0 or col > ShipField.field_size: - return - - self.field[row * ShipField.field_size + col] = "" - - ship_size = 1 - ship_direction = ShipDirection.UNKNOWN - - # проверим вертикаль - for r in range(row + 1, ShipField.field_size): - if self.check_ship(r, col): - ship_size += 1 - ship_direction = ShipDirection.VERTICAL - self.field[r * ShipField.field_size + col] = "" - else: - break - - for r in range(row - 1, -1, -1): - if self.check_ship(r, col): - ship_size += 1 - ship_direction = ShipDirection.VERTICAL - self.field[row * ShipField.field_size + col] = "" - else: - break - - if ship_direction == ShipDirection.UNKNOWN: - - # проверим горизонталь - for c in range(col + 1, ShipField.field_size): - if self.check_ship(row, c): - ship_size += 1 - ship_direction = ShipDirection.HORIZONTAL - self.field[row * ShipField.field_size + c] = "" - else: - break - - for c in range(col - 1, -1, -1): - if self.check_ship(row, c): - ship_size += 1 - ship_direction = ShipDirection.HORIZONTAL - self.field[row * ShipField.field_size + c] = "" - else: - break - self.set_ship_direction(ship_direction) - self.set_ship_size(ship_size) - self.ships.append(ship_size) - - def shoot(self, row, col): - if row < 0 or row > ShipField.field_size - 1: - return ShootResult.UNDEFINED - if col < 0 or col > ShipField.field_size - 1: - return ShootResult.UNDEFINED - index = row * ShipField.field_size + col - if (self.field[index]).strip() == "": - self.field[index] = "0" - return ShootResult.EMPTY - elif (self.field[index]).strip() == "1": - self.field[index] = "\\" - if self.check_killed(row, col): - return ShootResult.KILLED - return ShootResult.DAMAGED - else: - return ShootResult.UNDEFINED - - def check_ship(self, row, col): - # функция должна возвражать тру, если в заданной клетке есть корабль - # в противном случае фолс - return self.field[row * ShipField.field_size + col].strip() == "1" - - def check_damaged(self, row, col): - return self.field[row * ShipField.field_size + col].strip() == "\\" - - def check_empty(self, row, col): - cell = self.field[row * ShipField.field_size + col].strip() - return cell == "0" or cell == "" - - def check_end(self): - return "1" not in self.field - - def check_possible(self, row, col): - # Функция должна возвращать True, если можно поставить сюда корабль, - # в противном случае - False - if self.ship_direction == ShipDirection.VERTICAL: - # Здесь мы знаем, что корабль помещается на поле. - if ShipField.field_size - row >= self.ship_size: - # Теперь нужно проверить, не заблокировано ли какое-то из полей, - for r in range(row, row + self.ship_size): - if not self.check_blocked(r, col): - return False - return True - - if self.ship_direction == ShipDirection.HORIZONTAL: - if ShipField.field_size - col >= self.ship_size: - for c in range(col, col + self.ship_size): - if not self.check_blocked(row, c): - return False - return True - - return False - - def check_blocked(self, row, col): - # Функция возвращает True, если все клетки вокруг клетки с координатами row, col - # либо находятся за пределами поля, либо в них нет корабля/они пустые - for r in range(row - 1, row + 2): - for c in range(col - 1, col + 2): - if 0 <= r < ShipField.field_size and 0 <= c < ShipField.field_size: - cell = (self.field[r * ShipField.field_size + c]).strip() - if cell != '' and cell != 'p': - return False - return True - - def set_ship_size(self, value): - if value is None: - return - - if type(value) is str and value.isnumeric(): - value = int(value) - - if type(value) is int and 1 <= value <= 4: - self.ship_size = value - - def set_ship_direction(self, value): - if value is None: - return - - if type(value) is not ShipDirection: - return - - if value != ShipDirection.UNKNOWN: - self.ship_direction = value - - def toggle_ship_direction(self): - if self.ship_direction == ShipDirection.VERTICAL: - self.ship_direction = ShipDirection.HORIZONTAL - else: - self.ship_direction = ShipDirection.VERTICAL - - def set_field_mode(self, value): - if value is None: - return - - if type(value) is not ShipMode: - return - - self.field_mode = value - - def print_field(self): - print(self.ships) - for r in range(0, ShipField.field_size): - blocked_string = "" - ship_string = "" - for c in range(0, ShipField.field_size): - blocked_string += str(self.check_blocked(r, c))[0] + ", " - ship_string += self.field[r * ShipField.field_size + c] + ', ' - print(ship_string[:-2]) - # print(blocked_string[:-2] + ' ' + ship_string[:-2]) - print("********************************************************************") - - @staticmethod - def convert_to_json(obj): - if isinstance(obj, ShipField): - result = copy.deepcopy(obj.__dict__) - result['field_mode'] = obj.field_mode.value - result['ship_direction'] = obj.ship_direction.value - return result +import copy + +from ShootResult import ShootResult +from ShipDirection import ShipDirection +from ShipMode import ShipMode + + +class ShipField: + field_size = 10 + + def __init__(self): + self.field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] + + self.ships = [4, 3, 3, 2, 2, 2, 1, 1, 1, 1] + self.field_mode = ShipMode.INACTIVE + self.ship_size = 4 + self.ship_direction = ShipDirection.VERTICAL + + def from_json(self, obj): + self.field = obj['field'] + self.ships = obj['ships'] + self.field_mode = ShipMode.from_string(obj['field_mode']) + self.ship_size = obj['ship_size'] + self.ship_direction = ShipDirection.from_string(obj['ship_direction']) + + def __getitem__(self, item): + if item is None: + return None + + if type(item) is not int and item.isnumeric(): + item = int(item) + + if type(item) is int and 0 <= item < len(self.field): + return self.field[item] + + return None + + + + def mark_killed(self, row, col): + if row < 0 or row > ShipField.field_size: + return + if col < 0 or col > ShipField.field_size: + return + + self.field[row * ShipField.field_size + col] = 'x' + self.fill_empty_killed(row, col) + + + #check vertical + for r in range(row + 1, ShipField.field_size): + if self.check_damaged(r, col): + self.field[r * ShipField.field_size + col] = 'x' + self.fill_empty_killed(r, col) + + else: + break + + for r in range(row - 1, -1, -1): + if self.check_damaged(r, col): + self.field[r * ShipField.field_size + col] = 'x' + self.fill_empty_killed(r, col) + else: + break + + # проверим горизонталь + for c in range(col + 1, ShipField.field_size): + if self.check_damaged(row, c): + self.field[row * ShipField.field_size + c] = 'x' + self.fill_empty_killed(row, c) + else: + break + + for c in range(col - 1, -1, -1): + if self.check_damaged(row, c): + self.field[row * ShipField.field_size + c] = 'x' + self.fill_empty_killed(row, c) + else: + break + + def check_killed(self, row, col): + if row < 0 or row > ShipField.field_size: + return + if col < 0 or col > ShipField.field_size: + return + + ship_killed = True + ship_direction = ShipDirection.UNKNOWN + + #check vertical + for r in range(row + 1, ShipField.field_size): + if self.check_ship(r, col): + return False + + elif self.check_empty(r, col): + break + + for r in range(row - 1, -1, -1): + if self.check_ship(r, col): + return False + + elif self.check_empty(r, col): + break + + # проверим горизонталь + for c in range(col + 1, ShipField.field_size): + if self.check_ship(row, c): + return False + + elif self.check_empty(row, c): + break + + for c in range(col - 1, -1, -1): + if self.check_ship(row, c): + return False + + elif self.check_empty(row, c): + break + + return True + + def fill_empty_killed(self, row, col): + for r in range(row - 1, row + 2): + for c in range(col - 1, col + 2): + if self.check_empty(r, c): + self.field[r * ShipField.field_size + c] = '0' + + def action(self, row, col): + self.clear_marker() + + if self.field_mode == ShipMode.PUT: + if self.check_ship(row, col): + self.get_ship(row, col) + + elif self.ship_size in self.ships and self.check_possible(row, col): + self.set_ship(row, col) + + elif self.field_mode == ShipMode.SHOOT: + shoot_result = self.shoot(row, col) + + if shoot_result == ShootResult.KILLED: + self.mark_killed(row, col) + self.fill_empty_killed(row, col) + + return shoot_result == ShootResult.EMPTY + + return False + + def target(self, row, col): + self.clear_marker() + + if self.field_mode == ShipMode.PUT: + if self.check_possible(row, col): + if self.ship_direction == ShipDirection.VERTICAL: + for r in range(row, row + self.ship_size): + if self.ship_size in self.ships: + self.field[r * ShipField.field_size + col] = "p" + else: + self.field[r * ShipField.field_size + col] = "r" + + if self.ship_direction == ShipDirection.HORIZONTAL: + for c in range(col, col + self.ship_size): + if self.ship_size in self.ships: + self.field[row * ShipField.field_size + c] = "p" + else: + self.field[row * ShipField.field_size + c] = "r" + elif self.field_mode == ShipMode.SHOOT: + self.field[row * ShipField.field_size + col] += "+" + + def clear_marker(self): + for i in range(0, len(self.field)): + if self.field[i] == "p" or self.field[i] == "r": + self.field[i] = "" + + if "+" in self.field[i]: + self.field[i] = self.field[i].replace("+", "") + + def set_ship(self, row, col): + if row < 0 or row > ShipField.field_size: + return + if col < 0 or col > ShipField.field_size: + return + index = row * ShipField.field_size + col + if self.ship_direction == ShipDirection.VERTICAL: + if ShipField.field_size - row < self.ship_size: + return + for r in range(row, row + self.ship_size): + index = r * ShipField.field_size + col + self.field[index] = "1" + if self.ship_direction == ShipDirection.HORIZONTAL: + if ShipField.field_size - col < self.ship_size: + return + for c in range(col, col + self.ship_size): + index = row * ShipField.field_size + c + self.field[index] = "1" + + if self.ship_size in self.ships: + self.ships.remove(self.ship_size) + self.print_field() + + if self.ship_size not in self.ships and len(self.ships) > 0: + self.ship_size = max(self.ships) + + def get_ship(self, row, col): + if row < 0 or row > ShipField.field_size: + return + if col < 0 or col > ShipField.field_size: + return + + self.field[row * ShipField.field_size + col] = "" + + ship_size = 1 + ship_direction = ShipDirection.UNKNOWN + + # проверим вертикаль + for r in range(row + 1, ShipField.field_size): + if self.check_ship(r, col): + ship_size += 1 + ship_direction = ShipDirection.VERTICAL + self.field[r * ShipField.field_size + col] = "" + else: + break + + for r in range(row - 1, -1, -1): + if self.check_ship(r, col): + ship_size += 1 + ship_direction = ShipDirection.VERTICAL + self.field[row * ShipField.field_size + col] = "" + else: + break + + if ship_direction == ShipDirection.UNKNOWN: + + # проверим горизонталь + for c in range(col + 1, ShipField.field_size): + if self.check_ship(row, c): + ship_size += 1 + ship_direction = ShipDirection.HORIZONTAL + self.field[row * ShipField.field_size + c] = "" + else: + break + + for c in range(col - 1, -1, -1): + if self.check_ship(row, c): + ship_size += 1 + ship_direction = ShipDirection.HORIZONTAL + self.field[row * ShipField.field_size + c] = "" + else: + break + self.set_ship_direction(ship_direction) + self.set_ship_size(ship_size) + self.ships.append(ship_size) + + def shoot(self, row, col): + if row < 0 or row > ShipField.field_size - 1: + return ShootResult.UNDEFINED + if col < 0 or col > ShipField.field_size - 1: + return ShootResult.UNDEFINED + index = row * ShipField.field_size + col + if (self.field[index]).strip() == "": + self.field[index] = "0" + return ShootResult.EMPTY + elif (self.field[index]).strip() == "1": + self.field[index] = "\\" + if self.check_killed(row, col): + return ShootResult.KILLED + return ShootResult.DAMAGED + else: + return ShootResult.UNDEFINED + + def check_ship(self, row, col): + # функция должна возвражать тру, если в заданной клетке есть корабль + # в противном случае фолс + return self.field[row * ShipField.field_size + col].strip() == "1" + + def check_damaged(self, row, col): + return self.field[row * ShipField.field_size + col].strip() == "\\" + + def check_empty(self, row, col): + cell = self.field[row * ShipField.field_size + col].strip() + return cell == "0" or cell == "" + + def check_end(self): + return "1" not in self.field + + def check_possible(self, row, col): + # Функция должна возвращать True, если можно поставить сюда корабль, + # в противном случае - False + if self.ship_direction == ShipDirection.VERTICAL: + # Здесь мы знаем, что корабль помещается на поле. + if ShipField.field_size - row >= self.ship_size: + # Теперь нужно проверить, не заблокировано ли какое-то из полей, + for r in range(row, row + self.ship_size): + if not self.check_blocked(r, col): + return False + return True + + if self.ship_direction == ShipDirection.HORIZONTAL: + if ShipField.field_size - col >= self.ship_size: + for c in range(col, col + self.ship_size): + if not self.check_blocked(row, c): + return False + return True + + return False + + def check_blocked(self, row, col): + # Функция возвращает True, если все клетки вокруг клетки с координатами row, col + # либо находятся за пределами поля, либо в них нет корабля/они пустые + for r in range(row - 1, row + 2): + for c in range(col - 1, col + 2): + if 0 <= r < ShipField.field_size and 0 <= c < ShipField.field_size: + cell = (self.field[r * ShipField.field_size + c]).strip() + if cell != '' and cell != 'p': + return False + return True + + def set_ship_size(self, value): + if value is None: + return + + if type(value) is str and value.isnumeric(): + value = int(value) + + if type(value) is int and 1 <= value <= 4: + self.ship_size = value + + def set_ship_direction(self, value): + if value is None: + return + + if type(value) is not ShipDirection: + return + + if value != ShipDirection.UNKNOWN: + self.ship_direction = value + + def toggle_ship_direction(self): + if self.ship_direction == ShipDirection.VERTICAL: + self.ship_direction = ShipDirection.HORIZONTAL + else: + self.ship_direction = ShipDirection.VERTICAL + + def set_field_mode(self, value): + if value is None: + return + + if type(value) is not ShipMode: + return + + self.field_mode = value + + def print_field(self): + print(self.ships) + for r in range(0, ShipField.field_size): + blocked_string = "" + ship_string = "" + for c in range(0, ShipField.field_size): + blocked_string += str(self.check_blocked(r, c))[0] + ", " + ship_string += self.field[r * ShipField.field_size + c] + ', ' + print(ship_string[:-2]) + # print(blocked_string[:-2] + ' ' + ship_string[:-2]) + print("********************************************************************") + + @staticmethod + def convert_to_json(obj): + if isinstance(obj, ShipField): + result = copy.deepcopy(obj.__dict__) + result['field_mode'] = obj.field_mode.value + result['ship_direction'] = obj.ship_direction.value + return result diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipMode.py b/HNS/Excercises/ShipCraft/Переделка/ShipMode.py index dbffd33..6cd65f8 100644 --- a/HNS/Excercises/ShipCraft/Переделка/ShipMode.py +++ b/HNS/Excercises/ShipCraft/Переделка/ShipMode.py @@ -1,17 +1,17 @@ -from enum import Enum - - -class ShipMode(Enum): - PUT = 'PUT' - SHOOT = 'SHOOT' - INACTIVE = 'INACTIVE' - - @staticmethod - def from_string(raw_value): - if raw_value: - value = raw_value.upper() - if value in ShipMode.__members__: - return ShipMode[value] - return ShipMode.INACTIVE - - +from enum import Enum + + +class ShipMode(Enum): + PUT = 'PUT' + SHOOT = 'SHOOT' + INACTIVE = 'INACTIVE' + + @staticmethod + def from_string(raw_value): + if raw_value: + value = raw_value.upper() + if value in ShipMode.__members__: + return ShipMode[value] + return ShipMode.INACTIVE + + diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipView.py b/HNS/Excercises/ShipCraft/Переделка/ShipView.py index b3f1247..cad93d3 100644 --- a/HNS/Excercises/ShipCraft/Переделка/ShipView.py +++ b/HNS/Excercises/ShipCraft/Переделка/ShipView.py @@ -1,12 +1,12 @@ -from ShipField import ShipField -from tkinter import StringVar - - -class ShipView: - - def __init__(self, ship_field, buttons, enemy): - self.ship_field = ship_field - self.buttons = buttons - self.remaining_ship_text = StringVar() - self.enemy = enemy - self.active = False +from ShipField import ShipField +from tkinter import StringVar + + +class ShipView: + + def __init__(self, ship_field, buttons, enemy): + self.ship_field = ship_field + self.buttons = buttons + self.remaining_ship_text = StringVar() + self.enemy = enemy + self.active = False diff --git a/HNS/Excercises/ShipCraft/Переделка/ShootResult.py b/HNS/Excercises/ShipCraft/Переделка/ShootResult.py index b5b13da..b64107a 100644 --- a/HNS/Excercises/ShipCraft/Переделка/ShootResult.py +++ b/HNS/Excercises/ShipCraft/Переделка/ShootResult.py @@ -1,8 +1,8 @@ -from enum import Enum - - -class ShootResult(Enum): - EMPTY = "EMPTY" - DAMAGED = "DAMAGED" - KILLED = "KILLED" - UNDEFINED = "UNDEFINED" +from enum import Enum + + +class ShootResult(Enum): + EMPTY = "EMPTY" + DAMAGED = "DAMAGED" + KILLED = "KILLED" + UNDEFINED = "UNDEFINED" diff --git a/HNS/Excercises/ShipCraft/Переделка/Test.py b/HNS/Excercises/ShipCraft/Переделка/Test.py index b5a15f6..c68eaec 100644 --- a/HNS/Excercises/ShipCraft/Переделка/Test.py +++ b/HNS/Excercises/ShipCraft/Переделка/Test.py @@ -1,78 +1,78 @@ -from ShipField import ShipField - - - -def verify_value(actual, expected): - if actual == expected: - print("OK") - else: - print("ERROR") - - -my_field = ShipField() - -print("set_ship_size()") -my_field.set_ship_size(1) - -verify_value(my_field.ship_size, 1) - -my_field.set_ship_size(0) -my_field.set_ship_size(6) - -verify_value(my_field.ship_size, 1) - -my_field.set_ship_size([]) -my_field.set_ship_size("") -my_field.set_ship_size(None) -my_field.set_ship_size(True) -my_field.set_ship_size(False) -verify_value(my_field.ship_size, 1) - -my_field.set_ship_size("2") -verify_value(my_field.ship_size, 2) -print() - -print("set_ship_direction()") -my_field.set_ship_direction(1) -verify_value(my_field.ship_direction, 1) - -my_field.set_ship_direction(-1) -my_field.set_ship_direction(6) -verify_value(my_field.ship_direction, 1) - -my_field.set_ship_direction([]) -my_field.set_ship_direction("") -my_field.set_ship_direction(None) -my_field.set_ship_direction(True) -my_field.set_ship_direction(False) -verify_value(my_field.ship_direction, 1) - -my_field.set_ship_direction("0") -verify_value(my_field.ship_direction, 0) -print() - -print('toggle_field_mode()') -verify_value(my_field.field_mode, 0) - -my_field.toggle_field_mode() -verify_value(my_field.field_mode, 1) - -my_field.toggle_field_mode() -verify_value(my_field.field_mode, 0) -print() - -print("set_ship()") -verify_value(my_field.field[0], " ") - -my_field.set_ship_size(1,) -my_field.set_ship_direction(0) -my_field.set_ship(0, 0) - -verify_value(my_field.field[0], "1") -print() - -my_field.set_ship_size(4) -my_field.set_ship_direction(0) -my_field.set_ship(5, 5) -my_field.print_field() - +from ShipField import ShipField + + + +def verify_value(actual, expected): + if actual == expected: + print("OK") + else: + print("ERROR") + + +my_field = ShipField() + +print("set_ship_size()") +my_field.set_ship_size(1) + +verify_value(my_field.ship_size, 1) + +my_field.set_ship_size(0) +my_field.set_ship_size(6) + +verify_value(my_field.ship_size, 1) + +my_field.set_ship_size([]) +my_field.set_ship_size("") +my_field.set_ship_size(None) +my_field.set_ship_size(True) +my_field.set_ship_size(False) +verify_value(my_field.ship_size, 1) + +my_field.set_ship_size("2") +verify_value(my_field.ship_size, 2) +print() + +print("set_ship_direction()") +my_field.set_ship_direction(1) +verify_value(my_field.ship_direction, 1) + +my_field.set_ship_direction(-1) +my_field.set_ship_direction(6) +verify_value(my_field.ship_direction, 1) + +my_field.set_ship_direction([]) +my_field.set_ship_direction("") +my_field.set_ship_direction(None) +my_field.set_ship_direction(True) +my_field.set_ship_direction(False) +verify_value(my_field.ship_direction, 1) + +my_field.set_ship_direction("0") +verify_value(my_field.ship_direction, 0) +print() + +print('toggle_field_mode()') +verify_value(my_field.field_mode, 0) + +my_field.toggle_field_mode() +verify_value(my_field.field_mode, 1) + +my_field.toggle_field_mode() +verify_value(my_field.field_mode, 0) +print() + +print("set_ship()") +verify_value(my_field.field[0], " ") + +my_field.set_ship_size(1,) +my_field.set_ship_direction(0) +my_field.set_ship(0, 0) + +verify_value(my_field.field[0], "1") +print() + +my_field.set_ship_size(4) +my_field.set_ship_direction(0) +my_field.set_ship(5, 5) +my_field.print_field() + diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/GameMode.cpython-312.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/GameMode.cpython-312.pyc new file mode 100644 index 0000000..9eca069 Binary files /dev/null and b/HNS/Excercises/ShipCraft/Переделка/__pycache__/GameMode.cpython-312.pyc differ diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipDirection.cpython-312.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipDirection.cpython-312.pyc new file mode 100644 index 0000000..f40e9ab Binary files /dev/null and b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipDirection.cpython-312.pyc differ diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-312.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-312.pyc new file mode 100644 index 0000000..f282e31 Binary files /dev/null and b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-312.pyc differ diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipMode.cpython-312.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipMode.cpython-312.pyc new file mode 100644 index 0000000..fbacaf1 Binary files /dev/null and b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipMode.cpython-312.pyc differ diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipView.cpython-312.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipView.cpython-312.pyc new file mode 100644 index 0000000..c8bc68b Binary files /dev/null and b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipView.cpython-312.pyc differ diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShootResult.cpython-312.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShootResult.cpython-312.pyc new file mode 100644 index 0000000..89dc459 Binary files /dev/null and b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShootResult.cpython-312.pyc differ diff --git a/HNS/Excercises/ShipCraft/Переделка/main.py b/HNS/Excercises/ShipCraft/Переделка/main.py index dc1f71f..90f35ec 100644 --- a/HNS/Excercises/ShipCraft/Переделка/main.py +++ b/HNS/Excercises/ShipCraft/Переделка/main.py @@ -1,287 +1,289 @@ -import json -import os -import random -import time -from tkinter import * -from tkinter import filedialog -from ShipView import ShipView -from ShipMode import ShipMode -from ShipField import ShipField -from GameMode import GameMode -from ShootResult import ShootResult - - - -def create_view(window, enemy): - field = ShipField() - buttons = [] - view = ShipView(field, buttons, enemy) - for r in range(0, field.field_size): - for c in range(0, field.field_size): - btn = Button(window, text='', width=5, height=2) - btn.bind('', lambda e, x=r, y=c: left_button_click(view, x, y)) - btn.bind('', lambda e: right_button_click(view)) - btn.bind('', lambda e, x=r, y=c: button_enter(view, x, y)) - buttons.append(btn) - - colorize(view) - return view - -def show_view(view, col_offset=0, row_offset=0): - field_size = view.ship_field.field_size - - for r in range(0, field_size): - for c in range(0, field_size): - btn = view.buttons[r * field_size +c] - btn.grid(column=c + col_offset, row=r + row_offset) - -def hide_view(view): - for button in view.buttons: - button.grid_forget() - - -def colorize(view): - field = view.ship_field - for i in range(len(field.field)): - bg = "white" - if field.field[i] == "1" and not view.enemy: - bg = 'pink' - if field.field[i] == "\\": - bg = 'grey' - if field.field[i] == "0": - bg = 'black' - if field.field[i] == "p": - bg = 'blue' - if field.field[i] == "r": - bg = 'red' - if "+" in field.field[i] and view.enemy: - bg = 'orange' - - view.buttons[i].configure(bg=bg) - - refresh_remaining_ships_label(view) - - -def keypress_handler(e): - if e.keysym.isnumeric(): - if my_view.active: - my_view.ship_field.set_ship_size(int(e.keysym)) - elif enemy_view.active: - enemy_view.ship_field.set_ship_size(int(e.keysym)) - - -def left_button_click(view, row, col): - - action_result = view.ship_field.action(row, col) - - if action_result and view.enemy and game_mode == GameMode.BATTLE: - # Ход соперника - enemy_shoot_result = ShootResult.UNDEFINED - - while enemy_shoot_result != ShootResult.EMPTY: - my_row = random.randint(0, ShipField.field_size - 1) - my_col = random.randint(0, ShipField.field_size - 1) - - enemy_shoot_result = my_view.ship_field.shoot(my_row, my_col) - if game_mode == GameMode.BATTLE and my_view.ship_field.check_end(): - next_game_mode() - return - colorize(my_view) - - if game_mode == GameMode.BATTLE and view.ship_field.check_end(): - next_game_mode() - return - - colorize(view) - - -def right_button_click(view): - view.ship_field.toggle_ship_direction() - colorize(view) - - -def button_enter(view, row, col): - if view.enemy: - my_view.ship_field.clear_marker() - enemy_view.ship_field.target(row, col) - - enemy_view.active = True - my_view.active = False - else: - enemy_view.ship_field.clear_marker() - my_view.ship_field.target(row, col) - - enemy_view.active = False - my_view.active = True - - colorize(my_view) - colorize(enemy_view) - - -def savebutton_click(view): - file_path = filedialog.asksaveasfilename(filetypes=[("JSON files", "*.json")]) - if file_path: - with open(file_path, "w") as f: - json.dump({"shipField": view.ship_field}, f, default=ShipField.convert_to_json) - - -def loadbutton_click(view): - file_path = filedialog.askopenfilename(filetypes=[('JSON files', '*.json')]) - - load_field(view, file_path) - - -def load_field(view, file_path): - if os.path.isfile(file_path): - with open(file_path) as lines: - view.ship_field.from_json(json.load(lines)['shipField']) - - colorize(view) - -def refresh_remaining_ships_label(view): - text = '' - for i in range(1, 5): - count = view.ship_field.ships.count(i) - if count > 0: - text += f'{"[]" * i}: {count}, ' - view.remaining_ship_text.set(text[:-2]) - - -def next_game_mode(): - global game_mode - - if game_mode == GameMode.MENU: - game_mode = GameMode.PLAN - elif game_mode == GameMode.PLAN: - game_mode = GameMode.BATTLE - elif game_mode == GameMode.BATTLE: - game_mode = GameMode.END - - update_game_mode() - - - -def update_game_mode(): - global game_mode - - if game_mode == GameMode.MENU: - window.geometry('400x280') - my_view.ship_field.set_field_mode(ShipMode.INACTIVE) - enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) - - lbl_lower_enemy_horizontal.grid_forget() - lbl_lower_horizontal.grid_forget() - - savebutton.grid_forget() - loadbutton.grid_forget() - - start_button.grid(column=start_column_enemy_field, row=load_button_row, columnspan=4) - load_game_button.grid(column=start_column_enemy_field, row=load_button_row + 1, columnspan=4) - exit_button.grid(column=start_column_enemy_field, row=load_button_row + 2, columnspan=4) - - hide_view(my_view) - hide_view(enemy_view) - - elif game_mode == GameMode.PLAN: - window.geometry('1020x640') - - load_field(enemy_view, "default.json") - - my_view.ship_field.set_field_mode(ShipMode.PUT) - enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) - - lbl_lower_enemy_horizontal.grid(column=start_column_my_field, row=row_horizontal_separator, columnspan=10) - lbl_lower_horizontal.grid(column=start_column_enemy_field, row=row_horizontal_separator, columnspan=10) - - savebutton.grid(column=start_column_my_field, row=load_button_row, columnspan=4) - loadbutton.grid(column=start_column_my_field + 6, row=load_button_row, columnspan=4) - - start_button.grid(column=start_column_my_field + 11, row=load_button_row, columnspan=4) - load_game_button.grid_forget() - exit_button.grid_forget() - - show_view(my_view, start_column_my_field, start_row_my_field) - show_view(enemy_view, start_column_enemy_field, start_row_enemy_field) - - elif game_mode == GameMode.BATTLE: - window.geometry('1020x640') - my_view.ship_field.set_field_mode(ShipMode.INACTIVE) - enemy_view.ship_field.set_field_mode(ShipMode.SHOOT) - - lbl_lower_enemy_horizontal.grid_forget() - lbl_lower_horizontal.grid_forget() - - savebutton.grid_forget() - loadbutton.grid_forget() - - start_button.grid_forget() - load_game_button.grid_forget() - exit_button.grid_forget() - - show_view(my_view, start_column_my_field, start_row_my_field) - show_view(enemy_view, start_column_enemy_field, start_row_enemy_field) - - elif game_mode == GameMode.END: - window.geometry('400x280') - my_view.ship_field.set_field_mode(ShipMode.INACTIVE) - enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) - - lbl_lower_enemy_horizontal.grid_forget() - lbl_lower_horizontal.grid_forget() - - savebutton.grid_forget() - loadbutton.grid_forget() - - start_button.grid_forget() - load_game_button.grid_forget() - exit_button.grid_forget() - - hide_view(my_view) - hide_view(enemy_view) - - lbl_left_vertical.grid(column=start_column_my_field - 1, row=start_row_my_field) - lbl_center_vertical.grid(column=col_vertical_separator, row=start_row_my_field) - lbl_upper_horizontal.grid(column=start_column_my_field, row=start_row_my_field - 1) - - -window = Tk() -window.title("Ship Craft!") -window.bind_all('', keypress_handler) - -start_column_my_field = 1 -start_row_my_field = 1 - -start_column_enemy_field = start_column_my_field + ShipField.field_size + 1 -start_row_enemy_field = start_row_my_field - -col_vertical_separator = start_column_my_field + ShipField.field_size -row_horizontal_separator = start_row_my_field + ShipField.field_size - -load_button_row = start_row_my_field + ShipField.field_size + 1 - -my_view = create_view(window, False) -enemy_view = create_view(window, True) - -lbl_left_vertical = Label(window, text='', width=5, height=2) -lbl_center_vertical = Label(window, text='', width=5, height=2) -lbl_upper_horizontal = Label(window, text='', width=5, height=2) - - - -lbl_lower_horizontal = Label(window, text='', width=50, height=2, textvariable=my_view.remaining_ship_text) -lbl_lower_enemy_horizontal = Label(window, text='', width=50, height=2, textvariable=enemy_view.remaining_ship_text) - - -savebutton = Button(window, text='Save', width=20, height=2, command=lambda: savebutton_click(my_view)) -loadbutton = Button(window, text='Load', width=20, height=2, command=lambda: loadbutton_click(my_view)) - -start_button = Button(window, text='START', width=20, height=2, command=next_game_mode) -load_game_button = Button(window, text='LOAD', width=20, height=2) -exit_button = Button(window, text='EXIT', width=20, height=2) - - -game_mode = GameMode.MENU -update_game_mode() - -window.mainloop() - +import json +import os +import random +import time +from tkinter import * +from tkinter import filedialog +from ShipView import ShipView +from ShipMode import ShipMode +from ShipField import ShipField +from GameMode import GameMode +from ShootResult import ShootResult + + + +def create_view(window, enemy): + field = ShipField() + buttons = [] + view = ShipView(field, buttons, enemy) + for r in range(0, field.field_size): + for c in range(0, field.field_size): + btn = Button(window, text='', width=5, height=2) + btn.bind('', lambda e, x=r, y=c: left_button_click(view, x, y)) + btn.bind('', lambda e: right_button_click(view)) + btn.bind('', lambda e, x=r, y=c: button_enter(view, x, y)) + buttons.append(btn) + + colorize(view) + return view + +def show_view(view, col_offset=0, row_offset=0): + field_size = view.ship_field.field_size + + for r in range(0, field_size): + for c in range(0, field_size): + btn = view.buttons[r * field_size +c] + btn.grid(column=c + col_offset, row=r + row_offset) + +def hide_view(view): + for button in view.buttons: + button.grid_forget() + + +def colorize(view): + field = view.ship_field + for i in range(len(field.field)): + bg = "white" + if field.field[i] == "1" and not view.enemy: + bg = 'pink' + if field.field[i] == "\\": + bg = 'grey' + if field.field[i] == "x": + bg = 'red' + if field.field[i] == "0": + bg = 'black' + if field.field[i] == "p": + bg = 'blue' + if field.field[i] == "r": + bg = 'red' + if "+" in field.field[i] and view.enemy: + bg = 'orange' + + view.buttons[i].configure(bg=bg) + + refresh_remaining_ships_label(view) + + +def keypress_handler(e): + if e.keysym.isnumeric(): + if my_view.active: + my_view.ship_field.set_ship_size(int(e.keysym)) + elif enemy_view.active: + enemy_view.ship_field.set_ship_size(int(e.keysym)) + + +def left_button_click(view, row, col): + + action_result = view.ship_field.action(row, col) + + if action_result and view.enemy and game_mode == GameMode.BATTLE: + # Ход соперника + enemy_shoot_result = ShootResult.UNDEFINED + + while enemy_shoot_result != ShootResult.EMPTY: + my_row = random.randint(0, ShipField.field_size - 1) + my_col = random.randint(0, ShipField.field_size - 1) + + enemy_shoot_result = my_view.ship_field.shoot(my_row, my_col) + if game_mode == GameMode.BATTLE and my_view.ship_field.check_end(): + next_game_mode() + return + colorize(my_view) + + if game_mode == GameMode.BATTLE and view.ship_field.check_end(): + next_game_mode() + return + + colorize(view) + + +def right_button_click(view): + view.ship_field.toggle_ship_direction() + colorize(view) + + +def button_enter(view, row, col): + if view.enemy: + my_view.ship_field.clear_marker() + enemy_view.ship_field.target(row, col) + + enemy_view.active = True + my_view.active = False + else: + enemy_view.ship_field.clear_marker() + my_view.ship_field.target(row, col) + + enemy_view.active = False + my_view.active = True + + colorize(my_view) + colorize(enemy_view) + + +def savebutton_click(view): + file_path = filedialog.asksaveasfilename(filetypes=[("JSON files", "*.json")]) + if file_path: + with open(file_path, "w") as f: + json.dump({"shipField": view.ship_field}, f, default=ShipField.convert_to_json) + + +def loadbutton_click(view): + file_path = filedialog.askopenfilename(filetypes=[('JSON files', '*.json')]) + + load_field(view, file_path) + + +def load_field(view, file_path): + if os.path.isfile(file_path): + with open(file_path) as lines: + view.ship_field.from_json(json.load(lines)['shipField']) + + colorize(view) + +def refresh_remaining_ships_label(view): + text = '' + for i in range(1, 5): + count = view.ship_field.ships.count(i) + if count > 0: + text += f'{"[]" * i}: {count}, ' + view.remaining_ship_text.set(text[:-2]) + + +def next_game_mode(): + global game_mode + + if game_mode == GameMode.MENU: + game_mode = GameMode.PLAN + elif game_mode == GameMode.PLAN: + game_mode = GameMode.BATTLE + elif game_mode == GameMode.BATTLE: + game_mode = GameMode.END + + update_game_mode() + + + +def update_game_mode(): + global game_mode + + if game_mode == GameMode.MENU: + window.geometry('400x280') + my_view.ship_field.set_field_mode(ShipMode.INACTIVE) + enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) + + lbl_lower_enemy_horizontal.grid_forget() + lbl_lower_horizontal.grid_forget() + + savebutton.grid_forget() + loadbutton.grid_forget() + + start_button.grid(column=start_column_enemy_field, row=load_button_row, columnspan=4) + load_game_button.grid(column=start_column_enemy_field, row=load_button_row + 1, columnspan=4) + exit_button.grid(column=start_column_enemy_field, row=load_button_row + 2, columnspan=4) + + hide_view(my_view) + hide_view(enemy_view) + + elif game_mode == GameMode.PLAN: + window.geometry('1020x640') + + load_field(enemy_view, "default.json") + + my_view.ship_field.set_field_mode(ShipMode.PUT) + enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) + + lbl_lower_enemy_horizontal.grid(column=start_column_my_field, row=row_horizontal_separator, columnspan=10) + lbl_lower_horizontal.grid(column=start_column_enemy_field, row=row_horizontal_separator, columnspan=10) + + savebutton.grid(column=start_column_my_field, row=load_button_row, columnspan=4) + loadbutton.grid(column=start_column_my_field + 6, row=load_button_row, columnspan=4) + + start_button.grid(column=start_column_my_field + 11, row=load_button_row, columnspan=4) + load_game_button.grid_forget() + exit_button.grid_forget() + + show_view(my_view, start_column_my_field, start_row_my_field) + show_view(enemy_view, start_column_enemy_field, start_row_enemy_field) + + elif game_mode == GameMode.BATTLE: + window.geometry('1020x640') + my_view.ship_field.set_field_mode(ShipMode.INACTIVE) + enemy_view.ship_field.set_field_mode(ShipMode.SHOOT) + + lbl_lower_enemy_horizontal.grid_forget() + lbl_lower_horizontal.grid_forget() + + savebutton.grid_forget() + loadbutton.grid_forget() + + start_button.grid_forget() + load_game_button.grid_forget() + exit_button.grid_forget() + + show_view(my_view, start_column_my_field, start_row_my_field) + show_view(enemy_view, start_column_enemy_field, start_row_enemy_field) + + elif game_mode == GameMode.END: + window.geometry('400x280') + my_view.ship_field.set_field_mode(ShipMode.INACTIVE) + enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) + + lbl_lower_enemy_horizontal.grid_forget() + lbl_lower_horizontal.grid_forget() + + savebutton.grid_forget() + loadbutton.grid_forget() + + start_button.grid_forget() + load_game_button.grid_forget() + exit_button.grid_forget() + + hide_view(my_view) + hide_view(enemy_view) + + lbl_left_vertical.grid(column=start_column_my_field - 1, row=start_row_my_field) + lbl_center_vertical.grid(column=col_vertical_separator, row=start_row_my_field) + lbl_upper_horizontal.grid(column=start_column_my_field, row=start_row_my_field - 1) + + +window = Tk() +window.title("Ship Craft!") +window.bind_all('', keypress_handler) + +start_column_my_field = 1 +start_row_my_field = 1 + +start_column_enemy_field = start_column_my_field + ShipField.field_size + 1 +start_row_enemy_field = start_row_my_field + +col_vertical_separator = start_column_my_field + ShipField.field_size +row_horizontal_separator = start_row_my_field + ShipField.field_size + +load_button_row = start_row_my_field + ShipField.field_size + 1 + +my_view = create_view(window, False) +enemy_view = create_view(window, True) + +lbl_left_vertical = Label(window, text='', width=5, height=2) +lbl_center_vertical = Label(window, text='', width=5, height=2) +lbl_upper_horizontal = Label(window, text='', width=5, height=2) + + + +lbl_lower_horizontal = Label(window, text='', width=50, height=2, textvariable=my_view.remaining_ship_text) +lbl_lower_enemy_horizontal = Label(window, text='', width=50, height=2, textvariable=enemy_view.remaining_ship_text) + + +savebutton = Button(window, text='Save', width=20, height=2, command=lambda: savebutton_click(my_view)) +loadbutton = Button(window, text='Load', width=20, height=2, command=lambda: loadbutton_click(my_view)) + +start_button = Button(window, text='START', width=20, height=2, command=next_game_mode) +load_game_button = Button(window, text='LOAD', width=20, height=2) +exit_button = Button(window, text='EXIT', width=20, height=2) + + +game_mode = GameMode.MENU +update_game_mode() + +window.mainloop() + diff --git a/HNS/Excercises/ShipCraft/Переделка/test_ShipField.py b/HNS/Excercises/ShipCraft/Переделка/test_ShipField.py index 14fde4a..3fdfd5a 100644 --- a/HNS/Excercises/ShipCraft/Переделка/test_ShipField.py +++ b/HNS/Excercises/ShipCraft/Переделка/test_ShipField.py @@ -1,281 +1,281 @@ -from unittest import TestCase -from ShipField import ShipField -from ShootResult import ShootResult -from ShipMode import ShipMode -from ShipDirection import ShipDirection - - -class TestShipField(TestCase): - - def test_set_ship_size(self): - ship_field = ShipField() # Заводим объект типа ShipField - - ship_field.set_ship_size(1) - self.assertEqual(ship_field.ship_size, 1) - ship_field.set_ship_size(2) - self.assertEqual(ship_field.ship_size, 2) - ship_field.set_ship_size(3) - self.assertEqual(ship_field.ship_size, 3) - ship_field.set_ship_size(4) - self.assertEqual(ship_field.ship_size, 4) - - def test_set_ship_size_outofrange(self): - ship_field = ShipField() # Заводим объект типа ShipField - ship_field.set_ship_size(1) - - ship_field.set_ship_size(-1) - self.assertEqual(ship_field.ship_size, 1) - ship_field.set_ship_size(0) - self.assertEqual(ship_field.ship_size, 1) - ship_field.set_ship_size(6) - self.assertEqual(ship_field.ship_size, 1) - ship_field.set_ship_size(100) - self.assertEqual(ship_field.ship_size, 1) - - def test_set_ship_size_wrongtype(self): - ship_field = ShipField() # Заводим объект типа ShipField - ship_field.set_ship_size(1) - - ship_field.set_ship_size([]) - self.assertEqual(ship_field.ship_size, 1) - ship_field.set_ship_size('') - self.assertEqual(ship_field.ship_size, 1) - ship_field.set_ship_size(None) - self.assertEqual(ship_field.ship_size, 1) - ship_field.set_ship_size(False) - self.assertEqual(ship_field.ship_size, 1) - - def test_toggle_field_mode(self): - ship_field = ShipField() # Заводим объект типа ShipField - self.assertEqual(ship_field.field_mode, ShipMode.PUT) # Проверяем, что изначальное значение field_mode равно 0 - - ship_field.toggle_field_mode() # Вызываем метод, который тестируем - self.assertEqual(ship_field.field_mode, ShipMode.SHOOT) # Проверяем, что field_mode принял желаемое значение - - ship_field.toggle_field_mode() # Вызываем метод, который тестируем - self.assertEqual(ship_field.field_mode, ShipMode.PUT) # Проверяем, что field_mode принял желаемое значение - - def test_action(self): - self.fail() - - def test_target_ShipMode_PUT(self): - ship_field = ShipField() - ship_field.set_ship_size(3) - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - index = 5 * ship_field.field_size + 5 - - old_field_string = str.join(' ', ship_field.field) - ship_field.target(5, 5) - field_after_target = [ship_field.field[index], ship_field.field[index + 1], ship_field.field[index + 2]] - ship_field.field[index] = ' ' - ship_field.field[index + 1] = ' ' - ship_field.field[index + 2] = ' ' - - new_field_string = str.join(' ', ship_field.field) - - self.assertListEqual(['p', 'p', 'p'], field_after_target) - self.assertNotIn('p', new_field_string) - self.assertEqual(new_field_string, old_field_string) - - def test_target_ShipMode_SHOOT(self): - ship_field = ShipField() - ship_field.toggle_field_mode() - - index = 5 * ship_field.field_size + 5 - - old_field_string = str.join(' ', ship_field.field) - ship_field.target(5, 5) - field_after_target = ship_field.field[index] - ship_field.field[index] = ship_field.field[index].replace('+', '') - new_field_string = str.join(' ', ship_field.field) - - self.assertIn('+', field_after_target) - self.assertNotIn('+', new_field_string) - self.assertEqual(new_field_string, old_field_string) - - def get_ship(self): - self.fail() - - def test_clear_marker(self): - ship_field = ShipField() - ship_field.field[0] = 'p' - ship_field.field[ship_field.field_size - 1] = 'p' - ship_field.field[ship_field.field_size - 4] = 'r' - ship_field.clear_marker() - - self.assertNotIn('p', ship_field.field) - self.assertNotIn('r', ship_field.field) - - def test_shoot_empty(self): - ship_field = ShipField() - - self.assertEqual(ship_field.field[0].strip(), '') - result = ship_field.shoot(0, 0) - - self.assertEqual(ship_field.field[0].strip(), '0') - self.assertEqual(result, ShootResult.EMPTY) - - def test_shoot_ship(self): - ship_field = ShipField() - - ship_field.field[0] = '1' - result = ship_field.shoot(0, 0) - - self.assertEqual(ship_field.field[0].strip(), '\\') - self.assertEqual(result, ShootResult.DAMAGED) - - def test_shoot_unknown(self): - ship_field = ShipField() - - ship_field.field[0] = 'x' - result = ship_field.shoot(0, 0) - - self.assertEqual(ship_field.field[0].strip(), 'x') - self.assertEqual(result, ShootResult.UNDEFINED) - - def test_shoot_outofrange(self): - ship_field = ShipField() - old_field_string = str.join(' ', ship_field.field) - - result = ship_field.shoot(-1, -1) - self.assertEqual(result, ShootResult.UNDEFINED) - - result = ship_field.shoot(-1, 0) - self.assertEqual(result, ShootResult.UNDEFINED) - - result = ship_field.shoot(1000, 1000) - self.assertEqual(result, ShootResult.UNDEFINED) - - result = ship_field.shoot(0, 1000) - self.assertEqual(result, ShootResult.UNDEFINED) - - new_field_string = str.join(' ', ship_field.field) - self.assertEqual(new_field_string, old_field_string) - - def test_check_possible_false(self): - # arrangement установка - ship_field = ShipField() - ship_field.set_ship_size(4) - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - # action действие - ship_field.set_ship(5, 3) - # assertion проверка занятых - self.assertEqual(ship_field.check_possible(5, 3), False) - self.assertEqual(ship_field.check_possible(5, 4), False) - self.assertEqual(ship_field.check_possible(5, 5), False) - self.assertEqual(ship_field.check_possible(5, 6), False) - # проверка строки ниже - self.assertEqual(ship_field.check_possible(6, 3), False) - self.assertEqual(ship_field.check_possible(6, 4), False) - self.assertEqual(ship_field.check_possible(6, 5), False) - self.assertEqual(ship_field.check_possible(6, 6), False) - # проверка строки выше - self.assertEqual(ship_field.check_possible(4, 3), False) - self.assertEqual(ship_field.check_possible(4, 4), False) - self.assertEqual(ship_field.check_possible(4, 5), False) - self.assertEqual(ship_field.check_possible(4, 6), False) - - def test_check_possible_true(self): - # arrangement установка - ship_field = ShipField() - ship_field.set_ship_size(4) - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - # action действие - ship_field.set_ship(5, 3) - - # проверка свободных ниже на 2 строки - self.assertEqual(ship_field.check_possible(7, 3), True) - self.assertEqual(ship_field.check_possible(7, 4), True) - self.assertEqual(ship_field.check_possible(7, 5), True) - self.assertEqual(ship_field.check_possible(7, 6), True) - # проверка свободных ВЫШЕ на 2 строки - self.assertEqual(ship_field.check_possible(3, 3), True) - self.assertEqual(ship_field.check_possible(3, 4), True) - self.assertEqual(ship_field.check_possible(3, 5), True) - self.assertEqual(ship_field.check_possible(3, 6), True) - - - def test_check_blocked(self): - # arrangement установка - ship_field = ShipField() - ship_field.set_ship_size(4) - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - # action действие - ship_field.set_ship(5, 3) - # assertion проверка занятых - self.assertEqual(ship_field.check_blocked(5, 3), False) - self.assertEqual(ship_field.check_blocked(5, 4), False) - self.assertEqual(ship_field.check_blocked(5, 5), False) - self.assertEqual(ship_field.check_blocked(5, 6), False) - #проверка строки ниже - self.assertEqual(ship_field.check_blocked(6, 3), False) - self.assertEqual(ship_field.check_blocked(6, 4), False) - self.assertEqual(ship_field.check_blocked(6, 5), False) - self.assertEqual(ship_field.check_blocked(6, 7), False) - #проверка свободных ниже на 2 строки - self.assertEqual(ship_field.check_blocked(7, 3), True) - self.assertEqual(ship_field.check_blocked(7, 4), True) - self.assertEqual(ship_field.check_blocked(7, 5), True) - self.assertEqual(ship_field.check_blocked(7, 6), True) - - def test_set_ship_direction(self): - ship_field = ShipField() # Заводим объект типа ShipField - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) - - ship_field.set_ship_direction(ShipDirection.VERTICAL) - self.assertEqual(ship_field.ship_direction, ShipDirection.VERTICAL) - - def test_set_ship_direction_outofrange(self): - ship_field = ShipField() # Заводим объект типа ShipField - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - - ship_field.set_ship_direction(-1) - ship_field.set_ship_direction(2) - self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) - - def test_set_ship_direction_wrongtype(self): - ship_field = ShipField() # Заводим объект типа ShipField - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - - ship_field.set_ship_direction(None) - ship_field.set_ship_direction([2]) - ship_field.set_ship_direction({}) - self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) - - def test_toggle_ship_direction(self): - # arrangement установка - ship_field = ShipField() - ship_field.set_ship_direction(ShipDirection.VERTICAL) - # action действие - ship_field.toggle_ship_direction() - # assertion проверка - self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) - - ship_field.toggle_ship_direction() - self.assertEqual(ship_field.ship_direction, ShipDirection.VERTICAL) - - def test_set_ship(self): - # arrangement установка - ship_field = ShipField() - ship_field.set_ship_size(4) - ship_field.set_ship_direction(ShipDirection.HORIZONTAL) - # action действие - ship_field.set_ship(5, 3) - # assertion проверка - self.assertEqual(ship_field.field[53].strip(), '1') - self.assertEqual(ship_field.field[54].strip(), '1') - self.assertEqual(ship_field.field[55].strip(), '1') - self.assertEqual(ship_field.field[56].strip(), '1') - - def test_set_ship_size4_vertical_outofrange(self): - # arrangement установка - ship_field = ShipField() - ship_field.set_ship_size(4) - ship_field.set_ship_direction(ShipDirection.VERTICAL) - old_field_string = str.join(" ", ship_field.field) - # action действие - ship_field.set_ship(7, 3) - # assertion проверка - new_field_string = str.join(" ", ship_field.field) +from unittest import TestCase +from ShipField import ShipField +from ShootResult import ShootResult +from ShipMode import ShipMode +from ShipDirection import ShipDirection + + +class TestShipField(TestCase): + + def test_set_ship_size(self): + ship_field = ShipField() # Заводим объект типа ShipField + + ship_field.set_ship_size(1) + self.assertEqual(ship_field.ship_size, 1) + ship_field.set_ship_size(2) + self.assertEqual(ship_field.ship_size, 2) + ship_field.set_ship_size(3) + self.assertEqual(ship_field.ship_size, 3) + ship_field.set_ship_size(4) + self.assertEqual(ship_field.ship_size, 4) + + def test_set_ship_size_outofrange(self): + ship_field = ShipField() # Заводим объект типа ShipField + ship_field.set_ship_size(1) + + ship_field.set_ship_size(-1) + self.assertEqual(ship_field.ship_size, 1) + ship_field.set_ship_size(0) + self.assertEqual(ship_field.ship_size, 1) + ship_field.set_ship_size(6) + self.assertEqual(ship_field.ship_size, 1) + ship_field.set_ship_size(100) + self.assertEqual(ship_field.ship_size, 1) + + def test_set_ship_size_wrongtype(self): + ship_field = ShipField() # Заводим объект типа ShipField + ship_field.set_ship_size(1) + + ship_field.set_ship_size([]) + self.assertEqual(ship_field.ship_size, 1) + ship_field.set_ship_size('') + self.assertEqual(ship_field.ship_size, 1) + ship_field.set_ship_size(None) + self.assertEqual(ship_field.ship_size, 1) + ship_field.set_ship_size(False) + self.assertEqual(ship_field.ship_size, 1) + + def test_toggle_field_mode(self): + ship_field = ShipField() # Заводим объект типа ShipField + self.assertEqual(ship_field.field_mode, ShipMode.PUT) # Проверяем, что изначальное значение field_mode равно 0 + + ship_field.toggle_field_mode() # Вызываем метод, который тестируем + self.assertEqual(ship_field.field_mode, ShipMode.SHOOT) # Проверяем, что field_mode принял желаемое значение + + ship_field.toggle_field_mode() # Вызываем метод, который тестируем + self.assertEqual(ship_field.field_mode, ShipMode.PUT) # Проверяем, что field_mode принял желаемое значение + + def test_action(self): + self.fail() + + def test_target_ShipMode_PUT(self): + ship_field = ShipField() + ship_field.set_ship_size(3) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + index = 5 * ship_field.field_size + 5 + + old_field_string = str.join(' ', ship_field.field) + ship_field.target(5, 5) + field_after_target = [ship_field.field[index], ship_field.field[index + 1], ship_field.field[index + 2]] + ship_field.field[index] = ' ' + ship_field.field[index + 1] = ' ' + ship_field.field[index + 2] = ' ' + + new_field_string = str.join(' ', ship_field.field) + + self.assertListEqual(['p', 'p', 'p'], field_after_target) + self.assertNotIn('p', new_field_string) + self.assertEqual(new_field_string, old_field_string) + + def test_target_ShipMode_SHOOT(self): + ship_field = ShipField() + ship_field.toggle_field_mode() + + index = 5 * ship_field.field_size + 5 + + old_field_string = str.join(' ', ship_field.field) + ship_field.target(5, 5) + field_after_target = ship_field.field[index] + ship_field.field[index] = ship_field.field[index].replace('+', '') + new_field_string = str.join(' ', ship_field.field) + + self.assertIn('+', field_after_target) + self.assertNotIn('+', new_field_string) + self.assertEqual(new_field_string, old_field_string) + + def get_ship(self): + self.fail() + + def test_clear_marker(self): + ship_field = ShipField() + ship_field.field[0] = 'p' + ship_field.field[ship_field.field_size - 1] = 'p' + ship_field.field[ship_field.field_size - 4] = 'r' + ship_field.clear_marker() + + self.assertNotIn('p', ship_field.field) + self.assertNotIn('r', ship_field.field) + + def test_shoot_empty(self): + ship_field = ShipField() + + self.assertEqual(ship_field.field[0].strip(), '') + result = ship_field.shoot(0, 0) + + self.assertEqual(ship_field.field[0].strip(), '0') + self.assertEqual(result, ShootResult.EMPTY) + + def test_shoot_ship(self): + ship_field = ShipField() + + ship_field.field[0] = '1' + result = ship_field.shoot(0, 0) + + self.assertEqual(ship_field.field[0].strip(), '\\') + self.assertEqual(result, ShootResult.DAMAGED) + + def test_shoot_unknown(self): + ship_field = ShipField() + + ship_field.field[0] = 'x' + result = ship_field.shoot(0, 0) + + self.assertEqual(ship_field.field[0].strip(), 'x') + self.assertEqual(result, ShootResult.UNDEFINED) + + def test_shoot_outofrange(self): + ship_field = ShipField() + old_field_string = str.join(' ', ship_field.field) + + result = ship_field.shoot(-1, -1) + self.assertEqual(result, ShootResult.UNDEFINED) + + result = ship_field.shoot(-1, 0) + self.assertEqual(result, ShootResult.UNDEFINED) + + result = ship_field.shoot(1000, 1000) + self.assertEqual(result, ShootResult.UNDEFINED) + + result = ship_field.shoot(0, 1000) + self.assertEqual(result, ShootResult.UNDEFINED) + + new_field_string = str.join(' ', ship_field.field) + self.assertEqual(new_field_string, old_field_string) + + def test_check_possible_false(self): + # arrangement установка + ship_field = ShipField() + ship_field.set_ship_size(4) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + # action действие + ship_field.set_ship(5, 3) + # assertion проверка занятых + self.assertEqual(ship_field.check_possible(5, 3), False) + self.assertEqual(ship_field.check_possible(5, 4), False) + self.assertEqual(ship_field.check_possible(5, 5), False) + self.assertEqual(ship_field.check_possible(5, 6), False) + # проверка строки ниже + self.assertEqual(ship_field.check_possible(6, 3), False) + self.assertEqual(ship_field.check_possible(6, 4), False) + self.assertEqual(ship_field.check_possible(6, 5), False) + self.assertEqual(ship_field.check_possible(6, 6), False) + # проверка строки выше + self.assertEqual(ship_field.check_possible(4, 3), False) + self.assertEqual(ship_field.check_possible(4, 4), False) + self.assertEqual(ship_field.check_possible(4, 5), False) + self.assertEqual(ship_field.check_possible(4, 6), False) + + def test_check_possible_true(self): + # arrangement установка + ship_field = ShipField() + ship_field.set_ship_size(4) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + # action действие + ship_field.set_ship(5, 3) + + # проверка свободных ниже на 2 строки + self.assertEqual(ship_field.check_possible(7, 3), True) + self.assertEqual(ship_field.check_possible(7, 4), True) + self.assertEqual(ship_field.check_possible(7, 5), True) + self.assertEqual(ship_field.check_possible(7, 6), True) + # проверка свободных ВЫШЕ на 2 строки + self.assertEqual(ship_field.check_possible(3, 3), True) + self.assertEqual(ship_field.check_possible(3, 4), True) + self.assertEqual(ship_field.check_possible(3, 5), True) + self.assertEqual(ship_field.check_possible(3, 6), True) + + + def test_check_blocked(self): + # arrangement установка + ship_field = ShipField() + ship_field.set_ship_size(4) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + # action действие + ship_field.set_ship(5, 3) + # assertion проверка занятых + self.assertEqual(ship_field.check_blocked(5, 3), False) + self.assertEqual(ship_field.check_blocked(5, 4), False) + self.assertEqual(ship_field.check_blocked(5, 5), False) + self.assertEqual(ship_field.check_blocked(5, 6), False) + #проверка строки ниже + self.assertEqual(ship_field.check_blocked(6, 3), False) + self.assertEqual(ship_field.check_blocked(6, 4), False) + self.assertEqual(ship_field.check_blocked(6, 5), False) + self.assertEqual(ship_field.check_blocked(6, 7), False) + #проверка свободных ниже на 2 строки + self.assertEqual(ship_field.check_blocked(7, 3), True) + self.assertEqual(ship_field.check_blocked(7, 4), True) + self.assertEqual(ship_field.check_blocked(7, 5), True) + self.assertEqual(ship_field.check_blocked(7, 6), True) + + def test_set_ship_direction(self): + ship_field = ShipField() # Заводим объект типа ShipField + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) + + ship_field.set_ship_direction(ShipDirection.VERTICAL) + self.assertEqual(ship_field.ship_direction, ShipDirection.VERTICAL) + + def test_set_ship_direction_outofrange(self): + ship_field = ShipField() # Заводим объект типа ShipField + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + + ship_field.set_ship_direction(-1) + ship_field.set_ship_direction(2) + self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) + + def test_set_ship_direction_wrongtype(self): + ship_field = ShipField() # Заводим объект типа ShipField + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + + ship_field.set_ship_direction(None) + ship_field.set_ship_direction([2]) + ship_field.set_ship_direction({}) + self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) + + def test_toggle_ship_direction(self): + # arrangement установка + ship_field = ShipField() + ship_field.set_ship_direction(ShipDirection.VERTICAL) + # action действие + ship_field.toggle_ship_direction() + # assertion проверка + self.assertEqual(ship_field.ship_direction, ShipDirection.HORIZONTAL) + + ship_field.toggle_ship_direction() + self.assertEqual(ship_field.ship_direction, ShipDirection.VERTICAL) + + def test_set_ship(self): + # arrangement установка + ship_field = ShipField() + ship_field.set_ship_size(4) + ship_field.set_ship_direction(ShipDirection.HORIZONTAL) + # action действие + ship_field.set_ship(5, 3) + # assertion проверка + self.assertEqual(ship_field.field[53].strip(), '1') + self.assertEqual(ship_field.field[54].strip(), '1') + self.assertEqual(ship_field.field[55].strip(), '1') + self.assertEqual(ship_field.field[56].strip(), '1') + + def test_set_ship_size4_vertical_outofrange(self): + # arrangement установка + ship_field = ShipField() + ship_field.set_ship_size(4) + ship_field.set_ship_direction(ShipDirection.VERTICAL) + old_field_string = str.join(" ", ship_field.field) + # action действие + ship_field.set_ship(7, 3) + # assertion проверка + new_field_string = str.join(" ", ship_field.field) self.assertEqual(new_field_string, old_field_string) \ No newline at end of file