小项目—求指点构建多人在线网络游戏

Pisces 发布于 2012/03/26 22:06
阅读 829
收藏 3

这个学期我们学校课程设计是写一个网络版的 黑白棋, 要实现

  • 基本功能:

1、初始化:建立网络连接,生成棋盘,猜先。

2、行棋过程中,支持回合制行棋,程序判断合法的行棋位置,吃子,统计显示棋子数目,统计行棋时间、判断输赢。

3、支持行棋过程中交流的聊天通道,允许别人旁观。

4、支持悔棋、计时等功能:两人通过网络进行对战时,一方要悔棋时需得到对方的回应(即同意)才能悔棋,超时判负。

5、支持存盘功能,能够将当前已经下完的游戏存盘,往后可以打开复盘。

  • 增强功能:

1、建立游戏大厅,支持玩家注册,记录玩家战绩,登陆玩家可以选择对手进入对战室,登陆玩家或游客可以选择对战室观看比赛。



然后我主要是纠结在 如何实现多人同时在线,这个架构问题。希望有这方面经验的大牛们指导一下。。



我的这个课程设计在github上,目前只完成了单机棋盘,悔棋,提示下一步,连接mysql测试。。

https://lazydomino@github.com/lazydomino/reversi


加载中
0
中山野鬼
中山野鬼

呵呵。楼主啊。我以大欺小的说一句,你犯了很多新手规划系统的一个通病,招眼于一条条的需求,而没有招眼于系统的组成构架。昨天我刚批评了我手下的小朋友。

这里需要解释一下,系统是为了实现客户需求,才有存在的意义的。因此,确实应该先看客户目标,在设计系统实现。但是,系统实现有自己的实现特点,同时,为了有效保证后期需求的变动对系统的改动最小(也就是系统的健壮性好),则系统的组成和规划是独立不能和需求混在一起,同时不能以需求为基础的。

但是相对“矛盾”的说一下,系统组成不是凭空想的。而是将需求中的关键词作为素材,综合出来的。根据你的已经陈述的内容,我分步骤的规划下系统。希望你能理解系统规划的方法和步骤。

1、根据需求,你提取或抽象出基本成员。

你的系统,有两类组成,服务器和客户端。分别定义位S和C。(没错就是这么简单,甚至说明不了问题,但你得一步步来,下面我不说这些废话了。)

2、系统的类别关联

由于存在两类,S/C。所以存在,(S,S),(S,C),(C,C) 三种关联。

这句话虽然非常简单,但是已经定好调子,任意的需求任务,均可以拆解为多个步骤,而多个步骤,均只对应一个关联实现。

3、S的生命周期持续存在,C的生命周期由S的验证存在。

这句话非常重要。S的存在不以任意C的存在为前提,而C的任意存在,需要以S的验证为前提。也就是说,无论C是否有实际需求任务,你的系统都必须隐藏一个“心跳检测”的动作。这个动作和C现在什么状态,什么任务都没有关系,只要它还在系统内。只不过优化时,当C明明和S发生动作时,你就不需要傻傻的继续验证"心跳“,

4、S/C的任意关联,确认以标准网络位前提(这是定义和规范网络方面的,可能有些设备是采用RS485上面的自定义协议,则属于非公共网络协议,需要独立划分出来)

为了有效验证,S/C的标准网络因以TCP/IP为基础。整体数据传输分三类

1、同步类,这一类需要严格的数据完整性 。

2、异步类,例如视频,音频连续播放,不需要数据完整性。

3、安全类,这一块,虽然也属于同步类,但系统的完全性是基于稳定性之后的首要指标。所以得独立提出来。这类可能就会包含很多 安全协议或加密手段。而无论是同步还是异步,可能有很多数据,需要过安全类的网络通讯模块。或者安全类的加密模块。

以上,确定了系统的组成部分。

以下,还没有到需求实现阶段,有些新人,此时就迫不及待的想说明需求怎么实现了。

现在应该是,系统描述部分。

系统的运行态

1、S端的启动和各种初始化

2、S端进入服务等待循环,基本服务包括检测C的接入,和对已有C的验证,自身退出(有些人认为这不是S的服务内容,我认为是,但这个矛盾并不是重点,你也可以认为不是)

3、当已验证的C(实际有两个验证,他是合法的,他是活着的,需要明确将合法性独立提出来验证,有人说,他用户名登录了,不就合法了吗?合法性和权限非常有关系,如果一个用户可以悔棋,一个用户因为他牛所以不给悔棋这种差异性的动作权限,均存在合法验证,而验证的是面向动作的,不是面向用户的,用户因为时间,角色,任务的不同,均可能存在不同的验证),存在任务请求时,调配资源,响应。

这里说的都很空。没错,我没有说具体初始化什么,具体提供什么服务。因为你在系统规划是,如果说的很细,会导致你的系统设计时,有特定任务的烙印,这样对于后期需求变动下,系统的健壮性,存在问题。好的代码在于架构的良好,而不在于用最小的代码片完成一个具体的任务。这和效率不冲突。

 

余下你针对需求,一一展开,做系统设计的规划。如果有什么分析不出来的,可以发问题。我帮你看看。最关键的是思维的方式,最不值钱的是某个具体语法怎么使用。

 

 

 

 

Pisces
Pisces
好强大,谢谢哈,表示在学校里这些东西都不会学到。还是需要平时多多写代码,多多练习写项目,最好能在大学阶段维护一个开源软件。。。
c
computerglw
站的高度很高,项目经验不是一般的强!
0
小熊猫大暴走
小熊猫大暴走

1、游戏大厅:管理玩家信息,管理及保存玩家的等级、经验、游戏的项目(象棋、围棋、斗地主等游戏项目),为每一个项目分配房间,管理房间内的玩家。

2、以dll方式实现具体的游戏,大厅通过加载不同的dll实现不同的游戏,(当然你只有一个游戏),用大厅的socket接口管理游戏内玩家的信息通信

3、录像回放:实现很简单,保存从游戏开始到游戏结束所有的socket消息,保存到一个文件中(一个vector就可以了),回放时,重新播放一遍就可以了

4、玩家聊天: 只不过是socket通信的一部分而已。建议另起一个线程

 

server <-> 大厅 <-> client

 

 

 

0
0
0x1c

用现成的消息队列系统,如 zeromq 之类。socket 都封装好了,订阅/发布模式很成熟

自己把精力放在程序逻辑上

返回顶部
顶部