Программирование игр и головоломок - [5]

Шрифт
Интервал

Вспомогательная задача: выбрать функцию оценки для выигрыша.

? Игра 2. Стратегия для одной игры в кости.

Ж.-К. Бейиф [BAI] предложил игру в кости с двумя игроками. Каждый игрок в свою очередь хода бросает кость столько раз, сколько хочет. Если он не выбрасывает единицу, то он записывает за этот ход сумму выпавших за бросания этого хода очков. Если же он выбрасывает единицу, то он не записывает ничего (и его ход кончается с выбрасыванием единицы). Выигравшим считается тот, кто первым наберет (или превысит) 100 очков.

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

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

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

Программирование этой .игры представляет двоякий интерес;

— нужно придумать стратегию для компьютера;

— у вас есть возможность экспериментировать. Если компьютер снабжен некоторой стратегией, то вы можете играть против него с другой стратегией и посмотреть, кто выигрывает…

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

Воспроизводимая непредсказуемая последовательность

Вы научились порождать последовательности непредсказуемых чисел, или, допуская неточность речи, принятую в информатике, случайных чисел (эти последовательности совершенно не случайны; они полностью детерминированы, но, поскольку мы не можем найти простого способа перехода от данного числа к следующему и поскольку эти числа приблизительно регулярно размещены в промежутке 0 : 1, то они производят впечатление случайности). Каждое число в этой последовательности зависит только от предыдущего числа. К тому же, как и выше, вы можете получить и в самом деле непредсказуемое число, задавая компьютеру значения трех карт. Вы заставляете его вычислить значение, определенное в разд. 1.1, затем вы берете следующее за этим значением либо с помощью функции ALE или RND вашего компьютера, либо с помощью метода, описанного в разд. 1.2.

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

>ВВЕДИТЕ ТРЕХЗНАЧНОЕ ЦЕЛОЕ

затем прочесть значение x этого целого и взять в качестве начального значения случайной последовательности число x/1000.

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

ale (x)

— это функция, сопоставляющая x, 0 ≤ x < 1, следующее за ним число

0 ≤ ale (x) < 1.

Построим теперь последовательность неотрицательных целых чисел, меньших данного числа n. У нас есть две возможности.

1. Мы порождаем последовательность случайных чисел в интервале (0, 1) и для каждого из чисел последовательности получаем соответствующее целое

x := ale (x), p = целая_часть(n * x).

Различные значения x могут давать одно и то же значение p, так что элемент, следующий за p в последовательности целых, не определяется каким-либо предсказуемым образом. Вообще говоря, данное значение p может иметь несколько последующих значений. Маловероятно, что эта последовательность окажется периодической. Это заведомо случится, если последовательность x, определяющая ее, периодична (а это бывает, хотим мы этого или не хотим).

2. Пусть p дано; тогда p/n лежит между 0 и 1. И элемент, следующий за p, можно определить формулой

p := целая_часть (n * ale (p/n)),

Здесь элемент, следующий за p, полностью определен числом p, и эта последовательность неизбежно оказывается периодической. В наиболее удачных случаях она дает n различных значений (n целых от 0 до n − 1), после чего возвращается к уже встретившемуся в последовательности числу, и — так как каждое из чисел имеет однозначно определенное следующее за ним число — мы повторяем уже построенную часть последовательности. Но чаще всего этим способом получаются слишком короткопериодические последовательности.


Рекомендуем почитать
Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.


Пишем драйвер Windows на ассемблере

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


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

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


Информационная технология. Руководство по управлению документированием программного обеспечения

ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИИнформационная технологияРУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯInformation technology. Guidelines for the management of software documentationИздание официальноеДата введения 1994-07-01ГОССТАНДАРТ РОССИИ Москва© Издательство стандартов, 1994.


Самоучитель UML

Самоучитель UMLПервое издание.В книге рассматриваются основы UML – унифицированного языка моделирования для описания, визуализации и документирования объектно-ориентированных систем и бизнес-процессов в ходе разработки программных приложений. Подробно описываются базовые понятия UML, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.