From bbff9b4a418a3090c87c06f56c236f17a7be7c31 Mon Sep 17 00:00:00 2001 From: Artur Savitskiy Date: Thu, 15 Feb 2024 18:27:34 +0100 Subject: [PATCH] WiP commit to not loose changes --- HNS/MB/ShipField.py | 103 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 HNS/MB/ShipField.py diff --git a/HNS/MB/ShipField.py b/HNS/MB/ShipField.py new file mode 100644 index 0000000..2fd8d21 --- /dev/null +++ b/HNS/MB/ShipField.py @@ -0,0 +1,103 @@ +from main import ShootResult + + +class ShipField: + + field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] + + field_size = 10 + field_mode = 0 + ship_size = 4 + ship_direction = 0 + + def __init__(self): + pass + + def set_ship(self, row, col): + if row < 0 or row > self.field_size: + return + if col < 0 or col > self.field_size: + return + index = row * self.field_size + col + if self.ship_direction == 0: + if self.field_size - row < self.ship_size: + return + for r in range(row, row + self.ship_size): + index = r * self.field_size + col + self.field[index] = "1" + if self.ship_direction == 1: + if self.field_size - col < self.ship_size: + return + for c in range(col, col + self.ship_size): + index = row * self.field_size + c + self.field[index] = "1" + + def shoot(self, row, col): + if row < 0 or row > self.field_size - 1: + return ShootResult.UNDEFINED + if col < 0 or col > self.field_size - 1: + return ShootResult.UNDEFINED + index = row * self.field_size + col + if (self.field[index]).strip() == "": + self.field[index] = "0" + return ShootResult.EMPTY + elif (self.field[index]).strip() == "1": + self.field[index] = "\\" + return ShootResult.DAMAGED + else: + return ShootResult.UNDEFINED + + def check_possible(self, row, col): + # Функция должна возвращать True, если можно поставить сюда корабль, + # в противном случае - False + if self.ship_direction == 0: + # Здесь мы знаем, что корабль помещается на поле. + if self.field_size - row >= self.ship_size: + # Теперь нужно проверить, не заблокировано ли какое-то из полей, + for r in range(row, row + self.ship_size): + if not self.check_blocked(self.field, r, col): + return False + return True + + if self.ship_direction == 1: + if self.field_size - col >= self.ship_size: + for c in range(col, col + self.ship_size): + if not self.check_blocked(self.field, 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 < self.field_size and 0 <= c < self.field_size: + cell = (self.field[r * self.field_size + c]).strip() + if cell != '' and cell != 'p': + return False + return True + + def set_ship_size(self, value): + if value is not None and value.isnumeric() and 1 <= value <= 4: + self.ship_size = value + + def set_ship_direction(self, value): + if value is not None and value.isnumeric() and 0 <= value <= 1: + self.ship_direction = value + + def toggle_field_mode(self): + if self.field_mode == 0: + self.field_mode = 1 + else: + self.field_mode = 0