Многобукв, и кто даёт такие имена переменным - тот **дак.
from random import randint, choice
def neighbours(cells):
return {(i, j) for y, x in cells
for i in range(y - 1, y + 2) for j in range(x - 1, x + 2)}
N = 10 # а вот менять не надо
abc, digits = 'abcdefghij', '0123456789'
field, sea_map = {}, [[' '] * N for _ in range(N)]
for size in 4, 3, 3, 2, 2, 2, 1, 1, 1, 1:
while True:
ship = [(randint(0, N - 1), randint(0, N - 1))]
for _ in range(1, size):
ship.append(choice([(i, j) for y, x in ship for i, j in (
(y - 1, x), (y, x - 1), (y, x + 1), (y + 1, x)
) if 0 <= i < N > j >= 0 and (i, j) not in ship]))
if not neighbours(ship) & field.keys():
break
field.update(dict.fromkeys(ship, ship))
fleet = set(field)
for step in range(1, 51): # ограничимся 50ю ходами
print(' 0 1 2 3 4 5 6 7 8 9 \n ┌─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┐')
for ch, row in zip(abc, sea_map):
print(ch, '┤', *row, '├', ch)
print(' └─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┘\n 0 1 2 3 4 5 6 7 8 9')
s = input(f'{step:>2} Ваш ход: ')
try:
y, x = abc.index(s[0]), digits.index(s[1])
ship, row = field.get((y, x), ), sea_map[y]
if ship:
del field[y, x]
row[x] = '*'
print(s, 'Попал\n' if ship & field.keys() else 'Убил\n')
if not field:
print('Победа!')
break
else:
if row[x] == ' ':
row[x] = str(len(fleet & neighbours([(y, x)])))
print(s, 'Мимо\n')
except:
print('Ожидался ход в формате \'a0\', но что-то пошло не так...\n')
else:
print(f'В этот раз не вышло, в строю осталось {len(field)} палуб '
f'на {len({id(ship) for ship in field.values()})} кораблях.')