当前位置:文档之家› 基于Asp .net、XML与Flash架构的火车车厢重排问题虚拟实验开发

基于Asp .net、XML与Flash架构的火车车厢重排问题虚拟实验开发

基于、XML与Flash架构的火车车厢重排问题虚拟实验开发摘要:当前,XML(Extensible Makeup Language)是跨平台数据结构的最佳选择,应用广泛。

它是一种通用的、跨平台的数据描述方法,相比于一般的记事本文件,完全采用了Unicode 编码和条理清晰的分层标签。

介绍了和Flash之间通过XML文件传递信息解决火车重排堆栈问题。

Flash使抽象的数据结构问题转化为具象的动画呈现给学生,有助于学生理解问题、编写程序。

关键词:XML;;Flash;虚拟实验;火车车厢重排0引言当前,XML是跨平台数据结构的最佳选择。

XML全称为可扩展标记语言(Extensible Makeup Language)。

它是一种通用的、跨平台的数据描述方法,也是未来存储信息的方式,其应用无处不在。

XML是可扩展的、与平台无关的语言,相比于一般记事本文件,它完全采用Unicode 编码和条理清晰的分层标签并且支持国际化。

Flash是专业的动画创作工具,可以开发有吸引力、表现力的用户界面和丰富的应用程序。

它开发的文件数据量小,可以以插件方式工作、“流”形式文件播放以及实时交互。

因此,Flash成功地渗入到网络动画、音乐电视、广告、教学、游戏等多个领域。

是基于通用语言的编译运行程序,其强大的适应性,几乎可以使它运行在Web 应用软件开发者全部的平台上。

通用语言的基本库、消息机制、数据接口的处理都能无缝整合到的Web应用中。

也是languageindependent(语言独立化)的,支持C#(C++和Java的结合体)、VB、Jscript、C++、F++等语言。

与Flash之间传值在中对数据进行处理后,生成XML树,然后通过XML 文件在Flash端接收XML文件,解析XML树后,根据传入的参数进行操作。

<sup>[1]</sup>其通信原理如图1所示。

端生成XML文件的代码如下:System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter (Server.MapPath("./1234.xml"),System.Text.Encoding.UTF8);//声明一个xmlWriter变量用于编写XML文件xmlWriter.Formatting = Formatting.Indented;//用于生成良好的显示格式,增强可读性xmlWriter.WriteStartDocument();xmlWriter.WriteStartElement("数据");//生成一个结点xmlWriter.WriteStartElement("单次");xmlWriter.WriteAttributeString("车厢",firstNum.ToString());//写入节点的属性xmlWriter.WriteAttributeString("铁轨",secondNum.ToString());xmlWriter.WriteAttributeString("出入",thirdNum.ToString());xmlWriter.WriteEndElement();xmlWriter.WriteEndDocument();//写文档结束xmlWriter.Close();//关闭textWriterFlash端接收XML文件的代码如下:var myXML:XML= new XML;var XML_URL:String = "1234.xml";var myXMLURL:URLRequest = new URLRequest(XML_URL);public var myLoader:URLLoader = new URLLoader (myXMLURL);public function Motion(){myLoader.addEventListener("complete",xmlLoaded);}2火车重排堆栈问题动画实现笔者在学习数据结构时发现授课内容比较抽象,需要具体的图解动态地描述问题。

教师需要在word中或在PowerPoint中采用绘图方式让学生理解。

但这种方式比较费事,教师需要一边讲解,一边手动拖动物体使学生理解。

所以笔者采用基于、XML与Flash相互通信的方式,使数据结构中火车车厢重排问题动态显示。

问题描述:一列货车共有n节车厢,每节车厢将停放在不同的车站。

假定n个车站的编号分别为1~n,货车列车按照第n站至第1站的次序经过这些车站。

为了便于从列车上卸掉相应的车厢,必须重新排列车厢,使车厢从前至后按编号1~n的次序排列。

在一个转轨站里完成车厢的重排工作,在转轨站里有一个入轨、一个出轨和k个缓冲轨H1、H2、H3。

开始时,n节车厢的货车从入轨处进入转轨站,转轨结束时各车厢从右到左按编号1~n的次序离开转轨站(通过出轨处)。

在图2(a)中n=9,车厢从后至前的顺序为5,8,1,7,4,2,9,6,3。

图2(b)给出了按所要求的次序重新排列后的结果。

<sup>[2]</sup>对课本上的代码重新编写,制作出简单的网页界面用于解决火车车厢重排问题,如图3所示。

其中在堆栈中可以选择利用顺序表和链式表解决问题,选择了车厢个数为9个,铁轨个数和车厢编号后点击“确认输入完成”按钮。

如果铁轨的个数足够,再点击“排序输出”按钮即可显示解决问题的方案,如图4所示;如果铁轨个数不足,则会提示再输入新增铁轨数,如图5所示。

(选择车厢个数为9个,需要的铁轨个数为3个。

)自动生成的XML文件如图6所示。

车厢的每一次运动都作为XML文件的1个节点。

而每个节点都包括车厢的编号、车厢对应的铁轨以及车厢的运动方式。

如此设计XML的节点是为了方便Flash 读取,并动态生成动画。

笔者采用FlashAS3.0语言动态实现火车重排动画。

首先定义铁轨的属性,利用graphics函数定义缓冲铁轨的形状,代码如下:public function initial():void{graphics.lineStyle(1,0xff0000,1);graphics.moveTo(0,0);//graphics.moveTo代表起始点位置,x,y;graphics.lineTo(0,210);//graphics.lineTo代表另一端位置,x,y;graphics.lineTo(60,210);graphics.lineTo(60,0);graphics.endFill();}接着定义车厢的属性,车厢利用Graphics.DrawRect函数画出,为矩形。

为了区分不同编号的车厢,把写有不同编号的文本框绑定在矩形上以示区分,代码如下:public function Coach_test(coachNum:String){mySprite = new Sprite();mySprite.graphics.beginFill(0xFF0000);mySprite.graphics.drawRect(0,0,50,26);var myTextBox:TextField = new TextField();//建立文本框var myformat:TextFormat = new TextFormat();//设置文本框格式myformat.size = 18;myformat.underline = false;var myText:String = coachNum;//给文本框赋值myTextBox.text = myText;myTextBox.width = 50;//文本框宽度myTextBox.height = 26;//文本框高度myTextBox.setTextFormat(myformat,-1,-1);//应用文本框格式mySprite.addChild(myTextBox);this.addChild(mySprite);}同时利用Tween函数定义车厢的运动方式,代码如下://车厢进入铁轨//运动方式是:Elastic.easeOut指定的就是弹性缓出运动;None.easeNone指匀速运动xTween = new Tween(mySprite,"x",None.easeNone,0,motionLen,2,true);xTween.addEventListener(TweenEvent.MOTION_FINISH,turnRound1);xTween1 = new Tween(mySprite,"y",None.easeNone,0,220,2,true);xTween1.stop();//车厢驶出铁轨xTween2 = new Tween(mySprite,"y",None.easeNone,220,0,2,true);xTween2.addEventListener(TweenEvent.MOTION_FINISH,turnRound4);xTween3 = new Tween(mySprite,"x",None.easeNone,255,500,2,true);xTween3.stop();最后,在舞台上根据XML的传值动态声明车厢和缓冲铁轨,并实例化每节车厢的运动方式。

代码如下://载入时动态生成车厢for(var j:int = 0;j<len;j++){var coachNum:String = new String;coachNum = myXML.单次[j].@ 车厢//从XML文件中读取车厢的编号var trackNum:String = new String;trackNum = myXML.单次[j].@ 铁轨//从XML文件中读取相应的铁轨var motionStyle:String = new String;motionStyle = myXML.单次[j].@ 出入//从XML文件中读取车厢的运动方式if(coachExist[int(coachNum)] == 0)//表明这个车厢在舞台上还未出现过(未实例化){var mycoach:Coach_test = new Coach_test(myXML.单次[j].@ 车厢);mycoach.x = 0;//255 出铁轨的参数mycoach.y = 100;//100addChildAt(mycoach,0);Coach[int(coachNum)] = mycoach;coachExist[int(coachNum)] = int(coachNum);num = num + 1;trace(num)}}//载入时动态生成铁轨for(var k:int = 0;k<m;k++){var mytrack:Track_test = new Track_test();addChild(mytrack);mytrack.x = 250+k*100mytrack.y = 140}//实例化车厢的运动方式var q:int = new int;q = 0;var timer:Timer = new Timer(4000,len);//每4秒开出一节车厢timer.addEventListener(TimerEvent.TIMER,handler);timer.start();function handler():void{coachNum = myXML.单次[q].@ 车厢trackNum = myXML.单次[q].@ 铁轨motionStyle = myXML.单次[q].@ 出入Coach[int(coachNum)].Coach_Motion(coachNum,trackNum,motionStyle);if(q<len){q++;}}最终效果如图7所示。

相关主题