add kill check & kill marker

This commit is contained in:
ehermakov 2024-07-21 20:40:04 +03:00
parent 112b9a1394
commit feb25bb48f
20 changed files with 1125 additions and 1074 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
HNS/.DS_Store vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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()

View File

@ -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('<Button-1>', lambda e, x=r, y=c: left_button_click(view, x, y))
btn.bind('<Button-3>', lambda e: right_button_click(view))
btn.bind('<Enter>', 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>', 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('<Button-1>', lambda e, x=r, y=c: left_button_click(view, x, y))
btn.bind('<Button-3>', lambda e: right_button_click(view))
btn.bind('<Enter>', 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>', 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()

View File

@ -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)