hnc-eduard/HNS/Excercises/ShipCraft/ShipField.py

131 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from main import ShootResult
class ShipField:
def __init__(self):
self.field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
self.field_size = 10
self.field_mode = 0
self.ship_size = 4
self.ship_direction = 0
def action(self, row, col):
if self.field_mode == 0:
if self.check_possible(row, col):
self.set_ship(row, col)
elif self.field_mode == 1:
self.shoot(row, col)
def target(self, row, col):
if self.field_mode == 0:
self.clear_marker()
def clear_marker(self):
for i in range(0, len(self.field)):
if self.field[i] == "p":
self.field[i] = ""
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, ship_direction):
# Функция должна возвращать 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, r, col):
return False
return True
if 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, 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.isnumeric():
number = int(value)
if 1 <= number <= 4:
self.ship_size = number
def set_ship_direction(self, value):
if value.isnumeric() == 0 or value.isnumeric() == 1:
self.ship_direction = value
def toggle_field_mode(self):
if self.field_mode == 0:
self.field_mode = 1
else:
self.field_mode = 0
def print_field(self):
for r in range(0, self.field_size):
blocked_string = ""
ship_string = ""
for c in range(0, self.field_size):
blocked_string += str(self.check_blocked(self, r, c))[0] + ", "
ship_string += self.field[r * self.field_size + c] + ', '
print(blocked_string[:-2] + ' ' + ship_string[:-2])
print("********************************************************************")