3D围棋游戏开发总结

来源:互联网 发布:疯狂联盟辅助软件 编辑:程序博客网 时间:2024/04/29 20:59

 

由于时间安排的不合理,先前的SRTP申请耗费了太多的精力和时间,导致这次Pair Work完成的很不理想,首先做一下批评和自我批评。

这次的Pair Work的要求是做一个3D的棋类游戏,具体要求如下:

1) 实现一个棋类游戏,包括:Chess, Chinese Chess, Go (围棋), Chinese Checker (跳棋), Checker (西洋跳棋),等。

2) 需要学习并使用一门新语言/工具,WPF、Sliverlight 3或其他类似的。

3) 需要做成WEB形式,使两个人在不同的机器上通过你的程序进行对战。可以加入电脑AI,但不是必须。

4) 需要做成3D样式,即玩家可以通过三维的视角来进行游戏;如果有必要,可以对游戏的规则进行适当的变动。如果有同学认为做出3D效果太难,可以只做纯2D的,但这样最多只能得1/3的分数。

5) 支持游戏过程的回放。

我们组分到了围棋游戏,最初以为围棋相比其他棋类游戏来说,既没有中国象棋、国际象棋、陆战棋复杂的规则,也没有对西洋跳棋规则的不熟悉问题,但实际上围棋规则的复杂性并不亚于象棋等游戏,包括提子、禁手等规则,最麻烦的是围棋的胜负判定问题,不像其他棋类游戏有明显的胜负标志,现实的围棋比赛进行胜负判定时都要伤一番脑筋,更别说游戏了。最后我们放弃了自动进行胜负判定这一部分工作,留给玩家自行判定,也是能力有限出于无奈。

在技术选择的问题上就耽误了一些时间,开始准备选用WPF,但WPF不太支持Web开发,于是转向Silverlight,后来又得知Silverlight3.0资源太少,而且几乎没有文档,因而选择了Flex。

Flex是Adobe公司开发的RIA富客户端应用开源框架,通过java或者.net等非Flash途径,解释.mxml文件组织components,并生成相应的.swf文件,是当前最为流行的Web RIA技术之一。而Flash3D引擎Away3D则提供了对3D效果的支持。

由于时间紧迫,再加上对Flex和Away3D几乎是一无所知,我们的需求分析和设计工作做得很不到位,需求只是简单列出了几点:

1.3D效果的棋盘,玩家可以转换视角观看棋局并进行对弈;

2.落子预览,玩家在先预览落子时的效果,确定后方才完成一次落子;

3.提子功能和禁手提示,根据围棋规则,实现提子功能和禁手提示;

4.游戏回放,实际上就是棋谱的查看。

而我们基本没有进行设计就直接进入了代码实现阶段,这也直接导致了代码写的非常混乱,到最后自己都无法忍受了。不过我们的总体思路还是基本正确的,大致采用的是MVC模式。

1.模型层:

包括棋子类Piece、棋盘的落点类GoPoint、全局落点类GlobalPoints、游戏记录类GoRecord,主要用于定义基本的游戏模型,实现内部算法如找到落子点、提子等;

2.控制层:

游戏操作类GoManager,定义各种游戏操作,供视图层调用;

3.视图层:

包括棋盘类GoBoard、游戏场景类GoScene和.mxml文件。

在GoScene中创建一个3D棋盘,利用Away3D引擎中view、scene、camera等元素可以实现3D视角转换,在.mxml文件实例化一个3D棋盘,并添加各种按钮和事件,同时根据需要调用GoScene中定义的一些逻辑操作以完成相应功能。

在这里明显感觉到了设计混乱的问题,应该在一开始时就将视图层和控制层分开,GoScene类只负责棋盘的显示,具体对弈时的逻辑操作应放在GoManager类中完成,但事实是GoManager类形同虚设,整个对弈的逻辑操作全都放在了GoScene中,这是一个严重的失误。

 

尽管如此,我们还是基本实现了预期的功能,下面简单展示一下:

3D效果:

提子功能:

查看棋谱:

具体操作可参考“3D围棋游戏功能规格说明书”

 

问题和反思:

第一,时间分配问题,这不仅仅是做这个Pair-Work时遇到的问题,在很多任务面前,我们到底应该如何确定任务的优先级顺序来合理安排和分配时间?这也牵扯到项目进度估算的问题,虽然在这次Pair-Work中并不存在进度估算的问题,因为根本就不需要估算,能在规定时间内基本完成我们就已经烧高香了,但如果今后参与一些正式项目的开发,项目进度估算是一个非常重要的问题。

第二,二人如何合作的问题,这里就要说到我和蛋哥的这次合作,虽然谈不上成功,但比我预想的要好很多,因为我确实低估了蛋哥的潜力,尤其是在某种激励的作用下。蛋哥完成了创建3D棋盘和提子算法的实现,虽然开始由于操作失误创建的是ActionScript Project,后来转换成Flex Project花了我一些时间,而其他大部分工作基本由我完成。由于种种原因,没有体验一下结对编程的感觉,不过以后的Pair-Work肯定还有机会,不知道结对编程是否真如邹经理在移山之道中描述的那样神奇。

第三,如何最快的学习一门新技术并且应用到项目开发中。这次选用什么技术也花了很多时间,而最终选定Flex之后,我们又遇到了新的问题。ActionScript语言倒不是很复杂,但Away3D就很麻烦了,由于网上资源很少,只有一些技术博客和并不是很详细的英文版API,我在3D坐标转换的问题上耗费了很多时间,具体就是落子时如何根据鼠标点击位置计算出指针在棋盘上的位置从而找出最近的落子点。这个问题在平面状态下很好计算,但到了3D效果下好像有点复杂了,我在API里找了很长时间也没能够发现实现3D坐标转换的函数。后来得到LN同学的指点才找到了解决办法,虽然很简单,但这个问题的解决对我们来说实在是太重要了,如果只能在2D的视角下对弈而在3D视角下只能观看,那么我们这个游戏严格意义上是不符合要求的。

第四,具体在开发过程中,无论是在算法实现还是程序调试过程中也遇到了很多问题,虽然这些不可避免,但我还是感受到了差距和不足。

当然,能在比较紧张的几天时间里完成这次Pair-Work,我们还是很满意的,如果今后还有时间的话,我们可能考虑进行代码重构,同时添加新的功能,希望最终能发布到Web上,实现真正的3D围棋游戏对弈平台。

原创粉丝点击