Варианты заданий, страница 6
Описание файла
PDF-файл из архива "Варианты заданий", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 6 страницы из PDF
В качестве альтернативы можно предусмотреть команду start,которую выдаёт один из игроков, сочтя, что участников уже достаточно.До момента начала игры сервер должен на любую введенную командуотвечать сообщением о том, что игра еще не началась.После начала игры в ответ на попытку соединиться с сервером новыйклиент должен получить сообщение о том, что игра уже началась и новыеучастники не принимаются, после чего сервер должен разорвать соединение.В случае, если с одним из игроков связь потеряна до начала игры, егоместо должно считаться свободным (все оставшиеся игроки получают сообщение о том, что один из игроков вышел, количество имеющихся игроков,количество ожидаемых игроков).В случае, если с одним из игроков потеряна связь уже после началаигры, проще всего считать этого игрока “сошедшим с дистанции”, т.е.
объявить его выбывшим из игры (банкротом).3.2Протокол взаимодействия с клиентомНачать программирование логики игры можно с продумывания протоколавзаимодействия с клиентом.Для связи клиента с сервером необходимо разработать протокол прикладного уровня, т.е. некоторый набор соглашений между клиентом и сервером о том, какие данные будут передаваться и что они должны означать.30В простейшем случае в качестве клиентской программы может использоваться стандартная утилита telnet. Все, что эта программа может делать– это принимать от пользователя текстовые команды строка за строкой ипередавать их в неизменном виде серверу9.3.2.1Набор командДля упрощения задачи рекомендуется принять соглашение, что каждаякоманда занимает ровно одну строку.
Учтите, что в зависимости от настройкиутилиты telnet строка может заканчиваться одним символом ’\n’, а может и двумя:’\r’ ’\n’. Проще всего игнорировать символ ’\r’ как пробельный.Необходимо предусмотреть команды для следующих функций:— Получение информации о состоянии рынка. В ответ на команду сервер должен выдать игроку количество и минимальную стоимость продаваемого банком на данном цикле сырья, а также количество и максимальную стоимость покупаемой продукции. Также разумно выдать количество активных (необанкротившихся) игроков.— Получение информации о состоянии дел других игроков.
Команда должна принимать один параметр (номер игрока) и в ответна нее сервер должен выдать количество денег, единиц сырья, единиц продукции, строящихся, обыкновенных и автоматизированныхфабрик у игрока с таким номером.— Производство продукции на фабриках. В течение цикла (игрового месяца) команду можно дать несколько раз, добавляя новыезаказы, однако собственно производство (списание единиц сырья и зачисление единиц продукции) должно произойти лишь в конце цикла.Это делается, чтобы исключить возможность продавать продукциюв том же месяце, в котором было закуплено для нее сырье. В качествеальтернативы можно запрашивать игроков о количестве производимой продукции один раз в начале цикла, не принимая никаких других команд, пока игрок незаявит о своих объемах производства.
В этом случае производство выполняетсянемедленно.— Подача заявки на участие в аукционе сырья. Команда имеетдва параметра, количество закупаемого сырья и предлагаемая закупочная цена. Сервер должен сразу же проверить, достаточно ли уданного игрока единиц сырья и не задал ли игрок цену, ме́ньшуюминимальной. Если игрок ошибся, ему необходимо об этом сообщить.— Подача заявки на участие в аукционе готовой продукции.9На самом деле, функциональность утилиты telnet гораздо более сложна, однако воспользоватьсяею в рамках нашей задачи не представляется возможным.31Команда по своим характеристикам аналогична предыдущей.— Заявка на строительство новой фабрики.
С игрока тут же списывается половина стоимости фабрики и заводится строящаяся фабрика, которая в свой срок превратится в действующую (при этомпроизойдет списание второй половины суммы).— Окончание действий на данном ходе. После подачи этой команды от данного игрока не принимаются команды, соответствующие активным действиям (заявки и строительство), но должны попрежнему отрабатываться команды получения информации. Это продолжается до тех пор, пока в игре есть игроки, еще не закончившиеданный ход (желательно предусмотреть возможность узнать их список). В случае, если данный игрок не подал заявку на один из аукционов или на оба аукциона, соответствующие заявки считаются нулевыми.
После того, как последний игрок заявит об окончании хода,сервер должен сообщить всем игрокам результаты аукционов,после чего начать следующий ход.В случае, если еще остались игроки, не закончившие ход, следуетсообщить пользователю их количество.— Помощь. По этой команде сервер должен выдать список существующих команд и их функции.Команды должны быть достаточно мнемоничными, чтобы не запутаться в них. Например, в качесте команд можно использовать следующие английские слова и сокращения: market, player, prod, buy, sell, build, turn,help.Весьма желательно сделать анализатор команд нечувствительным к количеству пробельных символов (пробелов, табуляций и возвратов каретки) между параметрами одной команды.Также следует включить в сообщение о неопознанной команде информацию о том, как в вашей системе выглядит команда получения помощи.3.2.2Выдаваемые сообщенияПри продумывании сообщений, выдаваемых сервером клиенту, следуетучесть, что следующий этап задания предусматривает создание программ,имитирующих поведение игроков, так что выдаваемые вашим сервером сообщения необходимо будет анализировать программным образом.С другой стороны, не следует забывать и о том, что обычно в игреучаствуют обычные «живые» игроки.Чрезмерно многословные сообщения, выдаваемые сервером, затруднятих машинный анализ; наоборот, чрезмерно формальные сообщения сдела32ют игру неудобной с точки зрения игроков-людей.
Важно найти оптимальный компромисс.Одно из возможных решений состоит в том, чтобы информация, подлежащая машинному анализу, располагалась в строках, особым образомпомеченных (например, начинающихся с символа %), а комментарии, предназначенные для человека, располагались в строках, такой пометки не имеющей. Вот пример ответа сервера на команду market:Current month is 27thPlayers still active:%3Bank sells: items min.price%6500Bank buys: items max.price%65500Для человека такой ответ вполне читабелен. Что касается машинного анализа, то, выбрав только строки, первым символом которых является процент, удалив символ процента и разбив полученную информацию на отдельные слова, мы получим последовательность из пяти чисел.
Помня, чтовыдана была команда market, мы знаем, что полученные числа означаютколичество участвующих в игре игроков, количество и минимальную ценусырья, количество и максимальную цену продукции соответственно. Программе, в отличие от человека, комментарии не нужны; отбрасывая их, мыоблегчаем анализ текста, полученного от сервера.3.3Структуры данныхИзвестно, что от грамотного построения структур данных во многом зависит дальшейшая судьба любого более-менее сложного программистскогопроекта.Попытаемся сформулировать некоторые рекомендации по проектированию структур данных для нашего игрового сервера.Для начала отметим, что злоупотребление глобальными переменными –едва ли не самая серьёзная ошибка, какую только можно допустить в проектировании.
Глобальные переменные затрудняют модификацию отдельных частей программы, делают невозможным повторное использование кода, порождают путаницу на этапе отладки.Необходимо отметить, что обойтись без глобальных переменных можновсегда. Каждая функция может получить в качестве параметров все зна33чения, которые ей нужны для работы, и адреса всех переменных, которыеей необходимо модифицировать.Может показаться, что при этом каждой функции придётся передаватьслишком большое количество параметров.
Например, если в программе было описано сто глобальных переменных, то после избавления от них придётся перечислять сто параметров в каждом вызове функции.Это, разумеется, не так. Во-первых, каждая отдельно взятая функцияработает только с частью глобальных данных; скорее всего, если в программе было сто глобальных переменных, то большинство функций использует только пять-шесть, реже десять из них каждая. Во-вторых, логическисвязанные между собой данные можно группировать в переменные типа«структура» и передавать функциям вместо нескольких отдельных параметров адрес одной структуры.Вернёмся к нашему игровому серверу.
Можно заметить, что все данные,присутствующие в игре и определяющие состояние игры, делятся на глобальные данные (например, обстановка на рынке, номер текущего хода ит.п.) и данные, связанные с конкретным игроком (номер игрока, количестводенег, сырья, готовой продукции, сведения о работающих и строящихся фабриках).Это позволяет наметить общий подход к формированию данных, описывающих состояние игры. Следует, по-видимому, описать структуру “банкир”, содержащую глобальные данные и создать одну (и только одну) переменную этого типа.