Все свои игры я реализовал самостоятельно, не опираясь на гайды.
- Человек играет с компьютером через консоль, вводя координаты клеток.
- Человек может выбрать случайную расстановку своих кораблей или расставить их вручную. Во втором случае для каждого корабля ему нужно ввести координаты «головы» и ориентацию «хвоста» корабля.
- Корабли компьютера всегда расставляются случайным образом.
- Корабли не могут выходить за границы поля. Корабли не могут быть расположены вплотную друг ко другу.
- Если игрок попадает в корабль на очередном ходе, ему предоставляется следующий ход.
- Компьютер начинает с атаки координат, на которых нахождение кораблей статистически вероятнее всего. Попав, он начинает искать оставшуюся часть корабля, при этом он способен понять, как тот ориентирован.
- Если выстрел в клетку завершился попаданием, четыре клетки по диагонали от неё отмечаются как пустые.
- Если корабль погиб, все клетки вокруг него отмечаются как пустые. Сам корабль отмечается как потопленный.
- Побеждает игрок, первый уничтоживший все корабли противника.
- Игра реализована на классах: игрок, корабль, поле, игра.
- Каждому игроку принадлежит два объекта класса «поле» — то, которое видимо ему, и то, которое видимо его противнику.
- У каждой клетки на поле есть буквенное и цветовое обозначение, соответствующее происходящему на ней.
- Мёртвая клетка, с которой соседствуют три живые, оживает.
- Живая клетка с двумя или тремя живыми соседками продолжает жить, иначе погибает.
- Размеры поля задаются пользователем.
- В моей реализации на каждой итерации обсчитываются не все клетки поля, а только живые и их окружение. Для их хранения используется set. Это позволяет игре работать относительно быстро на большом поле.
- Также в моей реализации игру в любой момент можно поставить на паузу, изменить конфигурацию на поле и запустить игру снова.
- Рисовать можно, не отрывая курсор от канвы.
Разработано несколько режимов:
- игра двух человек на поле 3 × 3 (XO_two_players.py);
- игра двух человек на поле n × n (XO_two_players_nxn.py);
- игра человека против рандомного компьютера (XO_AI_random.py);
- ❗ игра человека против непобедимого компьютера, человек за крестиков (XO_AI_perfect_noughts.py).
В процессе разработки следующие режимы:
- игра человека против непобедимого компьютера, человек за ноликов (XO_AI_perfect_crosses.py);
- реализация через ООП (XO_classes.py).
Я написал эту программу, чтобы продемонстрировать, что успех при игре в русское лото зависит только от количества удерживаемых игроком карт, и иной выигрышной стратегии нет из-за случайной природы игры. В игре три игрока, каждому можно задать количество карт, которые он будет держать, а также количество раундов в игре.
Из примечательного: можно использовать не только стандартный набор из 24-х карт, но и случайно сгенерированные карты, созданные по правилам (матрица 3 × 9 заполняется числами от 1 до 90 без повторений, в каждой колонке должно быть 1 или 2 числа, в каждой строке — 5 чисел. Первая колонка заполняется числами от 1 до 9 (9 штук); колонки со 2-ой по 8-ую — числами одного десятка (например, вторая — от 10 до 19, 10 штук); последняя, 9-я, колонка — числами от 80 до 90 (11 штук)).