首先,我应该选择哪种语言?如何使服务器能够与用objective-c和Java编写的程序进行通信?
那么,如何有效地做到这一点?如果我打开客户端的套接字(会有2个),这样好吗?我应该向服务器发送什么样的信息?对客户?
谢谢你的时间.
解决方法
嗨西里尔,
正如你所注意到的,有两个主要的事情是两个考虑的:
>发送到服务器的信息
>发送给客户的信息
只有一种类型的信息要发送到服务器:用户输入.如果你不这样做,当流氓客户端试图向你的服务器发送虚假数据时会遇到令人头疼的问题(比如说“我的坦克现在有100 000 000护甲”).
然后你发送给客户端的是你自己,但完全有可能只向客户端发送其他玩家的输入.这是使绝对最小值和小带宽使用成为可能的方法.这就是暴雪魔兽争霸3这样的游戏正在做的事情.作为奖励,这会产生微小的重播文件(因为你需要做的就是重播游戏所需要的是每个玩家输入发生的时间(和输入)).
将另一个玩家的输入发送给客户端的一个缺点是,这意味着每个客户端都存在所有游戏的逻辑.对于某些游戏,这可能是一个问题,因为人们可能会通过逆向工程游戏并发现缺陷而作弊.通过仔细,可控,随机化可以减轻此问题(除了输入时间之外,您还可以预先输入客户端无法猜测随机性的输入时间随机性.
另一种方法是在服务器端进行一些逻辑计算.然后,显然,您需要将服务器计算的结果发送到客户端.如果做得不错,这有利于防止作弊和不可能的盗版行为(例如,没有人设法在真实经济中玩魔兽世界 – 也就是说,在真正的暴雪服务器上 – 使用假的许可证密钥).
关于基于手机回合制的游戏服务器:只看一款畅销的回合制游戏就是这样做的.以Uniwar为例:适用于iPhone和Android.游戏服务器是用Java编写的“当然”.
要实现的一件事是,像你计划编写的那个游戏完全是确定性的:如果你不能轻易地编写一个重放器代码,或者如果你不能轻易地重现任何导致逻辑错误的场景,你就是做错了.
注意,确定并不意味着你不能向你的玩家添加看起来像随机性的东西:简单地说,随机性也应该是确定性的(例如,通过简单地为每个游戏使用不同的种子,玩家输入的时间作为伪随机源).