[TC] интернет-игра двух пользователей
Здравствуйте, уважаемые!
Мне нужно разобраться как организовать игру двух игроков между собой через
интернет?
может быть можно сделать так: один из игроков регистрирует себя и противника
с паролем. Создается база, в которой будут отражаться ходы и оставшееся
время игроков. Но в таком виде не понятно как организовать очередность
ходов, отслеживание обращений к базе и так далее.
Если этот вариант сложно реализуемый, то может быть есть более простой
способ организации такой игры?
Если трудно объяснить мне как это сделать, подскажите в какой области искать
учебный материал? смотрел организацию сетевых игр, но на первый беглый
взгляд, мне показалось, что это несовсем то. Я разумеется, могу ошибаться.
Всем очень буду благодарен за помощь,
Грызунов Александр. Самара.
Здравствуйте, Александр.
Я думал над этой задачей. К сожалению нет времени реализовать
задуманное. Может быть, Вам пригодятся мои выводы.
1. Данная технология легко обобщается на многие настольные игры, но я
буду говорить о шахматах.
2. Есть две мало связанные подзадачи в этой задаче: серверная часть и
программа-клиент.
2.1. Сервер. Серверная часть обязательно должна включать в себя
систему опознавания клиента. То есть, входя на сервер, клиент должен
иметь логин и пароль, и следовательно, должен иметься механизм
регистрации. Сервер должен быть событийно управляем. То есть, он
получает от клиентов события в некоем формате, анализирует их, и
предпринимает необходимые действия по каждому событию. Сервер может
быть активным или пассивным.
2.1.1. Активный сервер. Получив событие от клиента (например,
очередной ход или предложение ничьей) активный сервер сам отправляет
событие другому клиенту. Это обеспечивает игру в реальном времени. Но
тут имеются чисто технические сложности. Для отправки по собственной
инициативе сервера, по-видимому, необходим доступ к сокетам
хост-сервера, что резко сужает круг доступных хостеров. Во-вторых,
активный сервер должен обращаться на некоторый порт клиента, что также
создаёт дополнительные сложности, например, требует от клиента
открытости порта, а у некоторых провайдеров это проблематично.
Посему, вариант активного сервера я для себя отверг.
2.1.2. Пассивный сервер отличается от активного тем, что сам ничего по
своей инициативе не отсылает. Он ждёт запросов клиента. Например, он
получает очередной ход от клиента Вася, и не отсылает его клиенту
Пете, а помещает это событие (или ряд событий) в базу данных с
указанием, кого эти события касаются, и ждёт обращения от клиента
Пети. Соответственно, клиент в этом случае должен обращаться к серверу
не только "по делу", передавая некое событие, но и просто периодически
обращаться к серверу со служебным событием "жду информации". Сервер,
получив запрос от клиента Пети, просматривает ещё необработанные
события в таблице событий, выбирает оттуда события, касающиеся Пети,
отсылает их Пете, а из таблицы их либо удаляет, либо помечает как
обработанные. Если ничего нового для Пети нет, сервер отсылает ему
событие "ничего нового".
Интервал обращений к серверу от клиента можно задавать постоянным --
секунды 3, 5, или делать его гибким, скажем первые 10 ходов с
интервалом 3 сек., а далее 10 сек. чтобы не дёргать сервер понапрасну
слишком часто. Важно понимать, что реактивное время в плохом случае
составит удвоенный интервал, плюс время на собственно отсылку пакетов
и реакцию сервера. То есть, клиент ждёт ответного хода, и каждые 10
секунд запрашивает сервер, а противник пока не делает хода, и его
клиент тоже шлёт запросы серверу через 10 секунд, соответственно,
реакция в плохом случае составит около 20 секунд. Поэтому, мне
кажется, надо попробовать интервал секунд в 5 -- 7, и на тестах
проверить другие значения интервалов.
2.1.3. Обработчик событий. В серверную программу должен входить
обработчик событий типа большо-ого свитча. И каждое событие должно
обрабатываться отдельным кейсом этого свитча. Событие представляет
собой некий идентификатор события (именно по нему идёт свитч) и набор
параметров события (набор параметров может быть пустым). В пакете
могут передаваться сразу несколько событий. В заголовке пакета
обязательно должен присутствовать идентификатор клиента. Мне
представляется удобным использовать HTML-подобный формат. Например,
пакет событий может выглядеть так:
<begin>
<user_id=12345>
<event_id="move" txt="e2e4">
<event_id="chat_msg" txt="Гроссмейстер пошёл е2-е4, надо сдаваться!">
<end>
Программа, как мне представляется, должна поддерживать чат. В
предлагаемом формате можно пополнять список обрабатываемых событий, а
строгость оформления позволяет серверу с порога отвергать запросы в
другом формате.
2.2. Клиент. У клиент программы есть 3 принципиальные функции:
2.2.1. Поддерживать связь с сервером. Для этого форматы данных у
сервера и клиента должны быть согласованы в сторону сервера. То есть,
надо сразу закладывать в систему реакцию на устаревшую версию клиента.
2.2.2. Обеспечение самой игры. Конечно, контроль за допустимыми
ходами, временем, троекратным повторением позиции, возможностью
рокировок и прочая должен лежать на клиенте, а никак не на сервере.
2.2.3. Клиент должен обеспечивать пользователю максимально удобный
интерфейс.
3. Реализация. Выше описанная схема позволяет реализовать задачу на
основе обычного HTML-протокола. То есть, серверная программа суть
сайт, для определённости на PHP. Структура базы данных заслуживает
отдельного обсуждения. В качестве клиентов хорошо бы иметь что-нибудь
экзешное с одновременно удобными интерфейсами для зрячего и незрячего,
что принципиально откроет большую аудиторию. Но для начала вполне
можно обойтись и обычным браузером со скриптовой клиентской программой
на java или vbs. Для отладки даже п. 2.2.2. необязателен, только
сервер должен возвращать реальную HTML-страницу. Но, конечно, хорошо
было бы если бы сервер отсылал файл аналогичного принимаемому формата,
а клиент программа разбирала бы события, и актуализировала бы их в
интерфейсе пользователя.