355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Жак Арсак » Программирование игр и головоломок » Текст книги (страница 4)
Программирование игр и головоломок
  • Текст добавлен: 17 октября 2016, 03:28

Текст книги "Программирование игр и головоломок"


Автор книги: Жак Арсак



сообщить о нарушении

Текущая страница: 4 (всего у книги 16 страниц)

Эту игру не так уж трудно запрограммировать. Но нужно сосредоточить внимание на перемещениях гиби. Для каждого из них найдите ближайший цветок и, если несколько цветков находятся на одном и том же расстоянии, выберите случайным образом тот, к которому он отправится.

* Игра 9. Плата за страх.

Шел когда-то фильм с таким названием. Я его не видел, но о нем достаточно много говорили по телевизору, чтобы я знал, о чем он, и он дал мне идею гораздо менее опасной игры!

Вы – тот самый игрок, который, в обмен на обещанную кучу денег, рискует своей жизнью, которой угрожают наемные убийцы. Игра разыгрывается в пространстве, наполненном препятствиями. За вами гонятся трое убийц. Они вооружены револьверами и стреляют в вас, если вы с ними не разделены препятствием. Это – хорошие стрелки: если вы находитесь на линии выстрела, они не промахнутся и компьютер сообщит R. I. P. (requiescat in расе: «да покоится в мире» – для тех, кто совсем не учил латыни).

Более точно, игра снова реализуется на прямоугольнике, образованном точками (свободными местами) и нулями (препятствиями). Я выбрал прямоугольник с 12 строками и 20 столбцами, Я расположил там 100 препятствий в трех убийц (обозначенных У).

Рисунок 4 снят с экрана. Условимся, что убийцы могут стрелять только в направлении строки или столбца,

В приведенной конфигурации игрок (обозначенный ×) не находится на линии выстрела ни одного из убийц. Он может перемещаться на один ход в любом направлении (как король в шахматах). Игра разыгрывается следующим образом:

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

– после этого трое убийц перемещаются на один шаг – все равно в каком направлений (они не могут оставаться неподвижными). Они перемещаются на поле, обозначенное точкой. Нужно договориться об их перемещении, чтобы учесть в случае необходимости спорные ситуации, например, перемещать их одного за другим, что позволяет для каждого из них учесть движения предыдущих. Убийцы, когда у них есть возможность, перемещаются так, чтобы приблизиться к игроку. Если в результате этого перемещения убийца оказывается в состоянии взять игрока на мушку, то он стреляет и убивает его. Игра сразу кончается. Если это не так, то цикл возобновляется.

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

Может случиться, что убийца оказывается бок о бок с игроком, но по диагонали. Он не может стрелять, потому что не находится ни на той же строке, ни в том же столбце. Вы можете сказать, например, что ваш игрок – чемпион по дзюдо и что убийцы не рискуют атаковать его в ближнем бою. Но вы можете принять и противоположную тактику: если при разрешенном перемещении убийца может попасть на клетку игрока, то последний считается убитым. Тем самым вы уменьшите шансы игрока…

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

Я сыграл немало партий. Есть два способа играть. Можно трепыхаться в набитом препятствиями участке в плавать между двумя соседними неприступными полями. Выигрываешь без славы… Можно обыгрывать трудности и, напротив, пытаться вовлечь убийц в гонку преследования, уклоняясь от всех их ловушек. Это намного труднее. Их все-таки трое… Если у вас появятся соображения о том, как ограничить возможности избирать первую тактику, используйте их. Я в этом не преуспел. Деятельность по подсчету стояний на одном месте – это простейшая защита, позволяющая избежать случая, изображенного на рис. 5. Попав однажды на место, обозначенное крестиком (×), игрок может оставаться там бесконечно. Перед лицом необходимости перемещаться убийцы то освобождают, то снова занимают два места, обозначенные буквой У, но не имеют возможности выселить игрока. Если же число стояний на месте ограничено, то игроку невыгодно входить на эго поле, с которого он больше не сможет уйти. Но это может оказаться выгодным в конце партии, если число оставшихся ходов меньше числа разрешенных стояний на месте.

Игра 10. Игра роботов.

Я принял за образец игру, которую я нашел в обзоре по компьютерам. Я глубоко сожалею, что не узнал о ней больше, чтобы воздать ее автору (мне неизвестному) по заслугам. Ее тема в каком-то смысле сравнима с темой «платы за страх», но правила другие и они дают существенно отличающуюся стратегию игры при не очень измененном программировании. Это – идеал для тех, кто больше любит играть с компьютером, чем писать программы. Здесь мы отличаемся: для меня большее развлечение – писать программы…

История происходит в 2387 году. Космическая экспедиция достигает планеты X. Один из участников экспедиции проникает в огромный зал разрушенного здания. Земля изрыта многочисленными расщелинами, открывающими бездонные пропасти. Ни одной живой души, но местные жители достигли высокого технического уровня. Они построили автоматические заводы, производящие движущихся роботов. Заводы еще работают сами по себе, но с перебоями. Появление роботов случайно, да и не работают больше эти роботы так, как когда-то… Они продолжают стремительно нападать на пришельцев, но как слепые. Если избранный ими путь приводит их к расщелине, они оказываются не в состоянии избежать ее и проваливаются в дыру. Что же касается избираемого ими пути, то он определен полностью без всяких уловок: прямо к пришельцу. Игра начинается с входа посетителя в помещение. Дверь за ним автоматически закрывается. Единственный выход – на другом краю. Роботы входят в зал через четыре угла. В начале игры в помещении находится некоторое количество роботов. У посетителя есть два козыря:

– с помощью хитроумных перемещений он может заставить роботов сваливаться в расщелины и тем самым отделываться от них;

– у него есть несколько дезинтегрирующих зарядов, с помощью которых он может разрушать роботов. Но он может применять их только в ближнем бою (разве что дальность его оружия не ограничена. Насколько мы знаем, на земле такая дистанция есть…). Кроме того, ему нужно экономить заряды. Еще неизвестно, что его ждет, когда он приблизится к выходу…

Рисунок 6 воспроизводит экран микрокомпьютера. Помещение есть прямоугольник с 11 строками и 18 столбцами. Строки обозначают свободные места, 0 – расщелины в полу, Р – роботы. Крестик (×) обозначает игрока, здесь – в начальном положении. Выход обозначен плюсом.

При своем ходе игрок может

– убить роботов на полях, прилегающих к его собственному;

– переместиться на одно поле в любом направлении, при условии, что он не попадет в расщелину, в результате чего он погиб бы. Он не должен также перемещаться в клетку, помеченную Р, так как там он был бы уничтожен роботом. Если это перемещение приводит его к полю +, то он выигрывает.

Вот что сделал я для реализации этого. Игрок сначала говорит, каких роботов он хочет разрушить, а затем – куда он хочет пойти. Если он отвечает

−Л, −В, НЛ

это означает, что должен быть разрушен робот слева (на соседнем поле), как и робот, находящийся на соседнем поле над ним, после чего он передвинется на поле, расположенное ниже и левее.

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

После этого роботы переместятся, каждый на одну клетку, все равно в какую сторону (по горизонтали, по вертикали или по диагонали). Если при этом робот оказывается на доле 0, то он уничтожается. Если два робота сталкиваются при движении, то один из них уничтожается. Кроме того, роботы случайным образом добавляются в четырех углах игрового поля. Это нужно делать для то– го( чтобы число роботов в игре оставалось более или менее постоянным.

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

Игра оказывается более или менее трудной в зависимости от соотношения между числом препятствий и числом роботов. Я взял прямоугольник с 11 строками и 18 столбцами (число строк нечетно по причине особой роля, которую играет среднее поле), с 30 расщелинами и 20 роботами. Игрок имеет право разрушить 12 роботов. В начале игры игроку, как правило, трудно выйти из своего начального положения, потому что он находится поблизости от двух правых углов, из которых появляется немало свежих роботов. Когда же ему удается удалиться от правого края, выходящие из углов роботы его меньше стесняют и большая их часть падает в расщелины. Трудности возобновляются при приближении к левому краю. Именно поэтому нужно избегать растраты боеприпасов в начале партии. Попытайтесь, и вы увидите, что это требует немалой ловкости…

* Игра 11. Формула 1[12]12
  Так начинаются правила проведения автогонок. – Примеч. ред.


[Закрыть]
.

Задумывались ли вы когда-нибудь над тем, что переживает водитель, мчащийся на огромной скорости по извилистой дороге, обгоняя попутные машины и уклоняясь от встречных? Конечно, вы не преобразуете ваш компьютер в быстро мчащийся автомобиль, и с помощью используемых нами графических средств мы не сможем создать впечатление движения по расстилающейся перед вами дороге. Так как, наконец, я полагаю, что у вас нет средств управления вашим компьютером в реальном времени (этих средств нет не только у меня, но и в оборудовании учебных заведений)[13]13
  Напомним, что книга написана в начале 80-х годов. – Примеч. ред.


[Закрыть]
, поэтому перед любым вашим действием вы сможете размышлять столько времени, сколько вам захочется, а это совсем не так в случае водителя на дороге. Но попытайтесь-ка в этой игре реагировать быстро и вы увидите, что эффект не так уж плох, несмотря на элементарность средств…

Автострада выводится на экран в виде последовательности строк, на которых поставлены точки, нули и звездочка. Точки реализуют 4 полосы движения и представляют свободные места. Выше транспортное средство пред– ставимо звездочкой. Нули суть неподвижные препятствия (скажем, что-то тяжеловесное и очень медлительное). Типичная ситуация изображена на рис. 7. Вы находитесь перед участком дороги (я выбрал 13 строк. Это дает мне хорошие результаты. Но вы можете взять больше, если вам позволяет ваш экран; это увеличивает возможности предвидения. Вы можете взять и меньше, что заставит вести машину в еще более стесненных условиях…).

У вас есть некоторая скорость, которая не выводится на экран, но вы можете ее узнать. В начале игры решается, фиксируется ли она сразу на всю игру (я выбрал 4) или предлагается вами. Когда вы решаете – ускоряете ли вы движение или замедляете его – вы можете узнать на каждом ходе, какова она. Но я не считаю уместным заставить компьютер сообщать ее постоянно – это слишком многое облегчает водителю. Увидите сами.

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

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

Предположим сначала, что вы не меняете направления движения. Ваша машина спускается по вертикали на число строк, равное вашей скорости. Это может привести к тому, что вы пересечете поле, обозначенное 0. Тогда вы сталкиваетесь с грузовиком, вы пропали. Это может также привести вас к тому, что вы попадаете на не обозначенное поле. Вы покинули дорогу. Это – тяжелый несчастный случай. Вы пропали. Так, на рис. 8, если ваша скорость превосходит 2, то вы сталкиваетесь с грузовиком. Если бы вы исходили из крайнего левого поля того же ряда и ваша скорость превосходила бы 5, то вы покинули бы дорогу (внимание: вы пропали с того момента, как вы достигли нуля или не обозначенного поля. Оставшаяся часть вашей траектории движения не рассматривается).

Теперь, если вы меняете направление движения, двигаясь, например, вправо, то ваша машина продвигается по диагонали из исходного ряда вправо до следующей строки, а затем движение продолжается дальше в том столбце, в котором оказывается машина. Понятие «вправо» двусмысленно: вы можете расширить его до «вправо на фигуре» или «вправо по направлению движения». Это не так уж важно, выберите тот смысл, который вы пожелаете. Если это вас шокирует, переверните рисунок и заставьте машину подниматься; тогда «направо» будет значить «направо на экране» во всех случаях. Но это немного усложняет программу, и я так не делаю.

Если вы повернете направо в случае, изображенном на рис. 8, то какова бы ни была ваша скорость, вы сразу же сталкиваетесь с грузовиком. Если вы повернете налево, то вы избегаете грузовиков, но ваша скорость не должна превосходить пяти.

Когда вы сообщили все ваши команды, компьютер показывает положение звездочки на последовательных строчках, чтобы материализовать ваше движение. Если вы оказываетесь на поле, не помеченном точкой, то все останавливается, вы пропали. В противном случае через некоторое время – время ожидания, дающее вам возможность лучше рассмотреть пройденное вами, вся фигура поднимается, чтобы возвратить вашу машину на верхнюю строку, и на экране появляется новый кусок дороги. Таким образом, вы можете обнаружить, что вы едете слишком быстро и что дорога резко поворачивает или что попарно гуськом идут по два тяжелых грузовика, которые блокируют две полосы движения. Вы можете затормозить, но только на одну единицу. Придется рисковать…

Для того чтобы игра не продолжалась бесконечно, вы должны условиться о числе линий, которые нужно пересечь (например 100). Если вы достигли этого, компьютер прославляет вас так, как вы того заслуживаете, и указывает вашу среднюю скорость.

Эту игру программировать не очень трудно, если не считать того, что нужно оказаться способным корректно дозировать число грузовиков, и что нельзя позволять дороге часто делать зигзаги, а также выходить за пределы экрана. Но здесь нет ничего, с чем вы не могли бы справиться.

Собственно игра оказывается гораздо труднее, чем можно было себе представить. Вы, конечно, можете затормозить до скорости 1. Вы оказались на краю. Но ничего смешного нет. Вы можете оказаться в самом рискованном положении, вы терпите удар за ударом. Благодаря воспроизводимым непредсказуемым последовательностям вы можете много раз возобновлять один и тот же пробег. Впрочем, здесь бывает трудно вспомнить, что же происходит на шестидесятом километре… Вы можете также попробовать маршрут, а затем предложить его вашим друзьям. И если вы на их глазах вылетели с трассы, но вовсе не факт, что они смогут на ней удержаться. Итак, желаю успеха!

?** Игра 12. Твоя песенка спета, любопытный!

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

Вы знаете телевизионную игру: вытащить случайным образом 6 шашек среди 24f образованных следующим образом:

двойной набор из 10 шашек с числами от 1 до 10;

четыре шашки с числами 25, 50, 75, 100.

Случайным образом выбирается трехзначное целое число (первая цифра которого – не нуль, так что оно содержится между 100 и 999, включая границы). Задача состоит в том, чтобы менее чем за 45 с обнаружить последовательность операций, использующих только значения шести выбранных шашек, причем каждую не более одного раза, и соединить их знаками + − × / (целочисленное деление разрешается только в тех случаях, когда оно выполняется нацело, без остатка).

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

Шашки: 4 4 7 8 9 100

Число, которое нужно получить: 380

В течение 45 с, которые я выделил своему компьютеру, я получил следующее решение:

4 × 100 = 400

9 + 8 = 17

7 + 17 = 24

24 − 4 = 20

400 − 20 = 380

Это решение использует 6 шашек. Компьютер сообщает еще через 45 с:

4 × 9 = 36

4 + 36 = 40

7 × 40 = 280

280 + 100 = 380

Это решение не использует шашки 8.

Не пытайтесь сделать эту программу, следуя методу игры: вытащить случайным образом 6 шашек, вытащить случайным образом число, которое нужно получить, сообщить и то, и другое и в продолжение следующих 45 в искать нужную комбинацию. У вас нет никаких шансов, чтобы это произошло (см. Головоломку 28). Действуйте лучше следующим образом.

Выберите случайным образом 6 шашек и их комбинацию. Если результат не лежит в промежутке от 100 до 999, – повторите выбор. Если результат допустим, то выведите сообщение, какие 6 шашек участвуют, расположив их, например, в возрастающем порядке, чтобы не было понятно, в каком порядке они были использованы; сообщите искомое число, затем сообщите оставшиеся секунды и, когда 45 с протекут, сообщите результат. Здесь есть неудобство: всегда есть хотя бы одно точное решение. И при том, что не приходится особенно обольщаться, то, что вы достигнете с его помощью, вы, может быть, сможете сделать по-другому только приближенно.

Внимание: случайным образом выбирать комбинацию на самом деле вовсе не всегда так просто, как в приведенном примере. Не забывайте, что вы можете использовать и не все шашки. Найдите способ получать ответ. Я не вполне удовлетворен своим собственным. Я предпочел бы знать и другие способы это сделать…

?** Игра 13. Две лисы и 20 кур.

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

Вот как я представляю эту игру на экране своего компьютера. Буквы представляют кур, звездочки – две лисы. Куры могут перемещаться на один шаг вверх, влево или вправо, но не назад и не по диагонали. Лисы также могут перемещаться только на один шаг, но также и вверх – как и вниз, влево и вправо. Лиса может съесть курицу – как в игре в шашки: если в горизонтальном или вертикальном направлении за курицей на один шаг следует свободное поле, то лиса перепрыгивает через курицу на свободное поле и берет ее. При этом трофеи складываются. На рис. 9 одна лиса может съесть курицу b, тогда как вторая лиса может съесть за один ход кур e и f. Лисы всегда обязаны есть и, когда у них есть выбор – как на рис. 9, – они обязаны осуществить наиболее длинное поедание. Если два приема пищи имеют одинаковую длину, осуществляется один из них – по выбору лисы.

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

Лисы выигрывают, если им удается съесть 12 кур, так как тогда оставшихся кур недостаточно, чтобы занять 9 верхних полей.

Может показаться удивительным, что я отношу эту игру к категории игр без стратегии. Как вы собираетесь перемещать лис по вашей программе для компьютера? Действительно, возможностей слишком мало, и едва ли стоит говорить о стратегии. Нужно, чтобы при каждом ходе программа искала наиболее длинный среди всех возможных путь поедания для лис и осуществляла его, если он единствен. Если существуют два таких пути, то один из них нужно выбрать. Если их нет совсем, то способ действия состоит в том, чтобы посмотреть, позволит ли какое-нибудь перемещение лисы поставить ее в состояние возможного поедания. Если такой ход есть, то почему бы его не сделать, это заставит кур реагировать. Если и такого угрожающего хода нет, то остается мало возможностей выбора. Я был поражен, увидев, что если выбрасывать ходы случайным образом вместо того, чтобы осуществлять их выбор, то результат будет не намного хуже… Но, конечно, не так уж трудно придумать что-нибудь получше. Единственная настоящая трудность программирования – определение наиболее длинного пути поедания.

?** Игра 14. Одна лиса и 13 кур.

Это – вариант предыдущей игры. Та же конфигурация, но только одна лиса и 13 кур. Та же задача: 9 кур должны занять верхний квадрат. Лиса обязана есть, и притом по наиболее длинному пути.

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

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

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

Привыкнув к игре с двумя лисами, я вначале никак не мог приспособиться к этой игре, особенно к манере лисы ходить по диагонали» Но это не страшно. С того момента, как вы полностью ухватите способ движения (и, в частности, возможность перейти из h в b и из j в f на рис. 11), эта программа даст вам настоящую возможность играть: вы можете применить ту или иную стратегию игры на выигрыш против машины, которая такой стратегией не очень-то обладает…

Игра 15. Игра Доминика.

Уж здесь-то я могу ручаться, что это игра для начинающих. Ее для своего малюсенького микрокомпьютера придумал мой племянник Доминик. Она напоминает «плату за страх» (игра 9). Начальное положение игры – то же (рис. 4). Доминик взял прямоугольник поменьше и уменьшил число препятствий. Для начала он поставил препятствия на определенные места.

Правила игры изменены. Убийцы не вооружены огнестрельным оружием, у них – только ножи. Они не могут добраться до игрока иначе, чем достигнув занимаемого им поля. Игрок перемещается на 1 шаг в любом направлении (по горизонтали, по вертикали, по диагонали) с условием перемещаться на свободное поле. Убийцы на своем ходе приближаются к игроку на один шаг – обязательно на свободное поле – в любом направлении.

Игра осталась очень интересной. Проблема нахождения игрока и убийцы на смежных линиях больше не стоит. Если убийца оказывается рядом с игроком в каком-либо направлении, он его хватает на следующем ходе, если игрок не удаляется от него при своем ходе…


    Ваша оценка произведения:

Популярные книги за неделю