|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Этот метод достаточно прост в вычислительном плане, нетребователен к используемым арифметическим компьютерным возможностям. Задание для констант его рекуррентного соотношения других наборов параметров может привести к другим последовательностям. Для многих пользователей персональных компьютеров и некоторых других устройств хорошо известны головоломки-пасьянсы типа FreeCell, в которых для заданного номера игры воспроизводится конкретное игровое поле или начальный расклад [2]. Это обеспечивается за счет линейного конгруэнтного метода с определенными константами, характерными для ряда известных трансляторов высокоуровневых языков C/C++. Отсюда можно перейти к задаче получения воспроизводимого расклада пасьянса для заданного номера игры. Данная задача является хорошим образцом для построения предсказуемого и одинакового игрового поля. Помимо прочего, на языке 1С программное решение по генерации поля является предельно компактным и использует минимум языковых средств. Поэтому целью работы является разработка на языке 1С подпрограмм для обеспечения генерации начального расклада головоломки типа FreeCell. В основе построения начального расклада лежит использование генератора псевдослучайных последовательностей на основе линейного конгруэнтного метода. По этому методу вначале происходит начальная инициализация генератора: семя←НачальноеЗначение (1) В формуле (1) семя – это состояние генератора, НачальноеЗначение – его начальное значение. На каждой итерации использования генератора, при каждом его вызове происходит, во-первых, установка нового значения состояния генератора: семя←(214013*семя+2531011) ОстатокОтЦелочисленногоДеления 2147483648 (2) А во-вторых, непосредственно возврат результата вызова: результатВызова←семя ЦелочисленноеДеление 65536 (3) На основе формул (1)-(3) и реализуется генератор для головоломки. Программа начинается с объявления используемой в подпрограммах переменной:
В переменной семя хранится состояние генератора псевдослучайных чисел. Затем описывается функция для изменения состояния генератора и получения с него нового значения:
Расчет в функции ЛКГ() ведется по формулам (2)-(3). Соответствующая функции схема алгоритма находится на рис. 1. Рисунок 1. Схема алгоритма генерации псевдослучайного числа Основное тело программы сосредотачивается в процедуре Игра(номерИгры):
Через аргумент номерИгры передается начальное значение генератора, соответствующее номеру расклада пасьянса. В переменных буквыКарт и буквыМасти находятся соответственно символы для карт и мастей. При таких обозначениях отводится на карту и масть только один символ, порядок их важен для соответствия результатов работы процедуры классическому варианту пасьянса. Одномерные массивы карты и картыРез с индексами от 0 до 51 служат для хранения карт расклада в неупорядоченном виде и в виде, пригодном для использования как начальной игровой позиции. В свою очередь, карта и масть используются на итерациях при формировании неупорядоченной последовательности карт. Индексная переменная i задействована в циклах с параметром. Для выборки по генератору номер карты в неупорядоченной последовательности сохраняется в инд. Наконец, строковый результат для вывода накапливается в Рез. Простым присваиванием инициализируются буквыКарт и буквыМасти:
Затем создаются одномерные массивы карты и картыРез:
В цикле с параметром от 0 по 51 происходит инициализация начальной последовательности карты:
Вначале из буквыКарт и буквыМасти выделяются соответствующие буквы карты и масти, которые присваиваются в карта и масть. Затем результат конкатенации карта и масть помещается в место i-й карты карты[i]. Инициализируется генератор псевдослучайных чисел номером игры:
В цикле с параметром по всем картам происходит следующее:
Происходит определение индекса текущей выбираемой карты. При этом считается, что после процедуры выбора длина массива уменьшится. По этой причине значение со случайного датчика снимается по модулю с последовательным уменьшением максимального номера. Выбранная карта помещается в массив с результатами. После этого последний элемент исходного массива карт помещается на место выбранной карты. Подготовка к выводу полученного расклада пользователю осуществляется также в цикле со счетчиком:
Собственно, помимо конкатенации с накопленной в Рез строкой, на каждой итерации выполняется проверка условия завершения строки. Если строка должна завершиться, то добавляется в ее конец терминатор. После этого строка сообщается пользователю, и процедура завершается:
Соответствующая процедуре схема алгоритма находится на рис. 2. Рисунок 2. Схема алгоритма нахождения начального расклада головоломки Головная программа содержит тестовый вызов с номерами игр 1 и 617 [2]:
Результаты работы программы:
Полный исходный текст программы доступен на сайте журнала http://samag.ru. Полученный результат позволяет производить имитацию игровых подсистем в 1С. Кроме того, с другими параметрами разработанный генератор может применяться для задач упорядочивания после нумерования им последовательностей.
Ключевые слова: 1С, генератор псевдослучайных чисел, линейный конгруэнтный метод. Комментарии отсутствуют
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|