在互联网上玩的Android双人游戏

13

我已经在Android上开发了一个简单的蓝牙对战国际象棋游戏。现在想通过互联网来扩展它,让玩家可以在互联网上对战。每当一名选手下棋,该步骤应通过互联网传输给另一名选手。

如何实现这个功能?

我听说过C2DM机制。这种机制是否适合我所描述的情况,并且是否可靠?

谢谢:)


另一个可能性是端口定向短信。虽然我刚开始使用它们,但我无法真正谈论注意事项。 - tugs
9个回答

9

是的,C2DM非常适合这种类型的游戏。这就是我自己的游戏(http://www.chesspresso.net)所使用的内容,它是一款安卓通讯国际象棋客户端。

在使用C2DM时需要考虑以下事项:

  • 你不会将信息发送到设备,而是通知设备移动已经发生。你不使用C2DM来传输数据,而是用它来通知某些事情已经改变。

  • 它适用于2.2+的Android系统,这是大多数设备的系统版本。但是如果你想支持旧设备,你需要考虑替代方案。我在旧设备上使用轮询。

  • 你必须申请开发者访问权限,然后一旦你的应用程序准备好了,你就必须申请生产状态。如果你不这样做,一旦发布,你很快就会达到开发者状态配额!他们非常慷慨地提供生产配额,但你必须解释你要用它做什么,而且可能需要几周才能被接受!

  • 你的用户必须拥有一个经过授权的Google帐户,否则C2DM将无法工作。大多数用户都会有与其设备关联的帐户,但有些用户没有,这意味着你可能需要验证是否存在帐户以通知用户。

  • 它是可靠的,但有时设备必须等待消息。有时需要几分钟时间。通常是即时的。

希望这可以帮到你!

更新: C2DM现已被弃用,取而代之的是Google的GCM

此外,我强烈建议考虑其他选项,因为将自己限制在谷歌特定的API上意味着您将无法支持外部市场。作为替代方案,我目前正在评估Amazon SNS,并且我还将查看Urban Airship。可能还有其他替代方案我尚未考虑评估。

更新: 非Google基础推送通知的评估更新: 对于这个任务,Amazon SNS并不适合,而对于绝大多数应用程序来说,Urban Airship太昂贵了。不幸的是,所有其他替代方案都非常昂贵,特别是如果您的应用程序(像我的一样)严重依赖推送。


你不使用C2DM来传输数据,而是用它来通知某些事情已经改变了。这是为什么呢?为什么不能使用C2DM来传输数据? - Pking
刚刚看到一条消息:“C2DM不能保证消息的传递或顺序。因此,例如,虽然您可以使用此功能告诉即时通讯应用程序用户有新消息,但您可能不会使用它来传递实际的消息。”我想这回答了我的问题。 - Pking
我基本上使用它来告诉设备需要获取什么。你只有1KB可用。 - Eurig Jones

6
一个好的方法是使用简单的直接TCP连接来连接对等方。
如果您是Java上的套接字编程新手,请尝试这个: 关于套接字的一切

2
如果一个设备在NAT后面怎么办?IP地址不会公开可见?如何处理? - androidGuy
在这种情况下,我建议用户购买网络访问权限。 - vipw
1
@vipw:我尝试通过3G连接连接两个设备,但问题是IP地址变化太频繁了,无法建立连接。 - androidGuy
抱歉回复晚了。我的回答中考虑的是一种非常本地和点对点的解决方案。实现你想要的功能的简单方法是使用服务器作为设备之间的中间人。然后,你可以使用轮询或某些推送技术(如C2DM)来检查更新。只是不要忘记,C2DM需要注册,并且仅受2.2+设备支持。 - DallaRosa

5
另一种选择是使用某种即时通讯作为应用程序的通信介质。例如,使用Asmack连接到类似GTalk的XMPP IM。提示用户在那里创建一个帐户,供您的游戏使用。然后通过IM发送和接收命令。这样,您就不需要设置中介服务器。
如果用户知道正在与谁玩游戏,则此方法有效。要收集用户数据并让他们搜索可用玩家,则仍需要设置服务器。IRC聊天室也可以避免这个问题。
注意:GTalk只是一个示例。您也可以使用任何IM或IRC。

谢谢Aniket,我过去几天一直在尝试使用openfire服务器的smack api。我已经完成了openfire服务器的设置,并成功地在两个用户之间发送了消息。现在的问题是如何检索在openfire中注册的用户列表。我需要这些信息来显示给玩游戏的用户,以便他们可以将其添加为好友。我正在使用openfire服务器的嵌入式数据库。你知道如何访问这个数据库并检索openfire服务器中的所有用户吗? :) - androidGuy
抱歉,我对Openfire一无所知。 :) - Aniket Awati

3
C2DM并不是用来传输信息的,即使是像“b4中的马”这样小的信息。它是用来通知设备有关某些事情的,例如文档的更新版本或网站上的更多文章等等。它不是为设备之间的通信而设计的,并且实时下棋等可能速度不够快。您应该寻找更传统的通过互联网进行通信的方式,或者搜索一些库(我非常确定这方面已经存在...)来帮助您。

3

在我看来,C2DM正是象棋游戏所需要的通知方式;当对手进行回合时(可能是几分钟/几小时/几天后?),您会收到通知。我已经与一些Google Android开发人员讨论过我的游戏,并且他们表示C2DM非常适合这个用途。不过,您需要通过一个集中式服务器(虽然不是必需的,但非常建议)进行操作,因为可能存在重新同步游戏状态等问题。担心“达到限制”吗?嗯,首先我的C2DM账户每天只能发送“仅仅”100,000条消息。如果您超过了这个限制,我想您得请客!


谢谢,C2DM的可靠性是我关心的问题。你开发了什么样的游戏?是类似于象棋这样的回合制游戏吗?C2DM有多少延迟? - androidGuy
这个游戏叫做“条形码野兽”。我目前使用一个可怕的“通过谷歌聊天链接的http链接”来进行游戏内消息传递...在1.x和2.x设备上让它工作起来真是一件非常痛苦的事情(别跟我提意图过滤器!!!),但我终于让它运行起来了,然后那一周...Google宣布了C2DM。天哪!!!不管怎样...延迟可以用微秒来衡量。如果c2dm消息在一秒钟内没有到达手机,那就太慢了!我不知道确切的数字,但我猜平均大约是0.5-0.7秒。顺便说一下,c2dm版本正在测试中,很快就会发布。 - Richard Green
哦,还有可靠性...到目前为止,我从未丢失过正确发送的c2dm消息然而对于象棋游戏,我会(只是为了保险起见)提供一个用户提示的同步选项 - 我想你在<2.2手机上需要这样的东西。 - Richard Green
我最后一次留言:如果你想看到c2dm在实际应用中的效果,可以下载一个我写的叫做“Vera Alert”的应用程序-market.android.com/details?id=com.fawepark.veralert-然后发送这样一个http请求:vera-alert.appspot.com/stat?msg=Hello&recipient=XXXXX,其中XXXXX是启动应用程序时向您呈现的代码。我编写了这个应用程序,以便人们可以将他们的家庭自动化系统与手机链接起来,以便在家中发生预定事件时立即接收通知,但是如果需要,您也可以使用它来查看c2dm的效果。 - Richard Green
+1 我同意在这种情况下使用C2DM是正确的选择。如果你想在实施之前测试它的速度,可以在你的Android设备上尝试Chrome 2 Phone。我在我的应用程序中用它来进行消息传递,速度非常快。此外,连接始终保持活动状态,因此不会使用任何额外的电池电量来保持其活动状态。 - Glendon Trullinger

3

国际象棋经常通过电子邮件进行游戏。您也可以这样做。

当然,任何集中/联合的消息系统都可以使用。

对于您的用途来说,更好的方法是将jabber客户端添加到应用程序中,并让程序生成用于自动消息传递的帐户名称。您可以托管jabber服务器或在免费提供商上生成帐户。


1
谢谢,你能给我一些关于Jabber客户端和服务器的有用链接吗? - androidGuy
https://dev59.com/dXA75IYBdhLWcg3w0cjx 和 https://dev59.com/rHVC5IYBdhLWcg3wz0l9 的相关内容是关于编程的。 - Hussain

2
如果你懂Python或Java,可以使用Google App Engine
另外,今天广泛使用的有两种Web应用程序API风格:SOAP XML和RESTful Web服务。
如果你懂RoR,我建议使用JSON/REST,因为你可以使用Phusion Passenger与Apache一起部署你的应用程序。免费、极其容易,且使你的服务器非常可靠。
你也可以像我的朋友们经常这样做,使用Twitter作为游戏之间的服务器。
我还发现了一个叫做mages的库,看起来很有前途。
祝你好运。

1

我为我的在线2D RPG做了这个:http://developingthedream.blogspot.com

基本上,使用一个中间服务器来协调所有客户端之间的数据。您只需打开一个套接字并与中间服务器通信,它会负责将信息传递给任何其他连接的客户端。

我不建议使用C2DM,因为有消息限制,并且延迟仍然太大。使用自己的服务器,您可以进行优化,而且您将是唯一使用该服务的人,因此您的数据将被更快地传送。


0

我认为C2DM不是下棋的正确方式,因为无法保证消息的传递。你需要更可靠的数据传输方式。


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