Игра «Морской бой» · Шаг 1 из 5
Расставить флот
Флот — десять кораблей: один в четыре палубы, два в три, три в две и четыре однопалубных. Корабль стоит прямо — по строке или по столбцу, — и корабли не касаются друг друга даже углами. Расставлять нужно случайно, иначе противник выучит, где стоят корабли. Но «случайно» в программе — это выбор из списка, и чтобы два верных решения выбирали одно и то же, список должен быть у всех одинаковым.
Что сделать
Расставьте флот случайно: корабли по очереди, каждый — случайным выбором из всех мест, где он встаёт и никого не касается.
Что приходит
flot— длины кораблей в порядке расстановки, например[4, 3, 3, 2, 2, 2, 1, 1, 1, 1]n— сторона квадратного моря; клетки —(строка, столбец)от 0 доn − 1sluchay— генератор случайностей, какrandom.Random
Что вернуть
Список кораблей в порядке flot; корабль — список клеток-кортежей от верхней или левой к нижней или правой.
Допишите функцию rasstavit в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В игре
Игра зовёт rasstavit дважды в начале партии: для вашего флота и для флота противника. Решите шаг — и корабли встанут каждый раз по-новому.
Без этого шага: флот всегда стоит одинаково — полосками у левого края, и противник знает это так же хорошо, как вы.
Три корабля — в три, две и одну палубу — на море 5 × 5, генератор с затравкой 7. Для трёхпалубного выписываются все места по правилам из «Подробных правил», и sluchay.choice выбирает одно; клетки вокруг него становятся запретными. Потом так же двухпалубный, потом однопалубный.
import random
rasstavit([3, 2, 1], 5, random.Random(7))
[[(1, 1), (1, 2), (1, 3)], [(3, 1), (3, 2)], [(4, 4)]]
Корабли ставятся по одному в порядке flot. Для очередного корабля длины d составляется список мест — в таком порядке:
- строки сверху вниз, в строке — столбцы слева направо: это клетка начала;
- для каждой клетки начала — сначала вправо (клетки
(s, c),(s, c + 1), …), потом вниз ((s, c),(s + 1, c), …); - однопалубный корабль — одно место на клетку, без второго направления.
Место годится, если все его клетки на море и ни одна не занята и не соседствует (по стороне или углом) с уже поставленным кораблём. Корабль — sluchay.choice(места).
Если для очередного корабля мест нет, расстановка начинается заново с первого корабля — тем же генератором, не заводя нового.
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.