Варианты заданий (1114804), страница 8
Текст из файла (страница 8)
Информацию выдавайте в поток стандартного вывода сервера.384Программируемый роботВторая часть практикума предусматривает создание программы-робота,имитирующего поведение человека (игрока) в игре «Менеджмент». Это задание расчитано на выполнение в IV семестре и предполагает использование языка C++.4.1Постановка задачиСтартовыми параметрами программы-робота являются ip-адрес и номерtcp-порта сервера, а также имя файла, содержащего программу на модельном языке (сценарий). Сценарий определяет дальнейшее поведениеробота.
Таким образом, программа-робот представляет собой комбинациюпрограммы-клиента (см. § 2.5.1) и интерпретатора модельного языка.Как и в случае с сервером, стартовые параметры задаются в командной строке. По согласованию с преподавателем возможны другие вариантыполучения стартовых параметров: например, из конфигурационного файла или из переменных окружения. Задавать стартовые параметры в текстепрограммы (т.е. так, что их изменение потребует перекомпиляции программы) запрещается.Входной язык робота должен позволять использование всей информации, которая доступна обычному игроку, а также выдачу всех команд, которые мог бы выдать обычный игрок.
Язык должен быть алгоритмическиполным и иметь возможности, достаточные для задания нетривиальныхстратегий (например, включающих в себя статистическую экстраполяцию).Для этого, в частности, необходимо предусмотреть в языке массивы (хотябы одномерные). Вместе с тем, нет необходимости реализовывать в языкестрочные переменные или переменные разных числовых типов; достаточнобудет наличия переменных одного целочисленного типа (например, четырехбайтных целых); предпочтительнее, однако, было бы наличие переменных с плавающей точкой.Для обеспечения в языке алгоритмической полноты необходимо предусмотреть конструкции, позволяющие задать ветвление и цикл. Минимальный набор конструкций для этого состоит из условного оператора и оператора безусловного перехода. Желательно предусмотреть в языке такжесоставной оператор и оператор цикла с предусловием.Обязательным требованием является равноправие всех пробельных символов (пробелов, табуляций, переводов строки и возвратов каретки) и допустимость любого их количества в любомместе программы, где допустим один пробел.
Таким образом, нельзя39использовать конец строки в качестве разделителя операторов, как это делается в ранних версиях Бейсика и Фортрана. Для разделения оператороврекомендуется использовать символ “;” (точка с запятой).4.2Пример входного языка роботаОписываемый в этом параграфе язык является минимальным, т.е. упрощенным настолько, насколько это вообще возможно в рамках поставленной задачи. По требованию преподавателя на язык могут быть наложеныдополнительные условия, усложняющие его. Однако даже в отсутствие дополнительных требований рекомендуется предложить свой вариантязыка, используя приведенный здесь язык лишь в качестве примера.4.2.1Общее описаниеПрограмма на модельном языке состоит из операторов, каждый из которых может быть помечен меткой.
Для упрощения анализа имя метки начинается всегда с символа @ и заканчивается двоеточием; имя метки можетсостоять из латинских букв, цифр и знаков подчеркивания. Если операторначинается не с метки, считается, что этот оператор не имеет метки. Конец оператора обозначается точкой с запятой. В дальнейшем при описаниисинтаксиса операторов мы не упоминаем возможное наличие у оператораметки, чтобы не загромождать текст.В языке присутствуют следующие операторы:— оператор присваивания— оператор безусловного перехода (goto)— условный оператор (if)— операторы игровых действий (buy, sell, prod, build, upgrade иendturn)— оператор отладочной печати (print).4.2.2Арифметика.
ВыраженияВ языке поддерживаются арифметические операции сложения (+), вычитания (-), умножения (*), целочисленного деления (/), вычисления остатка отделения (%), а также операции сравнения (<, >, =) и логические операции(&, |, !). Обязательна поддержка унарного минуса.
Операции сравнениявыдают значение 1 для обозначения истины и 0 для обозначения лжи. Логические операции интерпретируют число 0 как ложь, все остальные числа40– как истину. Результатом логической операции могут быть только числа0 и 1.Наибольший приоритет имеют умножение, деление и остаток от деления, следующий уровень приоритета имеют сложение и вычитание, операции сравнения имеют низший приоритет.В качестве операндов могут выступать константы, переменные и обращения к встроенным функциям.В выражениях могут присутствовать круглые скобки любой вложенности.4.2.3Переменные. Массивы.
ПрисваиванияПеременные в языке имеют имена, начинающиеся со знака “$”. В именипеременной могут присутствовать латинские буквы, цифры и знак подчеркивания. После имени переменной может следовать указание индекса – произвольное арифметическое выражение, заключенное в квадратные скобки.Описывать переменные не требуется; переменная заносится в таблицу значений переменных в момент первого присваивания.Оператор присваивания имеет следующий синтаксис:<присваивание> ::= <переменная> = <выражение> ’;’<переменная> ::= <имя_переменной>|<имя_переменной> ’[’ <выражение> ’]’Можно заметить, что никакие другие операторы модельного языка немогут начинаться с переменной, поэтому переменная, встреченная при анализе в начале оператора, однозначно указывает на то, что анализируемыйоператор является оператором присваивания.Примеры операторов присваивания:$a = 5;$b[4] =15 ;$b[$a]= $b[4]+3;$c=($a+10) * $b[5];Обратите внимание, что по обе стороны от знака присваивания допустимолюбое количество пробельных символов.Для упрощения реализации можно рассматривать элементы массивакак самостоятельные переменные; при этом индекс становится частью имени переменной.
С точки зрения интерпретатора элемент массива становится в таком случае своеобразной переменной, часть имени которой вычисляется в момент исполнения оператора. Если рассматривать только что41приведенный пример, то после выполнения таких операторов в таблицезначений переменных должны появиться:— переменная с именем “a” и значением 5;— переменная с именем “b[4]” и значением 15;— переменная с именем “b[5]” и значением 18;— переменная с именем “c” и значением 270.4.2.4Условный операторУсловный оператор имеет следующий синтаксис:<условный_оператор> ::= ’if’ <выражение> ’then’ <оператор> ’;’При анализе оператора следует считывать выражение до тех пор, покане встретится лексема, не являющаяся знаком операции, константой, переменной или обращением к функции.
В данном случае следующей за выражением должна оказаться лексема then. Оператор, стоящий после then,должен быть проанализирован, однако его выполнение должно произойтитолько в случае, если вычисление выражения дало результат, отличный отнуля.4.2.5Встроенные функции для получения игровой информацииДля удобства анализа можно ввести соглашение, по которому все именафункций начинаются со знака “?”. Имя функции может состоять из латинских букв, цифр и знака подчеркивания. Если функция имеет аргументы,то вслед за именем функции должно идти заключенное в круглые скобкиперечисление параметров функции через запятую. В минимальный наборфункций, обеспечивающий доступ ко всей игровой информации, входят:— ?my_id (без параметров) – выдает номер игрока, присвоенный сервером нашему роботу;— ?turn (без параметров) – выдает текущий номер хода (условного месяца);— ?players (без параметров) – выдает общее число игроков;— ?active_players (без параметров) – выдает количество игроков, продолжающих игру (т.е.
не обанкротившихся и не вышедших из игрык настоящему моменту);— ?supply (без параметров) – выдает количество сырья, выставленноебанком на продажу на текущий ход;— ?raw_price (без параметров) – выдает минимальную стоимость сырья, определенную банком на текущий ход;42— ?demand (без параметров) – выдает количество продукции, которуюбанк намерен купить на текущем ходу;— ?production_price (без параметров) – выдает максимальную ценупродукции, определенную банком на текущий ход;— ?money (один параметр, номер игрока) – выдает количество денег узаданного игрока (соответственно, ?money(?my_id) выдаст количество денег у игрока, управляемого нашим роботом);— ?raw (один параметр, номер игрока) – выдает количество сырья узаданного игрока;— ?production (один параметр, номер игрока) – выдает количество готовой продукции у заданного игрока;— ?factories (один параметр, номер игрока) – выдает общее количество (работающих) фабрик у заданного игрока;— ?auto_factories (один параметр, номер игрока) – какое количествофабрик данного игрока являются автоматизированными;— ?manufactured (один параметр, номер игрока) – сколько единиц продукции произведено на фабриках данного игрока на предыдущемходу;— ?result_raw_sold (один параметр, номер игрока) – сколько единицпродукции произведено на фабриках данного игрока на предыдущем ходу;— ?result_raw_price (один параметр, номер игрока) – если данныйигрок покупал сырье на предыдущем ходу, выдает цену, по которойсовершена покупка, в противном случае - нуль;— ?result_prod_bought (один параметр, номер игрока) – сколько единиц продукции банк купил у данного игрока на предыдущем ходу;— ?result_prod_price (один параметр, номер игрока) – если данныйигрок продавал продукцию на предыдущем ходу, выдает цену, по которой совершена продажа, в противном случае - нуль.4.2.6Встроенные операторы для совершения игровых действийОператоры для совершения игровых действий имеют следующий синтаксис:<игровой_оператор> ::= <имя0> ’;’|<имя1> <операнд> ’;’|<имя2> <операнд1> ’,’ <операнд2> ’;’<имя0>::= ’endturn’<имя1>::= ’prod’ | ’build’<имя2>::= ’buy’ | ’sell’43Минимальный набор операторов включает:— buy <количество> , <цена> – выставить заявку на покупку заданного количества сырья по заданой цене;— sell <количество> , <цена> – выставить заявку на продажу заданного количества продукции по заданной цене;— prod <количество> – запустить в производство заданное количествопродукции;— build <количество> – начать строительство заданного количествафабрик;— endturn – сообщить серверу о завершении хода и дождаться сообщения от сервера о том, что начался новый ход.Во всех случаях операнды представляют собой произвольные допустимыеарифметические выражения.
Для проверки правильности синтаксиса используется символ “;”, обозначающий конец оператора.4.2.7Оператор отладочной печатиОператор отладочной печати имеет следующий синтаксис:<оператор_печати> ::= ’print’ <п_список> ’;’<п_список>::= <п_элемент> | <п_элемент> ’,’ <п_список><п_элемент>::= <выражение> | <строка>Строка представляет собой произвольную строку символов, заключенных вдвойные кавычки. Таким образом, список параметров оператора отладочной печати оказывается в рассматриваемом модельном языке единственным местом, где допустима текстовая константа.Оператор отладочной печати обрабатывает свои параметры слева направо. Встреченные строки символов выдаются на стандартный вывод;встреченные выражения вычисляются и выдаются их результаты.