КИРИЛЛ ТКАЧЕНКО, инженер 1-й категории, ФГАОУ ВО «Севастопольский государственный университет», tkachenkokirillstanislavovich@gmail.com
Программная реализация в 1С недетерминированной игры с полной информацией
Она позволяет производить имитацию хода игры до победы одного из игроков. Программа может быть полезна всем изучающим программирование на языке 1С. Приводятся полный исходный текст программы и результаты ее работы
Современные компьютерные игры весьма сложны, но в основе некоторых все еще лежат простые идеи. Примером такой идеи может служить недетерминированная игра с полной информацией для нескольких игроков, которая широко известна и имеет коммерческие реализации [1, 2].
Упрощенный вариант подобной игры реализован на различных языках высокого и низкого уровня как хрестоматийный пример [3].
Поэтому целесообразно нам с вами рассмотреть программную реализацию на языке 1С, которая выполняет игру без участия игроков – то есть ее имитационную модель.
Целью настоящей работы является разработка на языке 1С имитационной модели недетерминированной игры с полной информацией, позволяющей протоколировать и воспроизводить процесс игры.
Исходный код программы имитационной модели игры находится в модуле управляемого приложения, протоколирование производится сообщением пользователю. В переменной ЗмеяЛестница находится соответствие для приземления по змее или лестнице, а в ГПСЧ – объект генератора псевдослучайных чисел для построения воспроизводимой последовательности псевдослучайных чисел:
Перем ЗмеяЛестница;
Перем ГПСЧ;
Процедура Инициализация() выполняет инициализацию доступных для подпрограмм переменных ЗмеяЛестница и ГПСЧ. Определяется переменная НомерИгры, в которой располагается текущий номер игры как семя ГПСЧ для воспроизводимой имитации:
Процедура Инициализация()
Перем НомерИгры;
В текущем случае номер игры равен 1:
НомерИгры = 1;
Переменной ЗмеяЛестница присваивается созданное новое соответствие, которое заполняется координатами для приземления по змее или лестнице, координаты аналогичны [3]:
ЗмеяЛестница = Новый Соответствие();
ЗмеяЛестница.Вставить(4, 14);
ЗмеяЛестница.Вставить(9, 31);
ЗмеяЛестница.Вставить(17, 7);
ЗмеяЛестница.Вставить(20, 38);
ЗмеяЛестница.Вставить(28, 84);
ЗмеяЛестница.Вставить(40, 59);
ЗмеяЛестница.Вставить(51, 67);
ЗмеяЛестница.Вставить(54, 34);
ЗмеяЛестница.Вставить(62, 19);
ЗмеяЛестница.Вставить(63, 81);
ЗмеяЛестница.Вставить(64, 60);
ЗмеяЛестница.Вставить(71, 91);
ЗмеяЛестница.Вставить(87, 24);
ЗмеяЛестница.Вставить(93, 73);
ЗмеяЛестница.Вставить(95, 75);
ЗмеяЛестница.Вставить(99, 78);
Наконец, ГПСЧ присваивается новый созданный воспроизводимый генератор псевдослучайных чисел с семенем, равным номеру игры:
ГПСЧ = Новый ГенераторСлучайныхЧисел(НомерИгры);
КонецПроцедуры
Функция Ход(НомерИгрока, НомерПоля) для игрока с номером НомерИгрока, находящимся на поле НомерПоля. Переменная Очки предназначена для хранения количества очков, полученных с ГПСЧ, НомерПоляТек – полученный новый текущий номер поля, НомерПоляСлед – возможный полученный новый следующий номер поля:
Функция Ход(НомерИгрока, НомерПоля)
Перем Очки;
Перем НомерПоляТек;
Перем НомерПоляСлед;
Полученный новый текущий номер поля изначально равен номеру поля игрока, очки получаются с ГПСЧ (от 1 до 6 очков):
НомерПоляТек = НомерПоля;
Очки = ГПСЧ.СлучайноеЧисло(1, 6);
Сообщается пользователю информация о текущем игроке и его местонахождении на игровом поле:
Сообщить("Игрок № " + НомерИгрока + ", на поле № " + НомерПоляТек + ", очки " + Очки);
Если сумма номера поля и очков превышает 100, то игрок остается на исходном поле, иначе передвигается на поле на число очков, необходимая информация сообщается пользователю:
Если НомерПоляТек + Очки > 100 Тогда
Сообщить("Игрок № " + НомерИгрока + " не может перемещаться. Ход следующего игрока.");
Возврат НомерПоляТек;
Иначе
НомерПоляТек = НомерПоляТек + Очки;
Сообщить("Игрок № " + НомерИгрока + " перемещается на поле № " + НомерПоляТек);
КонецЕсли;
Если по полученному текущему номеру поля нет змеи или лестницы, то следующий номер поля равен текущему, иначе происходит приземление на новое поле по соответствию:
Если ЗмеяЛестница.Получить(НомерПоляТек) = Неопределено Тогда
НомерПоляСлед = НомерПоляТек;
Иначе
НомерПоляСлед = ЗмеяЛестница.Получить(НомерПоляТек);
КонецЕсли;
Если текущий номер поля игрока меньше следующего, то игрок приземлился на лестницу и поднялся на следующее поле, иначе если текущий номер поля игрока больше следующего, то игрок приземлился на змею и соскользнул наследующее поле:
Если НомерПоляТек < НомерПоляСлед Тогда
Сообщить("Игрок № " + НомерИгрока + " приземлился на лестницу и поднялся на поле № " + НомерПоляСлед);
ИначеЕсли НомерПоляТек > НомерПоляСлед Тогда
Сообщить("Игрок № " + НомерИгрока + " приземлился на змею и соскользнул на поле № " + НомерПоляСлед);
КонецЕсли;
В конце функция возвращает номер следующего поля:
Возврат НомерПоляСлед;
КонецФункции
Процедура Главная() обеспечивает взаимодействие остальных описанных ранее подпрограмм. В переменной НомерПоляИгрока располагается одномерный массив, ячейка которого содержит номер текущего игрового поля соответствующего ячейке по порядку номера игрока, НомерИгрока – номер текущего рассматриваемого игрока, НовыйНомерПоля – новый номер поля:
Процедура Главная()
Перем НомерПоляИгрока;
Перем НомерИгрока, НовыйНомерПоля;
Происходит инициализация переменных ЗмеяЛестница и ГПСЧ:
Инициализация();
Создается новый массив НомерПоляИгрока:
НомерПоляИгрока = Новый Массив();
Текущие номера игровых полей для всех игроков равны 1:
НомерПоляИгрока.Добавить(1);
НомерПоляИгрока.Добавить(1);
НомерПоляИгрока.Добавить(1);
В бесконечном цикле по всем доступным игрокам совершается новый ход:
Пока Истина Цикл
Для НомерИгрока = 0 По НомерПоляИгрока.Количество() - 1 Цикл
НовыйНомерПоля = Ход(НомерИгрока + 1, НомерПоляИгрока[НомерИгрока]);
Игрок попадая на поле с номером 100 побеждает:
Если НовыйНомерПоля = 100 Тогда
Сообщить("Игрок № " + (НомерИгрока + 1) + " победил!");
Возврат;
КонецЕсли;
Иначе его новый номер поля отмечается в массиве текущих номеров полей игроков:
НомерПоляИгрока[НомерИгрока] = НовыйНомерПоля;
Сообщить("");
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Происходит вызов главной процедуры:
Главная();
Исходный текст программы находится на сайте журнала http://samag.ru, результаты работы программы представлены на рис. 1.
Рисунок 1. Результат работы программы
Полученная программная реализация позволит изучить основные конструкции языка 1С, а также строить каркасы имитационных моделей недетерминированных игр с полной информацией.
- Лила (игра) // Википедия. URL: https://ru.wikipedia.org/wiki/Лила_(игра) (дата обращения: 27.12.2018).
- Snakes and Ladders // Wikipedia. URL: https://en.wikipedia.org/wiki/Snakes_and_Ladders (дата обращения: 27.12.2018).
- Snake And Ladder // Rosetta Code. URL: http://rosettacode.org/wiki/Snake_And_Ladder (дата обращения: 27.12.2018).
Ключевые слова: недетерминированная игра, игра с полной информацией, имитационная модель, 1С.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|