2013-05-01 2 views
0

Предположим, у меня есть простая однопользовательская текстовая RPG, которая работает как консольное приложение. Более упрощенно псевдокод:Как преобразовать сложный поток программы в безстоящий для Интернета?

... 
while (character.hp > 0 and monster.hp > 0) 
    console.write("Attack, Magic, Run?") 
    character.doAction(console.read()) 
    monster.attack(character) 
... etc. ... 

Теперь, скажем, я хочу, чтобы превратить это в многопользовательской онлайн-игры. На сервере, я могу каждый клиент работать в своем собственном потоке, а код не изменится:

... 
while (character.hp > 0 and monster.hp > 0) 
    socket.send("Attack, Magic, Run?") 
    character.doAction(socket.receive()) 
    monster.attack(character) 
... etc. ... 

Это работает, но есть две проблемы:
- Имея один поток на одного клиента, как правило, не рекомендуется, потому что он плохо масштабируется.
- Написание собственного сервера сокетов и клиента - это боль.

Таким образом, игра, запускаемая на веб-сервере, решает обе эти проблемы, но она вводит новую: Интернет по сути является без гражданства. Насколько я могу судить, мне пришлось бы преобразовать поток потоковой программы в конечный автомат, вытащить состояние из базы данных в начале каждого запроса и затем сохранить измененное состояние в базе данных в конце обработчика запроса , Это кажется еще более болезненным, чем создание настраиваемого сервера сокетов. Итак, мой вопрос: есть ли какой-либо нелестный способ достичь этого? В идеале, было бы решение, которое позволило бы мне оставить простой псевдокод сверху почти неизменным. Я открыт для предложений на всех языках и/или платформах.

+0

Я выбрал код и щелкнул фигурные скобки для вас. –

+0

Обратите внимание, что на конечный автомат есть только два состояния и только одно событие. Штатами являются «ожидание» и «завершение», а событие - «входящий запрос». Возможно, это не так сложно, как вы себе представляете. Подумайте о том, чтобы переставить свою петлю, поэтому send() находится внизу и «doAction()» вверху. Некоторым, если в первый раз пропустить верхнюю часть или если запрос не делает ничего интересного. –

+0

Да, для этого конкретного примера это не слишком сложно. Но это был просто упрощённый пример, и, как вы можете себе представить, по мере того, как поток программ становится более сложным, становится все труднее. –

ответ

0

Один из способов сделать это - использовать подход REST. Каждое «состояние» вашего игрока может быть на самом деле является URL-адресом, а действие переходит к новому URL-адресу. Ваш «socket.send()» станет возвратом веб-страницы, а «socket.receive()» просто обрабатывает запрос.

Так скажите, что ваш тоон начинается в «комнате A». Они просматривают веб-страницы http://game.example.com/room-a/ который имеет HTML-код

You see a monster here. Do you 
<a href="attack">Attack</a>, 
<a href="magic">Magic</a>, or 
<a href="run">Run</a>? 

то у вас есть три новые страницы:

комната-а/атаки:

The monster hits you. You hit back! 
Do you 
<a href="attack">Attack</a>, 
<a href="magic">Magic</a>, or 
<a href="run">Run</a>? 

комната-а/магия:

The monster hits you. You cast Magic Missile at the monster. It hits! 
Do you 
<a href="attack">Attack</a>, 
<a href="magic">Magic</a>, or 
<a href="run">Run</a>? 

комната-a/run:

The monster hits you. You run away! 
Do you 
<a href="rest">Rest</a>, 
<a href="search">Search</a>, or 
<a href="/room-b/">Go back to Room B</a>? 

Возможно, вам захочется сгенерировать страницы программой, а не статически, но вы можете получить довольно далеко, просто имея «статические» страницы. См. Addventure для примера того, что вы могли бы сделать.

+0

Это интересно. Но у меня есть проблема: в любой момент, только для клиента только для просмотра _one_ этих страниц, и сервер должен контролировать это. Например, клиент не должен постоянно посещать страницу/room-a/level-up/page. (В многопользовательской игре вы не можете сделать предположение, что клиент хорошо себя ведет.) С этим вы все еще думаете, что подход REST - хорошая идея? –

+0

Похоже, это концепция «активных сообщений»: http://en.wikipedia.org/wiki/Active_message –

 Смежные вопросы

  • Нет связанных вопросов^_^