Страницы

Поиск по вопросам

четверг, 21 февраля 2019 г.

Как сократить слишком длинное выражение в условии if?

if sea_player[x1 + 1][y1] != 'S' and sea_player[x1][y1 + 1] != 'S' and sea_player[x1 + 1][y1 + 1] != 'S' and sea_player[x1 - 1][y1 ] != 'S' and sea_player[x1][y1 - 1] != 'S' and sea_player[x1 - 1][y1 - 1] != 'S' and sea_player[x1 + 1][y1 - 1] != 'S' and sea_player[x1 - 1][y1 + 1] != 'S' and sea_player[x1 - 1][y1 - 1]:
можно ли сократить этот участок кода?
p.s. пишу морской бой на питоне с использованием коммандной строки. это условие проверяет,не граничит ли одноклеточный корабль при его установке с другими кораблями на поле(список из списков)


Ответ

Сам список смещений для соседних ячеек лучше генерировать, чем руками писать:
adjacent_vector = [(x,y) for x in range(-1,2) for y in range(-1,2) if not (x == 0 and y == 0)]
Тогда точно не пропустите или не продублируете какое-то направление. Кстати у вас дважды проверяется одна и та же ячейка sea_player[x1 - 1][y1 - 1] != 'S'
Список смещений можно один раз создать на все время работы программы.
Далее с помощью генератора и встроенной функции any можно проверить наличие 'S' в ячейках. Примерный код (не учитывает выход за границы вашего поля):
adjacent_vector = [(x,y) for x in range(-1,2) for y in range(-1,2) if not (x == 0 and y == 0)] adjacent_cells = (sea_player[x1 + a[0]][y1 + a[1]] == 'S' for a in adjacent_vector) if any(adjacent_cells): print 'found'
Функция any прекратит работу как только будет найдена первая ячейка с 'S', чтобы не тратить время на остальные ячейки (и генератор вместо списка здесь по той же причине).

Комментариев нет:

Отправить комментарий