安卓/iOS回合制棋盘游戏的游戏服务器

7
我正在编写一个iPhone游戏,希望创建一个在线多人模式。未来,这个应用将会移植到Android设备上,所以我想知道如何创建游戏服务器?
首先,应该选择哪种语言?如何使服务器能够与使用Objective-C和Java编写的程序进行通信?
然后,如何有效地实现呢?我是否需要为每个客户端(将有2个)打开一个socket?应该向服务器发送哪些信息?向客户端发送哪些信息?
感谢您的时间。

它将有多大规模的多人在线游戏特性? - SyntaxT3rr0r
我不是很确定,但我并不期望有数十亿的玩家,但可能会有几千人... - Cyril
2个回答

8

编辑 你的游戏将是多人在线游戏吗?

你好 Cyril,

正如你所注意到的,有两个主要的事情需要考虑:

  1. 发送到服务器的信息

  2. 发送到客户端的信息

只有一种类型的信息需要发送到服务器:用户输入。如果不这样做,当流氓客户端试图向服务器发送虚假数据时(例如说“我的坦克现在有100000000装甲”),你将会遇到无尽的麻烦。

然后,你发送给客户端的内容取决于你,但完全可以仅发送其他玩家的输入。这是实现带宽使用的绝对最小和最小的方法。这就是像暴雪的《魔兽争霸3》这样的游戏所采用的方式。作为一个奖励,这使得重放文件非常小(因为你只需要知道每个玩家的输入发生的时间即可重播比赛)。

仅向客户端发送其他玩家的输入的一个缺点是,这意味着所有游戏逻辑都存在于每个客户端上。对于某些游戏来说,这可能是一个问题,因为人们可能通过反向工程你的游戏并找到漏洞来作弊。这个问题可以通过小心、有控制的随机化来缓解(除了输入+时间之外,还要发送输入+时间+随机性,其中随机性不能被客户端提前猜测)。

另一种方法是在服务器端进行一些逻辑计算。然后,显然,你需要将服务器计算的结果发送给客户端。如果正确地完成,这既可以防止作弊,又可以使盗版成为不可能(例如,没有人能够使用伪造的许可证密钥在真实的暴雪服务器上玩《魔兽世界》)。

关于手机回合制游戏服务器:只需查看一个畅销的回合制游戏如何处理。以Uniwar为例:适用于iPhone和Android。游戏服务器是用Java编写的“当然”。

需要意识到的一件事是,像你计划编写的这样的游戏完全是确定性的:如果你不能轻松编写重放器,或者不能轻松重现导致逻辑错误的任何情况,那么你做错了。

请注意,确定性并不意味着你不能为你的玩家添加看起来像是随机的东西:这只是意味着随机性也应该是确定性的(例如,通过为每个游戏使用不同的种子+玩家输入的时间作为假随机源来实现)。


你好,谢谢。这是一个非常有趣的 bug,但我还有一个问题:如何序列化数据。我的意思是,假设我的服务器知道代表游戏棋盘的 8*8 数组,如何将游戏状态发送给客户端?然后客户端如何序列化从一个单元格(例如,玩家 1 从 [0,0] 移动到 [1,1])的移动? - Cyril
1
@ Cyril:首先,你可以更进一步。通过序列化玩家的输入,我真正意思是在它们的最低级别上:在时间t时,玩家按下3键。然后,你的服务器应该自己找到它的意思是“Player 1从[0,0]到[1,1]”,因为你的服务器知道Player 1在[0,0](你的服务器知道一切),并且你的服务器知道玩家按下3键的映射意味着“向下和向右移动”。你必须意识到,否则人们可能会通过发送“Player 1从[0,0]到[42,42]”来作弊,即使提供了一次移动42个单位。真正发送输入。 - SyntaxT3rr0r
@ Cyril:我的“输入”指的是“I/O”输入,用户输入,按键、触摸屏幕、鼠标移动等等,尽可能接近实际物理输入。现在,关于数据的实际传输:我知道一些回合制游戏只是采用HTTP GET/POST,因为这很容易设置。 - SyntaxT3rr0r
2
@ Cyril:等一下……你写了“如何将游戏状态发送到客户端?”但是……你确切地从来没有发送过游戏状态。你发送的是输入。输入可以在每个客户端上重新创建完全相同的游戏状态。这就是我在我的答案中解释的内容。 - SyntaxT3rr0r
请注意,在游戏模型中选择同步状态/确定性路线可能会遇到平台之间的浮点误差,从而导致不同步。 - Stowelly

3
这是一个有些侧面的解决方案。你可以选择使用Gamooga(http://www.gamooga.com/),这样你就不用担心服务器端、套接字、传输逻辑等问题,只需专注于游戏逻辑和开发,并忽略所需的系统内容。
Gamooga为您提供实时通信平台,可用于您的游戏。您可以将服务器端消息处理脚本上传至Gamooga的集群中,并在您的应用程序中使用其iOS API与服务器端发送和接收消息。服务器端由Gamooga自动扩展和管理。您可以下载SDK,并从SDK中的演示开始。
提示:我是Gamooga的创始人,仅回答与问题相关的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接