1、毕业设计(论文) 第 34 页1 绪论1.1课题背景及目的有关调查数据显示, 2003 年全球电子游戏的销售额达到169 亿美元(EL SPA 2003)。在中国,据国际数据公司( IDC ) 于2004 年发布的2003 年度中国游戏产业报告称,2003 年网络游戏实际销售收入增长率为45. 8% , 达到13. 2 亿元人民币。随着电脑游戏的快速发展, 它已经不仅仅是一个计算机软件, 而是一种新的艺术形式,正在对电影、电视、出版、培训等各行各业产生不可小视的巨大的影响1。电脑游戏化教学也受到了很大的影响。首先,电脑辅助教学能够在很短的一段时间内传递大量的信息,对于学生们在书本上或者在课堂的
2、讨论中学到的知识有很好的强化作用,所以这种教学方式对于学生们理解复杂的概念有非常大的帮助11。而电脑游戏作为计算机技术的重要成果,能够提供给学生在学习之中所不具备的娱乐的功效,能够大大的提高学生的学习兴趣,并增强学习的效果。还有一个我们不能够忽略的是电脑应用于语言教学从60年代就开始了12 ,但是直到现在,电脑辅助老师教学还是大多数老师的一个障碍,步入21世纪的今天,我们不能够再放着网际网络的巨大潜力不用,而应该充分的发掘它应用它,让语言教学真正步入信息时代的春天。所以在此,我们希望通过此次研究,对游戏化教学在国内的实现做出初步的实践探索。由于英语教学之中需要外部辅助条件多的特点,我们选择了英
3、语教学作为此次研究的试验点,希望能够做出一个有实际应用价值的英语游戏化教学系统。1.2 国内外研究状况游戏在西方,日韩等国被认为是激发少年儿童对电脑的兴趣和爱好的最佳途径,世界各地的专家学者对游戏化辅助教学作了大量的研究比如说有ecta2001),MUVEE(Dode&Ruess),games-to-teach等项目。在英语游戏化教学方面也有如:等网站开发的网络游戏,它为我们提供了良好的范例。港台方面,台湾很多专家针对计算机游戏学习软件设计和游戏式计算机辅助教学等方面做了研究,“游戏学堂”(www.U.tw)是一个较为成功的范例,它的特点是游戏和教育的内容结合的比较自然,融合的程度比较好。香港
4、一些专家针对主流游戏或专门的教育游戏融进课堂教学时所遇到的种种实际困难,还提出了“轻游戏”的概念“轻游戏”= 教育软件+ 主流游戏的内在动机的概念4。 而在国内,近几年,游戏的教育价值开始受到多方面的重视,涌现出一批教育的单机计算机平台, 如:童趣网(www.0-)奥卓尔()等。游戏化教学刚刚绽露头角。在网络游戏方面,其研究才刚刚开始,2004年年中,著名的网络游戏代理运营及制造公司上海盛大公司,为庆祝中国共产主义青年团成立85周年,而专门制作了一款号称是国内第一款教育网络游戏学雷锋。但是我们可以看到,在英语游戏教学上,国内的研究和实践甚至都还处于几乎为零的阶段,网络游戏方面则是一片空白。 总
5、而言之,国内的教育游戏还处于很不成熟的阶段,一方面,游戏产品缺乏,产品大多是支持幼儿的,很难顺利支持游戏教学;另一方面,游戏化教学的相关教学理论,方法支持,教学模式和教学策略还没有形成系统的研究成果。在英语的游戏化教学方面,只有很少量的游戏素材,并且不是很系统,完善。1.3 课题研究方法在此次设计的过程中,我们通过自助开发游戏与整合网络中已有资源相结合的方法来实现英语游戏化教学系统,并且提供一个统一的网上平台来对这些游戏资源进行管理。在选用的开发技术上,我们使用Flash 8.0和 2003并且使用sql server 的数据库服务器,选择这样的技术的原因在于,Flash是一个便宜的功能强大的
6、工具,它能够帮助我们用更少的人力在更短的时间内开发出较从前更大,更好,更漂亮先进的游戏,而由于其在网络编程上的高效和方便,使得我们能够更加快速的编制出功能强大的服务端,由于这一次设计的主要目的在于探索游戏化英语教学,而不是偏重于具体的技术研究所以,这样的工具组合是比较合理的。在开发的途径上,我们选用Flash的功能对一套现有的Flash英语教学游戏进行整合,并且自主构思创意开发了针对网络套接字通信的联机互动游戏蜗牛赛跑。整个开发过程从借鉴他人成果到自主研制,由易到难,循序渐进,最终开发出网络平台实现我们整个的系统。整个设计流程和内容如图1.1所示:图1.1 设计流程1.4 论文构成及研究内容延
7、续了课题研究方法的思路,我们将论文也主要分为两大部分来阐述:第一部分:关于整合英语教学游戏系列的研究,这个部分的内容由两章组成,在第二章我们讨论英语的游戏化教学的概念,Flash的技术,以及使用Flash来整合SWF英语教学游戏的一系列探索。第二部分:关于使用网络与Flash结合的方式实现游戏化英语教学,在这个部分我们就将主要探讨如何使用Flash+来开发一个基于网络的Flash联机对战的英语教学游戏。第三部分:我们对作出的工作在应用上和技术上作出一个客观公正的评价。2 使用Flash技术实现轻游戏英语教学的探索2.1 Flash制作游戏基础知识首先让我们来了解一下,我们为什么要使用Flash
8、来开发游戏,Flash涉及到哪些技术要素,Flash能够为我们带来什么,我们又如何使用Flash来开发游戏。2.1.1 Flash制作游戏的优点大游戏的制作者因为疲于大游戏的团队规模,压力和制度,他们转而进行小游戏的开发. 有一个最受尊敬(同时指责)的用来做交互内容的工具,这个就是Flash,把Flash当作一个用来开发游戏的平台这个想法在近几年来正在相当程度上的逐渐壮大,事实上今天我们开发出来的休闲游戏在产品质量上已经与那些在十年前盛行的游戏相当10。那么Flash在制作游戏上具体有哪些优点呢? 简单来说Flash的主要优点如下:1 对于交互性的内容有一个优秀的创作工具。集成了用于制作游戏的
9、大多数功能。2 Flash到处都是。对于一个游戏的网络版本来说,96%的用户除了游戏以外就不要再下载任何东西了。更重要的是,很多人都不会安装ActiveX controls或使用Java plugin而Flash 则是预安装在windows的组上。3 用非常小的代价移植到Macintosh上。这让另外一个5%的市场打开,这里有那些需要好的游戏的人们。4 本质上花消是可以不记的这里有用来购买Flash IDE 很小的开销,但是发布是几乎不要钱的.6 很容易找到创作家。这里有一个庞大的团队用来为Flash创作作品或者是动画,可以是专职的也可以是临时的。7 当你在做GDC报告的时候可以将你的游戏嵌入
10、到PowerPoint中。8 容易的复制粘贴操作。Flash允许从一个FLA到另外一个的拖放或者复制粘贴的操作,并且它自动的将独立的组件带到新的库中。这使得它能够快速的在主要的游戏之外尝试新的创意,同样着也使得使用调试器变的有价值。9 一个很大的社区和二级市场。这里有数以千计的Flash相关的网站,里面包含了教程,文章,讨论等。这里有数以百计的Flash插件和组件用来销售。总而言之,使用Flash的主要优点在于它很适应制作游戏的需要。整个游戏机制能够在几个小时之内做出原型,包括正规的作品,都打包在一个SWF中,它能够运行在PC, Mac, 或者 Linux上,通过浏览器或者单独的播放器我们都能
11、够看到,而且是免费的。并且我们还可以方便的扩展到大型的游戏,这是相当诱人的。2.1.2 Flash制作游戏的相关构件Flash事实上是三个组件的组合体:播放器,文件格式,和创作工具3。播放器:每个人都知道什么是Flash播放器,据调查显示几乎每台在因特网上连线的连线的电脑都有Flash,它的渗透力甚至超过了浏览器,达到了96%。播放器包含有:一个虚拟机,一个分层的可视的桢处理对象模型, 一个媒体反编译器, 一个框架库和绘图算法等。1 文档格式化 我们所说的Flash 文档格式化就是SWF(这是来自Shockwave Flash 的简写,英文中读作“swiff”),这些年来SWF不断得到重新的审
12、视SWF是一个基于标签的用来处理流文件的二进制编码,在其顶层有一个zlib的压缩来保证它的小巧。非常重要的是我们不能混淆Flash和SWF因为Flash加密了FLA的文档编码,并且播放器也加密了源代码,SWF作为一个文档编码是免费且开放的。2 开发环境 制作Flash实际上是和Visual Studio是一样的,它包含了代码编辑器, 绘画编辑器, 编译器, 调试器, 帮助系统等开发人员常常使用的工具,这使得开发Flash变得简单.市面上还有许多其他针对Flash的第三方工具可以使用,如提取Flash元素的Flash decompiler,用于生成Flash 可执行文件的打包工具SWFKit等等
13、这些都给Flash的游戏开发带来了方便。最终我们选择了macromedia公司的Flash 8作为主要的开发工具并且使用Flash decompiler,SWFKit等作为我的辅助工具。2.1.3 如何使用Flash来制作游戏在这一段时间的探索中,我遵循以下步骤来开发我们的Flash 游戏。1 游戏的构思,这个应该是使用Flash来开发游戏的核心部分。2 游戏素材的提取与制作,对于一个小型的预算不高的游戏来说,使用已有的素材并且适当的创作一些素材是一个比较好的方法。3 素材的整和,通过桢和影片剪辑可以很好的实现我们的目的。4 后台代码的开发,为了实现游戏的逻辑,我们可以使用Flash的act
14、ion script来开发后台的代码,由于action script 的功能还不是特别完善,需要结合像java asp等编程语言来实现更加强大的功能,我们可以调用action script中的loadvar loadxml等函数来调用外部的功能模块和数据。2.2 使用Flash 技术实现游戏化英语教学我们开始使用flash的制作动画和其中的脚本部分来开始第一步: 整合flash游戏。2.2.1素材收集 我们开始组建这个游戏教学项目的拼图的第一块,让我们从前人已有的项目开始,在这里,我选择了星沙英语网中提供下载的英语教学系列游戏( 作为素材。它包括满满甜甜系列,小兵仔系列,大虾与小虫系列,小飞与
15、四眼妹系列等近百个Flash小游戏,内容覆盖了从一年级到初中的各个阶段所学的单词,句式,语法。由于其丰富的声音和图像素材,成为我们第一步开发所要研究和效仿的优秀作品。部分作品的图片如图2.1所示: 图2.1 选取素材2.2.2 关于整合Flash相关资源的探索在整合我们先前所提到的若干Flash的资源的时候,我们首先考虑到的是在其中要加入完这些游戏的用户的一系列参数来控制用户在玩游戏的过程之中的场景的跳转,比如说满满甜甜系列是适用于一年级学生玩的游戏而我的朋友是二年级学生玩的游戏,那么我们就应该使用相应的参数来记录玩家的英语水平,使得他们不能够在只有一年级水平的条件下进入二年级游戏的场景。有了
16、这样一个思想,我们很自然的就会想到要修改游戏的内部代码,添加相应的参数,并且使用Flash中的loadmovie或者是场景之间跳转的机制来实现我们设想的功能6,在此,我采用了以下的三种方式:1 Flash内带有的loadMovie功能:采用的方法是在舞台上放置一个叫做window_mc的影片剪辑,并且在场景下方设置一些按钮来控制具体要装载的SWF游戏文件,用户的参数保存在一个文本的xml文档之中,通过调用loadVar来加载数据,这种实现方案的如图2.2所示: 图2.2 整合方案1这种方式的优点在于,它能够使用一个单独的场景来方便的实现游戏的装载,但是它也有一个致命的缺点,那就是当你使用按键的
17、时候,由于在游戏内部使用的是tellTarget命令,这样由于中间加入了一个影片剪辑层,相应的按键对象就不能够找到,这样就不能够实现对游戏的完全控制。2 第二种方法与第一种方法的结构是一样的,所不同的是他使用的是另外一条命令那就是loadMovieNum()方法这个方法的特点在于它能够直接将SWF游戏文件装载到Flash的一个级中而不是影片剪辑,这样我们就可以防止tellTagret找不到目标文件的情况的发生,但是它也有一个缺点,那就是由于它是将影片直接装到一个级中,那么原先在这个级中的其他对象就会被全部销毁,那么我们用来控制游戏逻辑的其他控件就不复存在了,我们只能通过增加舞台的大小在其他的级
18、中加入控件来解决这个问题,但是显然游戏的美观度就会大打折扣了。最后我们还要是使用文件夹等组织我们的SWF素材,使用SWFKit来将我们整合好的SWF文件进行大包成为一个独立的exe文件来发布,这样当用户要使用这一成套的游戏时就更加方便了。这个方法如图2.3和2.4所示:图2.3 : exe文件图标图2.4 整合方案23 前面两种方法都有我们不可回避的弱点,那就是他们并没有真正的实现游戏的整合,因为我们选择的Flash游戏系列并没有传递参数给主控制文件main.SWF,这样游戏也就不可能真正的实现逻辑控制,解决这个方法的办法就是使用Flash decompiler将SWF文件还原为fla文件然后
19、将这些fla文件插入到main.fla文件中的不同场景,并给他们设置不同的标签,通过tellTarget的方法来实现跳转,毫无疑问,这个方法是最好的方法,但是通过实践,我们发现这个方法是最不可行的方法,其理由如下:1 如何将fla导入?我们没有发现有相关的第三方软件,只能通过拙劣的复制粘贴的方法来导入,但是这个方法的最大弱点在于macromedia的Flash 8的缓存是有限的,而我们的游戏大多都具有上百个图层,这样必然会出现信息丢失的情况,那么我们就要手动的对确实的部分对应原fla文件进行修改,这样的工作量不是一个程序员能够负担的。2 反编译的fla文件能运行吗?这个问题才是最关键的。事实上
20、由于原SWF文件中存在大量的tellTarget语句,导出的fla文件全部变成了数字编号而不是原先的字符串,那么这样的游戏当然是问题多多了。2.2.3 实现Flash整合的英语教学软件的效果评估最终,我们放弃了这个方案,选择了第二个方案,原因很简单,它是唯一一个能让游戏运行的方案,没有实现游戏之间的逻辑控制,这是一个教训,也是后来者值得借鉴的参考。2.3 小结通过这一章,我们熟悉了Flash的原理优点构造,并且使用Flash做了整合Flash游戏的相关尝试,我们知道,在不修改素材代码的情况下,想要对其进行真正意义上的整合是不可行的,但是我们最终还是找到了一种虽然不怎么理想,但是可以运行的方案
21、并且完成了对Flash知识的初步储备。3 使用网络与Flash结合的方式实现游戏化英语教学在经过整合已有资源形成系统化英语教学的尝试失败以后,我们开始尝试着使用自己的力量,依靠自己的智慧来开发一个小型的英语网上游戏化教学平台,在此,我们依然使用Flash作为主要的开发平台,并且借助中的c#这一个强大而易用的语言来开发我们的服务器端的程序,这一章是此次研究中花时间最多而且技术含量最高也是难点体现最为集中的一个部分,我们将不会吝惜自己的笔墨以以下部分来展开阐述:3.1 实现思路的基础部分在我们描叙我们要做什么,怎样做的时候也许一张清晰的视图可以胜过千句百无聊赖的陈词,那么在此节中我们以两幅图来为
22、以后的阐述铺平道路。首先是游戏的结构如图3.1所示: 图3.1 游戏结构可以看到在图3.1中,服务器端提供的服务是整个游戏的核心部分,游戏功能的实现,数据的交互都需要通过服务器着一个平台来实现,而服务器的性能和质量也就决定了游戏的性能和质量。让我们再来看看图3.2:图3.2 游戏流程我们也许会认为这两幅图之间毫无关系,但是事实上有一个东西将他们直接联系,并且决定了整个游戏的成败与否,那就是数据结构,有关数据结构的讨论是此次研究之中最为重点,也是最精彩的部分,将在后面的部分加以详细的阐述。3.2 关于Flash与外部之间的关系在开始正式讨论我们的工程之前,我们先要了解Flash与外部进行通信的几
23、种不同的机制和原理,这样有利于,我们在后续的工作中权衡利弊,找出最佳的解决方案。3.2.1 perl+cgi+mysql与Flash游戏进行通信的原理CGI 意思为 Common Gateway Interface, 一种基于浏览器的输入、在Web服务器上运行的程序方法,它运行在Server上,提供同客户段 Html页面的接口,cgi为客户端与服务器间的交互提供了一个方便的方法,在Flash中可通过使用loadVar方法来实现对cgi的调用,但是有一个条件那就是,cgi的程序接口必须是通过http方法来调用的,也就是说服务器端的程序必须是放在网络服务器中的,事实上cgi是比较适合动态交互性不是
24、太强的网络应用程序的,考虑到我们在游戏结构图中描叙的游戏需要实时交互的功能,cgi不容易实现,所以仅在此简单的介绍这一个功能,不作深入的研究,事实上用cgi+perl+Flash制作一个简单的留言版是很适合的。3.2.2 Asp+Flash+access的尝试笔者在网络上曾经看到了一个使用asp+Flash+access的实时聊天室工具,顿生兴趣,既然它支持多人在线的实时聊天,为什么不能支持,在线游戏呢?带着这样一个想法,我们就开始了使用这个技术来支持Flash多人在线游戏的尝试。要让游戏能够运行,首先要让asp能够运行,asp在这个方面是与cgi非常相似的,那就是它必须以http的方式来传播
25、数据,换句话来说,它也必须在www服务器中通过浏览器连接才能运行,而在Flash中调用asp的原理是与cgi完全一致的,那就是loadVar方法,唯一不同的是asp是通过脚本语言来运行的,目前支持的有javascript和 vbscript等等。迪士尼乐园的路是游人们走出来的,这样一个方案能否实现,还需要由实践来检验,我们写了一个asp的对access数据库注册的文件,并且在Flash中实现对其的调用,但是很快就发现一个问题,那就是asp对access只能读取而不能修改,增添。经过很长时间的摸索才知道这是由于磁盘的安全性限制所造成的,这个问题通过修改磁盘的安全属性并不能够得到解决,直到最后笔者
26、索性把c盘的文件格式从ntfs改成了fat32才得到了解决,这是此次研究中的一个疑点,并未得到根本的解释。对于数据库的操作不是让游戏能够运行的最终办法,我们还要致力于如何实现游戏的实时交互,既然这个方案能够实现实时聊天,那么就应该能够支持在线游戏。但是我们很快就发现这个想法是错误的,因为Flash+asp实现在线聊天只是表面上的实时交互,在内容上,不能够称得上是一个实时技术,因为在分析asp代码的时候我们发现,作者只是在asp中加入了一个缓存,每当有用户发来聊天信息的时候它只是在缓存的最后加上这新到达的信息,不存在对任何用户的握手连接,只是在缓存中包含了用户名,给与了我们这样一个假象仿佛有多个
27、用户的多个聊天线程在运行。3.2.3 关于使用c#套接字与Flash通信实现联机既然聊天室的方案不能实现在线游戏,那么点对点的聊天能行吗?我们不能以偏概全的因为一个类似的方案不能执行就草率的否定另一个方案。网络上除了有聊天室的解决方案还有一个,点对点聊天的方案,实现的技术却是完全不同的那就是c#+Flash的套接字连接方案,恰恰,这才是我们的真命天子。这个方式的实现机理在于,当客户端运行的时候,它便建立一个xmlSocket的连接套接字,而作为c#编写的服务器端也有一个循环运行的侦听程序,当接到这个连接请求的时候,便创建一个客户线程作为一个信息的专用通道,当客户指定与某人聊天的时候,服务端便将
28、消息从一个线程转发到另一个指定的线程。实现了实时的通信 8。3.3 游戏结构与功能的实现游戏结构功能的实现其实通过读游戏的结构图就已经可以很清楚了,我们无需赘言,在这里,笔者想就三个问题展开论述,那就是为什么访问数据库也要通过服务器端程序?为什么要在开始的时候读取xml web配置?为什么游戏的题目要放在客户端的xml文件中读取?为什么访问数据库也要通过服务器端程序?显然我们是做过有关使用asp独立于服务器端读取数据库的试验的,但是为什么要将数据库操作也整合到服务器中呢?它的原因就在于asp与Flash的通信与c#服务器与Flash的通信是不基于同一个网络通信协议的,asp使用的是无连接的ht
29、tp协议而xmlSocket却是要建立起三次握手的tcp协议,协议的不同,使得我们如果把Flash嵌入到浏览器中运行的话,我们根本就不可能建立起与服务器之间的连接,那么实时交互也就成了空谈。所以真正的解决方法就是将数据库操作集成到c#服务器端,而客户端则是一个纯粹的c/s模式程序。为什么要在开始的时候读取xml web配置?这是在实际问题中的考虑,由于服务器端是固定在2000端口侦听,但是由于我们的设计的实验室的ip是不固定的,这样就要求客户端有一个反应机制,使得能够在首ip连接地址不能找到的情况下读取配置文件,顺利建立起连接。这个问题即便是在未来的实际投入生产中也是很有意义的,网络的分布式应
30、用使得扩大游戏同时在线容量成为了可能,对服务器进行维护成为了可能,防止单点故障也成为了可能。为什么游戏的题目要放在客户端的xml文件中读取?这是我们在权衡了服务器的负荷后考虑采用的方案,试想一下,如果同时有多个用户从服务器端读取大量的题目数据那会怎么办?显然服务器将不堪重负,而我们可以让服务器变得轻松,那就是将题目整合在客户端,而服务器端只需给在线的用户发送同步的信号量便可以实现所需的功能。选取题目的随机性使用一个random()函数足矣。3.4 关于数据结构的讨论首先我们要申明的是在工程之中设计的数据结构是有缺陷的,正是这些缺陷引入了一个后面的几个有趣的论题,而在我们后面的论述中,我们也将改
31、进后的数据结构加以阐述,希望给后来人一些有用的借鉴.3.4.1 Flash端的数据结构Flash端的数据结构主要由一个表示游戏在线状态的sitArray数组,和几个表示游戏状态的数值,还有若干个信号量组成.其结构如图3.3所示:图3.3 Flash端数据结构下面我们来对这样的数据结构加以解释。1 sitArray是当登陆成功以后从服务器端传过来的关于网络在线玩家信息的一个数组,我们可以这样举个例子,比如说,有玩家a他进入游戏选择了a角色并且坐在了游戏桌1上那么这个时候当玩家b进入游戏的时候sitArray数组的sitArray0就变成了a这样当玩家b真正进入游戏的时候场景中就会根据sitArr
32、ay的信息来装载相关玩家的信息.所以sitArray是伴随整个游戏始终并且不断得到更新的。2 sit_str这是与sitArray紧密联系的,不同之处在于sit_str是保存个人的信息,而sitArray是保存整个网络在线游戏的信息。3 username和pass是用于注册时的临时变量,存在于25桢4 username在第一桢得到保存,主要用于在游戏结束后借助这个参数修改数据库中的分数.5 sound是控制装载的游戏背景声音的信号量.6 log,finish,cli,v1等都是用来控制游戏进度的信号量.7 Myxml,key_arr,t_arr,result_arr 等装载试题的相关参数8 s
33、tartTime和curTime是用来控制时间同步的.仔细分析一下我们就可以发现,实际上这样的数据结构设计方式是存在问题的,首先他们分布在不同的桢中,这样给调试带来了很大的不便,也不利于将来功能的更进一步完善,同时他们缺乏一个统一的分类,存在和作用都很随意且分散,没有一个很好的逻辑.那么我们给出如下的改进方案:1 将所有的数据在第一桢就申明.2 建立四个不同类型的数组来保存信息包含有:一个从服务器传来的游戏网络信息(包含sitArray),一个保存玩家状态的信息数组(包含username和pass, sit_str),一个用于保存系统状态的数组(包含Myxml,key_arr,t_arr,re
34、sult_arr,startTime和curTime等),一个用于控制的信号数组(包含log,finish,cli,v1,sound等),以图3.4来表示:图3.4 改进后的Flash端数据结构这样整个程序的数据就清楚多了,由于数组的可扩充性,我们可以在后续增添更多的数据而不需改变原有的数据结构,而在调试的时候就更加方便。3.4.2 服务器端的数据结构接下来我们分析服务器端的数据结构。图3.5 服务器端数据结构如图8所示,服务器端其实很简单就是有一个与客户端对应的sit数组和控制游戏开始的若干信号量组成,还有一个user数组这个数组未能与sit合并是我们这个设计的一个重大失误,也引出了后面的几
35、个有趣的讨论。3.4.3 数据之间传递的方式由于xmlSocket只能够接受字符串形式的数据,我们不能通过传递数组的方法来解决大量数据传递的问题,但这并不等于我们不能够传递数据,有一个方法可以实现数组的传递那就是string tokens = clientcommand.Split(new Char|);这样的语句,它可以将一个字符串分割成为几个字符串,那么不就正好实现了我们的数组传递的功能了?同时,我们可以将传递的信息分为命令部分和内容部分,命令部分就是tokens0,而内容部分就是其它tokens的部分。我们可以把命令分为客户端命令和服务器端命令,分别如表1,表2所示:命令名称含义CONN
36、建立连接LOG登陆用户REG用户注册SIT用户进入游戏场景START用户准备开始RIGHT用户答题正确SCORE用户到达终点GONE用户离开表3.1 客户端命令命令名称含义CONN建立连接LIST登陆后返回给用户联机信息FAILED登陆失败等REGS注册成功REGF注册失败RIGHT用户答题正确START开始游戏OVER游戏结束GONE用户离开表3.2 服务器端命令 到这里,很多人都会诧异,为什么客户段和服务器端都有用户退出的命令呢,这是因为客户退出的两种完全不同的机制所造成的,也导致了我们将要讨论的几个有趣的问题。3.4.4 几个有趣的问题为什么客户段和服务器端都有GONE的命令呢,因为用户
37、有两种不同的退出方式,一种是点“ 退出”这个命令来退出,另外一个就是直接关闭窗口强行退出,前面一个是在客户端发送的GONE命令,而后者则是由服务器端发送的GONE命令,而恰恰是服务器端发送的这个命令成为了我们讨论的焦点。让我们来回忆我们先前讨论的数据结构,由于数据在开始的设计的时候是分散的,这样当我们在最初建立与服务器连接的时候,我们没有把username传给服务器,当用户强行退出的时候,服务器甚至不知道是谁退出的!这时候大家也许会想,那我们从头开始吧,修改数据结构,然后将用户名在建立连接的时候传递给服务器作为一个数组保存,当由用户退出的时候,我们就可以提出这些记录分发给在线的用户来重新修改游
38、戏的数据。没错,这个方法是可行的,正确的,但是耗费的工作量未免太多了?那么有没有在不修改数据结构的前提下提醒各个用户是谁退出了呢?请先看图3.6:图3.6 处理强行退出的异常 在说明这个图之前,我们先解释一下,虽然说我们在最开始的时候由于数据结构的设计错误,使得当有用户强行退出的时候,服务器端不知道到底是哪个用户退出,因此就不知道如何修改原有的游戏数据来更新给依然在线的用户。那么我们非要修改数据结构吗?不见得,我们虽然不知道哪个用户退出了,但是我们还知道哪些用户依然还在线,我们减去这些还在线的用户,那么退出的用户不就自然而然的知道了吗?那么我们如何实现呢?现在可以回到上面的图了,当服务器捕获到
39、由用户断开连接的异常后,便给每个在线的用户发送一个信号量为“GONE”当在线的用户收到这个信号之后,便将自己的用户名,以前面加“RESET”.发送给服务器,当服务器接收到这个信号后便更改sit数组再将更改后的数据返回给用户,以便更新。但是我们也许想得太简单了,如何实现这个思想呢?我的想法是这样的,现在我将部分代码提供: d1=0 s1=0 d2=0 s2=0for(I=1;I=client.count;I+)siti=”0”;if (tokens1=i.tostring) siti=tokens2;将代码进行测试的时候,我们发现了一个很奇特的现象,当我们有一个用户强行退出的时候,这时候所有的用
40、户都被清空了,那么这是什么原因呢?不多久,我们又发现了另外一个现象,那就是当游戏是只有两个人玩的时候,这时如果有用户退出,另外一个用户的显示却是按照我们的设计来运行的,那么多人和两人的区别到底在哪里呢?区别就在于,由于每个用户建立与服务器的连接的时候,都独自建立了一个线程,当有人退出的时候,上面的代码都是在各自用户的独立的线程中运行的,服务器将各个线程的计算结果综合后返回给客户端,由于各个线程只认为各自所属的用户在线,而其他用户都不在线,这样服务器在进行综合计算的时候,便将各自线程的运算结果相互抵消了,这就是为什么所有用户都会被清空的原因。而两个人在线的时候,当有人退出的时候,这时就只剩下一个
41、线程了,也就不存在综合运算的问题,服务器直接将这个结果返回给这个在线的用户,这甚至有点像echo服务了。 显然,我们应该将这个功能单独放在服务器端的主线程中运行,每个用户将自己的信息发送过来的时候,就调用这个函数,但是此时我们不能够再使用上面的那段代码了,因为在每次调用这段代码的时候所有的信息就被清空一次,那么最后发送给用户的只有一个用户的数据,那么我们不能这样做,我想通过以下的方法来实现功能,请看图3.7:图3.7 统一校正异常实际上,我们只要将校验后的数据发送给客户端就行了,因为客户端在连接服务器的时候已经有了关于游戏的备份,只要在这个的基础上结合发送过来的数据加以修改就行了。这个方法我还
42、没有尝试,作为对数据结构设计失误的一种补偿,可以说,这种方法还是不尽如人意的,只是希望后来人能够做好开始的数据结构的设计,以备后患。3.5提供一个网上平台我们前面做的两项工作整合游戏,自主开发游戏已经告一段落,最后的收尾工作就是提供一个统一的平台将这些资源进行整合。我们开发了一个名叫小蜗牛的网站,如图3.8所示:图3.8 网上平台主页这个网站有四个部分组成,第一个部分就是主页,它主要提供对其他页面的连接,第二个部分是新闻中心,主要提供一些大的英文媒体的新闻以供阅读,以提高学生的实际英文水平,第三个部分就是下载中心,它提供对我们整合的游戏的下载,最后一个就是留言板了,它是由一个嵌入到网页中的Fl
43、ash+asp+access的留言本组成。为了网站将来的维护,我们还设计了如下图3.9所示的数据库 9:图3.9 数据库3.6小结 我们在这一章主要讨论了关于自主开发网络对战的英语教学游戏平台的问题,我们花了大部分的时间在讨论关于如何使flash与外部通信和数据结构的问题,反而在具体的实现的技术和步骤上我们谈的很少,这是因为在做flash的网络游戏的时候,我们关键要解决的问题是如和将flash与外部通信和怎样合理的传递数据的问题,我们能够将这样两个问题弄清,那么在未来开发基于flash的英语游戏化教学系统就具有更广的适用性。4 结论 在因特网如此丰富的今天,各种各样的英语教学网站层出不穷,不管
44、是数量上还是质量上都非常的可观,但是真正做游戏化英语教学这个方面的研究的公司现在还是凤毛鳞角,我们希望通过这一次的研究能够在这个方面有所突破,但限于能力限于时间,只能做出一个比较粗劣的游戏以供测试。但是同时,我们的工作还是有一些值得注目的闪光点的,首先游戏化英语教学本身就是一个开创性的工作,其次在游戏整合的尝试失败以后我们进一步实验了一个更加有前景的游戏模式,那就是网上对站的模式,这对激发学生们的学习热情是很有帮助的,最后我们讨论了网上游戏对战的设计中一些关于在多线程模式下,数据结构的设计和一些有趣的问题,相信这样的讨论无论是对于英语游戏化教学系统开发本身,还是其他的系统,都具有参考价值。我们
45、在开始时以“小蜗牛”来命名我们所做的工程项目,希望这个工作能够像蜗牛那样虽然缓慢但是每天都能够一步一步的往上爬,即使在这次设计结束以后还能够得到不断的完善,最终实现我们的目的。同时也寄期望于后来的学生们,英语学习就好像蜗牛跑步是一个很长很长的过程,我们应该不畏艰险,勤奋学习,攀登知识的高峰。最后,以此拙作,作为毕业的唱响。致谢在此,我要感谢我们的导师,xx教授,是他周密的计划和严格的要求才能使我们能够顺利且高质量的完成此次设计。同时也感谢我的同窗xxx同学,是他的无私提供了Flash留言板方面的素材,我们才不至于在技术上走太多的弯路。感谢软件学院孜孜不倦的工作人员,是他们的勤勉才让我们有这样好
46、的环境从事研究工作。参考文献1 王琴 E_游戏化教学模式研究D.南京:南京师范大学 20052 Lisa Stanziano 学习Flash 8中的action script 2.0 M. Macromedia, Inc.601 Townsend St.San Francisco, CA 941033 Lisa Stanziano Flash 教程 M. Macromedia, Inc.601 Townsend St.San Francisco, CA 941034 尚俊杰, 李芳乐, 李浩文“轻游戏”: 教育游戏的希望和未来D.香港 香港中文大学 20055 杨东杰 多媒体英语教学软件应具备的要素 D. 陕西 陕西工学院 19996 颜金桫 Flash MX 2004 ActionScript 2.0与RIA应用程序开发 M.香港 飞思数码设计院 20057 连仕锋 广毅 教育网络游戏2006新看点 A.北京 20068 郝刚 ASP.NET 2.0开发指南 M.北京 人民邮电出版社 20069 微软公司 数据库程序设计M. 北京 高等教育出版社 2004 10 Scott Bi