0

假设我有一个简单的基于文本的单人角色扮演游戏,它作为控制台应用程序运行。过度简化的伪代码:

... 
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. ...  

这可行,但有两个问题:
- 通常不建议每个客户端使用一个线程,因为它的扩展性很差。
- 编写自定义套接字服务器和客户端是一件痛苦的事。

所以让游戏在网络服务器上运行解决了这两个问题,但它引入了一个新问题:网络本质上是无状态的。据我所知,我必须将线程程序流转换为状态机,在每个请求开始时从数据库中提取状态,然后在请求处理程序结束时将修改后的状态存储在数据库中. 这似乎比编写自定义套接字服务器更痛苦。所以我的问题是,是否有任何非痛苦的方法来实现这一目标?理想情况下,会有一个解决方案可以让我保持上面的简单伪代码基本不变。我愿意接受所有语言和/或平台的建议。

4

1 回答 1

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>?

那么你有三个新页面:

房间-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>?

房间-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/运行:

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 。

于 2013-05-02T00:25:44.787 回答