假设我有一个简单的基于文本的单人角色扮演游戏,它作为控制台应用程序运行。过度简化的伪代码:
...
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. ...
这可行,但有两个问题:
- 通常不建议每个客户端使用一个线程,因为它的扩展性很差。
- 编写自定义套接字服务器和客户端是一件痛苦的事。
所以让游戏在网络服务器上运行解决了这两个问题,但它引入了一个新问题:网络本质上是无状态的。据我所知,我必须将线程程序流转换为状态机,在每个请求开始时从数据库中提取状态,然后在请求处理程序结束时将修改后的状态存储在数据库中. 这似乎比编写自定义套接字服务器更痛苦。所以我的问题是,是否有任何非痛苦的方法来实现这一目标?理想情况下,会有一个解决方案可以让我保持上面的简单伪代码基本不变。我愿意接受所有语言和/或平台的建议。