jjzjj

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

coder 2023-11-25 原文

我目前正在编写一个 iPhone 游戏,我想创建一个在线多人游戏模式。以后这个应用会移植到Android设备上,所以我想知道如何创建游戏服务器?

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

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

感谢您的宝贵时间。

最佳答案

编辑 您的游戏有多大规模多人游戏?

嗨,西里尔,

如您所见,两个人主要考虑两件事:

  1. 发送到服务器的信息

  2. 发送给客户的信息

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

然后您发送给客户端的内容由您决定,但完全有可能只将其他玩家的输入发送给客户端。这是获得绝对最小和微小带宽使用的方法。暴雪的魔兽争霸 3 等游戏就是这样做的。作为奖励,这会产生很小的重播文件(因为要重播游戏,您需要做的只是每个玩家输入发生的时间(和输入))。

仅将其他玩家的输入发送到客户端的一个缺点是,这意味着所有游戏逻辑都存在于每个客户端上。对于某些游戏,这可能是个问题,因为人们可能会通过对您的游戏进行逆向工程并寻找缺陷来作弊。这个问题可以通过谨慎的、受控的、随机化来缓解(除了输入+时间你发送输入+时间+随机性,其中随机性不能被客户端提前猜到.

另一种方法是在服务器端进行一些逻辑计算。然后,显然,您需要将服务器计算的结果发送给客户端。如果做得好,这样做的好处是可以防止作弊使盗版成为不可能(例如,没有人能够在实体经济中玩魔兽世界——也就是说,在真实的暴雪服务器——使用伪造的许可证 key )。

关于手机回合制游戏服务器:看看一款畅销的回合制游戏就知道了。以 Uniwar 为例:适用于 iPhone 和 Android。游戏服务器“当然”是用 Java 编写的。

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

请注意,确定性并不意味着您不能为玩家添加看起来像随机性的东西:只是随机性也应该是确定性的(例如,简单地为每个游戏使用不同的种子 + 时间玩家输入是伪造的随机源)。

关于android - 用于 Android/iOS 回合制棋盘游戏的游戏服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4979511/

有关android - 用于 Android/iOS 回合制棋盘游戏的游戏服务器的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  9. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐