用于Android/iOS回合制棋盘游戏的游戏服务器

Cyr*_*ril 7 iphone android multiplayer

我正在编写iPhone游戏,我想创建一个在线多人游戏模式.在未来,这个应用程序将移植到Android设备,所以我想知道如何创建游戏服务器?

首先,我应该选择哪种语言?如何使服务器能够与Objective-c和Java编写的程序进行通信?

那么,如何有效地做到这一点?如果我通过客户端打开一个套接字是好的(会有2个)吗?我应该向服务器发送什么样的信息?对客户?

谢谢你的时间.

Syn*_*r0r 8

编辑您将如何进行大型多人游戏?

嗨西里尔,

正如你所注意到的,两个主要考虑的因素有两个:

  1. 发送到服务器的信息

  2. 发送给客户的信息

只有一种类型的信息要发送到服务器:用户输入.如果你不这样做,当流氓客户端试图向你的服务器发送虚假数据时会遇到令人头疼的问题(比如说"我的坦克现在有100 000 000护甲").

然后你发送给客户端的是你自己,但完全有可能只向客户端发送其他玩家的输入.这是使绝对最小值和小带宽使用成为可能的方法.这就是暴雪魔兽争霸3这样的游戏正在做的事情.作为奖励,这会产生微小的重播文件(因为你需要做的就是重放游戏所需要的是每个玩家输入发生的时间(和输入)).

将另一个玩家的输入发送给客户端的一个缺点是,这意味着每个客户端都存在所有游戏的逻辑.对于某些游戏,这可能是一个问题,因为人们可能会通过逆向工程游戏和发现缺陷来作弊.这个问题可以通过仔细,可控,随机化来缓解(除了输入+时间,您发送输入+时间+ 随机性,其中客户端无法提前猜测随机性.

另一种方法是在服务器端进行一些逻辑计算.然后,显然,您需要将服务器计算的结果发送到客户端.如果做得好,这有利于防止作弊不可能的盗版行为(例如,没有人能够在真实经济中玩魔兽世界 - 也就是说,在真正的暴雪服务器上 - 使用假的许可证密钥).

关于基于手机回合制的游戏服务器:只看一款畅销的回合制游戏就是这样做的.以Uniwar为例:适用于iPhone和Android.游戏服务器是用Java编写的"当然".

要实现的一件事是,像你计划编写的那个游戏完全是确定性的:如果你不能轻易编写重放代码,或者如果你不能轻易地重现任何导致逻辑错误的场景,你就是做错了.

注意,确定并不意味着你不能向你的玩家添加看似随机的东西:简单地说,随机性也应该是确定性的(例如,通过简单地为每个游戏使用不同的种子+玩家输入的时间是作为假随机来源).

  • @Cyril:**等待**...你写了"如何将游戏状态发送给客户?"*但是......你确切地说**永远不会**发送游戏状态.你发送输入.输入允许在每个客户端上重新创建完全相同的游戏状态.这就是我在答案中解释的内容. (2认同)