首先,应该选择哪种语言?如何使服务器能够与使用Objective-C和Java编写的程序进行通信?
然后,如何有效地实现呢?我是否需要为每个客户端(将有2个)打开一个socket?应该向服务器发送哪些信息?向客户端发送哪些信息?
感谢您的时间。
编辑 你的游戏将是多人在线游戏吗?
你好 Cyril,
正如你所注意到的,有两个主要的事情需要考虑:
发送到服务器的信息
发送到客户端的信息
只有一种类型的信息需要发送到服务器:用户输入。如果不这样做,当流氓客户端试图向服务器发送虚假数据时(例如说“我的坦克现在有100000000装甲”),你将会遇到无尽的麻烦。
然后,你发送给客户端的内容取决于你,但完全可以仅发送其他玩家的输入。这是实现带宽使用的绝对最小和最小的方法。这就是像暴雪的《魔兽争霸3》这样的游戏所采用的方式。作为一个奖励,这使得重放文件非常小(因为你只需要知道每个玩家的输入发生的时间即可重播比赛)。
仅向客户端发送其他玩家的输入的一个缺点是,这意味着所有游戏逻辑都存在于每个客户端上。对于某些游戏来说,这可能是一个问题,因为人们可能通过反向工程你的游戏并找到漏洞来作弊。这个问题可以通过小心、有控制的随机化来缓解(除了输入+时间之外,还要发送输入+时间+随机性,其中随机性不能被客户端提前猜测)。
另一种方法是在服务器端进行一些逻辑计算。然后,显然,你需要将服务器计算的结果发送给客户端。如果正确地完成,这既可以防止作弊,又可以使盗版成为不可能(例如,没有人能够使用伪造的许可证密钥在真实的暴雪服务器上玩《魔兽世界》)。
关于手机回合制游戏服务器:只需查看一个畅销的回合制游戏如何处理。以Uniwar为例:适用于iPhone和Android。游戏服务器是用Java编写的“当然”。
需要意识到的一件事是,像你计划编写的这样的游戏完全是确定性的:如果你不能轻松编写重放器,或者不能轻松重现导致逻辑错误的任何情况,那么你做错了。
请注意,确定性并不意味着你不能为你的玩家添加看起来像是随机的东西:这只是意味着随机性也应该是确定性的(例如,通过为每个游戏使用不同的种子+玩家输入的时间作为假随机源来实现)。