Программирование игр и головоломок - Жак Арсак
Шрифт:
Интервал:
Закладка:
?** Игра 20. Игра Норткотта.
Вот менее известная игра, которую, однако, гораздо труднее программировать. Эта игра разыгрывается двумя участниками на прямоугольной площадке, разделенной на поля, как показано на рис. 12.
Каждый игрок располагает по шашке на каждой стропе, В начале черные шашки находятся на левых полях, белые — на правых. При каждом ходе игрок перемещает одну из своих шашек направо или налево на столько полей, сколько он хочет; но он не может переходить край игрового поля, и не может переходить за клетку, предшествующую противоположной шашке; шашки друг друга не берут и нельзя переходить занятое поле. Проигрывает тот, кто не может пошевелиться, потому что все его шашки загнаны между краем и противоположными шашками.
Размер игры значит очень мало. Я предпочитаю игру с тремя строками, но 4 и 5 — тоже очень хорошие числа. Длина строк несущественна. Выберите ее так, чтобы игра хорошо смотрелась.
На экране вы можете воспользоваться техникой, которая нам так часто служила. Пусть свободные клетки будут представлены точками, шашки одного из игроков — звездочками, а другого — 0. На рис. 13 воспроизведено начальное положение (4 строки, 9 полей на строке). Ход компьютера состоит просто в перемещении одной из его шашек (внимание: если ответ будет слишком быстрым, его, может статься, будет трудно воспринимать. Подумайте, как использовать цикл ожидания). Ход игрока может быть дан компьютеру в вг-де указания, на какой строке нужно переставить шашку и число полей при перемещении; положительное число указывает на приближение к противнику, отрицательное число означает отход к краю игрового поля. Все это очень просто,
?* Игра 21. Игра Кейлеса.
В наиболее простой форме эта игра разыгрывается со спичками, положенными в один ряд. Каждый игрок на своем ходе вынимает либо какую-то одну спичку из строки, либо две смежные спички. Это может разломать исходный ряд на несколько меньших рядов. Вот, например, начальная конфигурация (спички обозначены нулями), а затем — состояние игры через несколько ходов (точки обозначают места, оставшиеся пустыми).
Вначале:
0000000000000
После нескольких ходов;
.000..00.0000..
Выигрывает тот, кто берет последнюю спичку.
Игру можно легко распространить на случай нескольких исходных линий спичек. На каждом ходе игрок берет либо одну спичку, либо две соседние спички на линии, которую он выбрал.
Как и в предыдущих играх, подумайте о применении цикла, ожидания, чтобы у вас было время увидеть ответ компьютера. Как и в играх Нима и Норткотта, эта игра не очень-то справедлива. Компьютер выигрывает все партии, до крайней мере, если его противник не знает выигрывающей стратегии…
* Игра 22. Игра Сима.
Еще одна игра, тоже совершенно не равноправная для двух игроков — для компьютера и для вас.
Игра разыгрывается на листе бумаги, на котором обозначены 6 точек, являющихся вершинами правильного шестиугольника, помеченные буквами A, B, C, D, E, F. Естественно ожидать, что вашим партнером будет компьютер, и ему никакой бумаги не нужно, так что 6 точек появятся на экране.
Каждый игрок при своем ходе проводит отрезок прямой, соединяющий еще не соединенные вершины. Нужно, чтобы следы отрезков, проведенных различными игроками, можно было отличить. На рис. 14 следы одного — сплошные, а у другого — штриховые. В запрограммированной игре именно компьютер берет на себя проведение отрезков. Скажите ему только названия вершин, которые вы хотите соединить. Он и проведет отрезок, причем такого типа, который вам присвоен. Затем он выберет вершины, которые он захочет соединить, и проведет свой собственный отрезок.
Проигрывает тот, кто первым построит треугольник из своих собственных отрезков. Так, на рис. 14 тот, кто проведет отрезок из тире между D и E, проигрывает, потому что он образует отрезок AED из тире, между тем как отрезок AC из тире безопасен: он образует, конечно, треугольник ACD, но одна из его сторон — сплошная, и поэтому он безвреден для обоих игроков.
Сумеете ли вы показать, что в этой игре всегда есть проигравший? (Нельзя так расположить все возможные отрезки, чтобы никакие три стороны их, одинаковым образом выполненные, не образовывали бы треугольника.) Сумеете ли вы предложить хорошую стратегию для компьютера? Если компьютер и игрок играют в равную силу и не совершают никаких ошибок, кто тогда выиграет? Начинающий? Или другой?
На моем микрокомпьютере, не имеющем графических средств, я был вынужден удовлетвориться проведением отрезков с помощью выстраивания в ряд букв там, где компьютер считал нужным их поставить. Картина получалась не очень красивой, но игра оставалась осуществимой и интересной. С графическим да еще с цветным экраном у вас должно получиться просто загляденье, Но не забывайте поговорку Анри Ледгара [LED]:
Не занимайтесь формой вывода результатов, пока ваша программа не окажется правильной.
Когда ваша программа окажется правильной, тщательно отработайте форму вывода результатов.
? Игра 23. Спички Бергсона.
Нет, этот великий философ не играл в такие игры — по крайней мере, насколько я знаю. Эту игру предложил мне М. Дюма,: профессор лицея Бергсона. Еще одна игра для двоих, в которой компьютер — ваш неумолимый партнер. Потому что если вы обнаружите выигрывающую стратегию, то компьютер не оставит вам никаких шансов, ведь у него и память есть…
На столе — кучка спичек (достаточно большая: вначале — по крайней мере 50). Каждый игрок при своем ходе берет спички из кучки. Нужно взять по крайней мере одну и не более чем вдвое больше, чем взял предыдущий игрок. На первом ходе можно взять одну или две спички. Выигрывает тот, кто берет последнюю спичку.
Вот последовательность возможных ходов. Вначале — 50 спичек.
Игрок А берет Остается Игрок Б берет Остается 1 49 2 47 4 43 8 35 16 19 19 выигралНа каждом ходе, кроме последнего, каждый из игроков брал максимальное возможное количество, и игрок Б легко выиграл, взяв на последнем ходе 19 спичек, на что имел полное право, так как 1 ≤ 19 ≤ 2 × 16 = 32. Конечно, это очень плохая стратегия. Вот другая партия:
Игрок А берет Остается Игрок Б берет Остается 3 47 4 43 1 42 2 40 1 39 1 38 1 37 2 35 1 34 2 32 3 29 6 23 2 21 4 17 4 13 2 11 3 8Игрок А близок к победе. Если Б возьмет 3 спички и останется 5, то А имеет право взять последнюю. Это тем более верно, если Б возьмет более чем 3 спички (4, 5 или 6). Игрок Б не может взять больше и во всех случаях дает игроку А все права, чтобы он мог взять последнюю спичку). Единственными случаями, подлежащими обсуждению, остаются поэтому случаи, когда Б берет одну или две спички.
Если Б берет одну, то остается 7, А берет 2 и остается 5. Если Б после этого берет более одной, то А берет последнюю; если Б берет одну и остается 4, то А берет одну и остается 3; Б может взять только одну или две, и кончает игру А.
Если Б берет 2 и остается 6, то. А берет одну и остается 5, и А выигрывает тем же способом.
Я так подробно разбирал этот пример, чтобы познакомить вас с основными идеями. Тщательно изучите этот пример. Всегда ли игрок А заведомо выигрывает, как только он оставляет в куче 8 спичек…
Не предпринимайте здесь слишком глубокого изучения выигрывающей стратегии. Мы к ней еще вернемся ниже. Устройте только, чтобы ваш компьютер выигрывал при приведенных выше условиях, если старт для него благоприятен…
Вы легко сообразите, как представить эту игру на экране,
??** Игра 24. Гениальный отгадчик.
Вы уже сделали гениального ответчика; эта игра сложнее. Составьте программу для отыскания комбинаций, задуманных гениальному отгадчику. Вы можете идти двумя путями:
— вы выбрали комбинацию. Компьютер предлагает вам свою, затем читает число черных и белых шашек, которые получаются из того, что он вам предложил. Он должен найти ответ за наименьшее возможное число ходов;
— вы выбрали исходную комбинацию и сообщили ее компьютеру. Дальше все идет автоматически. Он выбирает некоторую комбинацию, определяет число черных и белых шашек, сообщает это все, затем переходит к следующей комбинации — пока не найдет ответ. Компьютер честен и не хитрит: он не использует того, что он знает задуманную комбинацию…