关于WEB实现回合制游戏的YY

Posted by linyupark :: 2007,September 27th,22:53 pm

情况:目前还没有发现真正意义上的回合制WEB游戏(起码本人还未发现..)

难点:在服务器负担最小的情况下做到即时性比较强的回合对战(就battleship为蓝本)

开始YY
很多国外的WEBGAME在回合制上都采用了人机对战,避免了需要玩家对玩家,你一下,我一下的对战方式。

如何有效开发回合制的WEB游戏呢?
回合制更像一副棋局,出发点还是开设对战房间。

开始的对战房间如何存储?
文件存储格式一般在被操作对象单一的情况下比较理想,因为读取速度比较快。
(被操作对象单一:文件不会出现在同一时间被两个或两以上的人操作)
房间的数据,如名称,人数(1V1的话就只需要提示是否游戏开始,或是在准备状态)。
这些只有房主才可做修改,因此可以为每个玩家建立一个实体的文件来存储他们的房间信息(一人一屋政策)

如何判断是有效的房间?
既然存储房间的文件是存在的,那怎么判断这个房间是有效的?(玩家离线房子的信息依然存在于服务器上,但并不是有效的)

WEB很难实现对用户是否在线进行精确的判断,一些BBS的在线人数显示往往是采用每页检查政策(每张页面都会读取一张在线人数的数据表)。这样做的后果是服务器压力很大。基本上也没有很好的解决办法,想要精确到秒成了几乎不可能完成的任务。

另一个思路:房间信息不需要对用户是否在线做判断,完成对战需要用户主动向挑战方发出挑战信息。
挑战的发送只需要一个提交动作,接收方是否需要定时检查自己的挑战信息呢?
PHP是否有成功的SERVER PUSH呢?
(The term ’server push’ generally means that a server pushes content to the browser client.)
(术语 ’server push’ 通常的意思就是服务器将内容PUSH给浏览器方的用户,而不是常规上用户的主动请求)
PHP有这个能力,可惜只能针对Mozilla浏览器。

* The client polls the server at a certain interval, say every five minutes. This technique is typically used to update news information. The client does this by reloading a page every so often.
* The client uses the ‘multipart/x-mixed-replace’ content type when sending a response. The content type is expected to send a series of documents one after the other, where each one will replace the previous one. The server might delay between each part, which gives the illusion that the data is being updated after an interval. This technique requires a connection to stay open.
* In Mozilla 1.6 and later, server sockets may be used to listen for incoming connections. This technique works similarly to the way a server would listen to connections from a browser and doesn’t require a connection to be kept open. However, server sockets may only be used from privileged code.

以上三个是目前能够做到所谓即时的办法。第一个就是间隔刷新大法,第二个就是使用multipart/x-mixed-replace内容类型来替换先前的内容,上面说过程中间还是会产生一定的延时。第三个就是浏览器本身可以使用服务器sockets监听,但这需要在服务器上写处理程序,而且这还仅仅是Mozilla浏览器。
相关的信息连接http://www.xulplanet.com/tutorials/mozsdk/serverpush.php

分析了那么多,现在就是感觉没路可走。继续寻找ing….

Leave a Reply