Выбрать главу

Первый, кто доберется до 31 декабря, выигрывает.

У вас не должно возникнуть никаких затруднений ни в определении стратегии, ни в программировании этой игры. Подумайте о проверке осмысленности предлагаемых дат… Кроме того, вставьте цикл ожидания, чтобы дать игроку время для ответных действий. Компьютер должен быть вежлив и должен спросить, кто будет начинать, по крайней мере, бросить «орла» или «решку», чтобы узнать, кому начинать…

?** Игра 18. Игра с 24 картами.

Расположим на столе 24 раскрытые карты: все карты с номерами от 1 до 6 обычной колоды, где туз считается за 1. Масти карт несущественны: двойка бубен имеет то же значение, что и двойка треф.

Каждый игрок при своем ходе берет со стола карту и складывает ее значение с суммой тех, которые были взяты ранее[14]. Первый, кто берет в точности 50 очков, выигрывает. Внимание: если при вашем ходе вы, взяв карту, не можете не превысить 50 очков, то вы проиграли. Если, например, ваш партнер увеличил сумму до 49 очков, а все тузы уже взяты, то вы проиграли: карту нужно брать, а ее значение больше единицы.

Это — вариант средневековой игры. Стратегия гораздо сложнее, потому что карт каждого сорта только 4. К этой игре нужно привыкнуть. Сперва компьютер выигрывает все партии подряд (любопытна реакция программиста: я счастлив, что моя программа меня обыгрывает). Но по прошествии нескольких партий уже я выигрываю. Тогда программу нужно улучшить.

?** Игра 19. Игра города Нима.

Ах! Эта нимская игра… кто ее не знает. Существует немало запрограммированных вариантов в большом числе публикаций и обзоров. Читатель может сказать мне, что этой игре здесь не место: если моя цель — заставить читателя программировать, то я проиграл с самого начала.

Ну, нет. Поскольку решения, предложенные в вышеупомянутых книгах (и, поскольку перечитывать их бесполезно, то я их имена и не указываю), очень плохо запрограммированы и совершенно не объяснены. Вам придется сделать лучше. Если вы знаете выигрывающую стратегию, то вам придется ее испытать, чтобы её проверить. Если вы ее не знаете, вы должны попробовать ее изобрести. Во всех случаях нужно программировать очень тщательно, чтобы не делать ненужных вычислений.

Напомним даже саму игру на тот очень мало правдоподобный случай, если вы ее еще не знаете. Это игра для двоих, и компьютер будет вашим партнером. На столе — кучи спичек в некотором количестве, и в каждой куче — некоторое количество спичек. Например, есть 5 кучек с 8, 13, 7, 5, 9 спичками.

Каждый игрок на своем ходе берет столько спичек, сколько хочет, из одной кучки, но он обязан взять хотя бы одну. Выигрывает тот, кто берет последнюю спичку. Вот партия, сыгранная от начала до конца. Компьютер начинает.

Исходное положение: 8, 13, 7, 5, 9

Ход компьютера Ваш ход
б, 13, 7, 5, 9 6, 3, 7, 5, 9
б, 3, 7, 5, 7 2, 3, 7, 5, 7
2, 3, 7, 1, 7 2, 0, 7, 1, 7
2, 0, 4, 1, 7 2, 0, 3, 1, 7
2, 0, 3, 1, 0 2, 0, 2, 1, 0
2, 0, 2, 0, 0

Вы проиграли. Если вы возьмете две спички из одной кучки, то компьютер возьмет две из другой, так что и последнюю и потому выиграет. Если же вы возьмете одну спичку из одной кучки, то он возьмет одну из другой, и вы проигрываете на следующем ходе.

Мариенбадская игра является простым вариантом этой: проигрывает тот, кто берет последнюю спичку…

Этот род игр можно решительно осудить. Это — совершенно несправедливая игра. Выигрывающая стратегия существует. Если ваш противник ее не знает (как было в приведенном выше примере), то он обязательно проигрывает. Если же он ее знает, то он первый воспользуется усвоенной им выигрывающей стратегией, и вы ничего не сможете сделать. С другой стороны, даже если вы знаете выигрывающую стратегию, вы рискуете проиграть компьютеру, потому что вы не так хорошо считаете…

?** Игра 20. Игра Норткотта.

Вот менее известная игра, которую, однако, гораздо труднее программировать. Эта игра разыгрывается двумя участниками на прямоугольной площадке, разделенной на поля, как показано на рис. 12.

Каждый игрок располагает по шашке на каждой стропе, В начале черные шашки находятся на левых полях, белые — на правых. При каждом ходе игрок перемещает одну из своих шашек направо или налево на столько полей, сколько он хочет; но он не может переходить край игрового поля, и не может переходить за клетку, предшествующую противоположной шашке; шашки друг друга не берут и нельзя переходить занятое поле. Проигрывает тот, кто не может пошевелиться, потому что все его шашки загнаны между краем и противоположными шашками.

вернуться

14

Таким образом, подсчитывается общая сумма карт, взятых партнерами, а не отдельные суммы для каждого партнера. — Примеч. ред.