游戏状态的单一事实来源

问题描述

我是游戏开发的新手,我想用 node.js 创建一个多人游戏服务器 我想知道,在服务器上保持和更改游戏状态的最常用技术和模式是什么

我的游戏状态大小很小,所以我认为最好的地方是内存来存储它

我想扩大和扩展我的服务器游戏,这样每个玩家都可以连接到不同的服务器

我担心同时发生的事件会改变不同服务器中的游戏状态,因此拥有单一的事实来源在某种程度上很复杂,因为每个服务器上的状态可能会不同步

简而言之,构建多人回合制游戏的常用方法是什么,服务器必须实现一些逻辑来控制游戏流程,例如改变回合,在玩家不活动的情况下改变游戏状态,...

我也不知道如何保护状态防止重新启动服务器,可能是redis可以保存状态,但是失去控制器后如何控制游戏流程

解决方法

首先,我认为最好从一个带有中央服务器的小模型开始,关于“在不同服务器中改变游戏状态”的事情可能不适合你的游戏,即使它适合,你经过简单的尝试就可以做到。第一件重要的事情是让游戏按照您的意愿运行并尽可能简单

然后我们将重点介绍如何构建多人回合制游戏。对于这样的游戏,您至少需要以下几样东西

  • 玩家信息
    • 静态的总信息(玩家数量、回合数、玩家顺序、玩家位置、本回合当前正在奔跑的玩家)
    • 每个玩家的信息(姓名、ID、金钱、其他)
  • 地图管理器
    • 每个网格都会发生事情
    • 特殊事件或其他一些游戏机制

之后,这里是服务器的中心逻辑。我们至少需要以下功能:

  • ProcessNetwork() 接收包裹并将信息发送给其他人
    • 玩家操作的结束
    • 事件发生在一个/多个玩家身上
    • 多位玩家的互动
  • CheckEnd() 查看游戏是否结束
  • CheckPlayer() 来检查我们是否需要将操作交给下一个玩家或者是否是下一个回合。
void run()
{
    while (!bGameEnd)
    {
        ProcessNetwork();
        CheckEnd();
        CheckPlayer();
    }
}

这就是中央控制器的最简单模型,你可以将其更改为其他方式,只要它们可以工作。之后,您可以让实现您的游戏变得越来越复杂。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...