FLASH课程设计五子棋游戏制作

上传人:痛*** 文档编号:41592707 上传时间:2021-11-21 格式:DOC 页数:19 大小:216.52KB
收藏 版权申诉 举报 下载
FLASH课程设计五子棋游戏制作_第1页
第1页 / 共19页
FLASH课程设计五子棋游戏制作_第2页
第2页 / 共19页
FLASH课程设计五子棋游戏制作_第3页
第3页 / 共19页
资源描述:

《FLASH课程设计五子棋游戏制作》由会员分享,可在线阅读,更多相关《FLASH课程设计五子棋游戏制作(19页珍藏版)》请在装配图网上搜索。

1、信息科学与工程学院课程设计任务书 题目: 二维动画设计-五子棋游戏制作 学 号: 姓 名: 专 业: 课 程: 二维动画设计 指导教师: 职称: 完成时间: 2012年5月-2012年6月课程设计任务书及成绩评定课程设计的任务和具体要求二维动画设计课程设计为该门课程的综合设计环节,能够有效锻炼学生的自主学习能力和综合设计能力,培养学生的创新精神和动手实践能力。 1、内容要求: 1)Flash动画作品内容完整丰实,思想健康、积极向上,表现一个主题。 2)动画作品有适当的控制交互功能。 2、技术要求: 1)动画画面设计合理,画面转换恰当。2)体现Flash编写小游戏的优势。3) 掌握ActionS

2、cript 3.0类的定义和使用。3)在动画实现中,可采取任意技术。3、美工要求: 动画画面颜色运用适当,美观,视觉效果好,并具有个人设计风格。指导教师签字: 日期: 指导教师评语成绩: 指导教师签字: 日期: 课程设计所需软件、硬件等所需软件: Flash CS5、Word 2010所需硬件: PC机课程设计进度计划起至日期工作内容备注2012.6.11-2012.6.162012.6.17-2012.6.242012.6.25-2012.6.26 搜集素材、准备课程设计资料用Flash CS5制作课程设计 撰写课程设计实验报告参考文献、资料索引序号文献、资料名称编著者出版单位1 Flash

3、 cs3动画制作案例教程 俞欣 北京大学出版社 2 动画设计原理 于瑾 西安科技出版社3 Flash精彩动画设计 柏松 航空工业出版社4 Flash动画风暴 伍福军 北京电子出版社5 AS3.0游戏制作案例教程 张辉 清华大学出版社18目 录1、概述4 1.1课程设计目的41.2课程设计要求4 1.3 ActionScript 3.0 4 1.4五子棋术语 52、总体设计方案 5 2.1算法分析52.2界面设计6 2.3代码编写63、详细设计方案6 3.1游戏界面设计 6 3.2代码分析6 3.3类源代码 74、最终的合成与输出 15 4.1输出文件 15 4.2游戏缺点与改进 165、课程设

4、计的总结 16一、概述1、 课程设计目的二维动画设计课程设计为该门课程的综合设计环节,能够有效锻炼自主学习能力和综合设计能力,培养创新精神和动手实践能力。通过此次课程设计应: (1). 熟练掌握flash制作所需的基本知识。 (2).熟练掌握Flash动画的整个制作过程。(3). 进一步熟悉AS 3.0面向对象编程的方法及技巧。(4). 充分利用Flash实现游戏编程的优势完成五子棋游戏的制作。(5). 真正做到学以致用,将所学应用于实践。(6). 将以往所学的知识与本课程综合起来应用于实际设计中,培养在实际工作中分析问题和解决问题的能力。2、课程设计要求 通过本次设计,应达到下列基本要求:(

5、1)了解Flash CS3元件、场景、图层、帧的基本概念。(2)熟悉面板设置和场景操作(3)掌握绘画工具的使用、辅助选项和属性的设置。(4)掌握Flash CS3时间轴的概念、时间轴中各元素的功能及操作方法。(5)理解图形、元件与实例相互关系和区别及创建、编辑方法。(6)掌握逐帧动画和补间动画的制作方法。 (7)认识Action script3.0语句。 (8).利用Action script3.0中的语句设计简单的交互能力。(9). 掌握Action script3.0编写游戏的方法和技巧。(10).掌握Action script3.0中类的定义及使用方法。 (11).掌握各种动画作品的测试

6、、优化、输出及发布。3、ActionScript 3.0ActionScript 3.0是针对 Adobe Flash Player 运行时环境的编程语言,它在 Flash 内容和应用程序中实现了交互性、数据处理以及其它许多功能。各种交互功能的实现都要依赖于AS 3.0。运用它编写具有交互性的小游戏是很有优势的。4、五子棋术语五连:五个同一颜色的棋子在一条线上,首先形成这一局面的的一方获得胜利。四四:一子落下同时形成两个“四”的棋形。四三:同时具备两个先手,其中一个为“活三”,另一个为“四”。三三:一子落下形成了两个活三的棋形。活四:四个同一颜色的棋子在一条直线上,并且两边没有阻挡。嵌五:也叫

7、跳冲四。活三(包括连三和跳三):连三是紧紧相连的同色的三子;跳三是中间间隔一子的活三。眠三:一端有对方棋子阻拦的三叫眠三。假活三:在活三两端相隔一点的位置上有对方的棋子(或边线)的阻拦。活二:包括连二和跳二。眠二:一端有对方棋子的阻拦“二”。假活二:在活二两端相隔一点的位置上有对方的棋子(或边线)的阻拦。长连:相同颜色的连续六子或六子以上。二、总体设计方案2.1算法分析: 假定我们遵循最基本的五子棋规则,不考虑长连和黑子禁手的问题。要让电脑能够根据盘面状态决定在哪里下子,就需要考虑盘面上可能落子的重要程度,并选择其中最重要的点,为此需要通过给这些点打分来最为衡量的标准。 对重要程度的评估,主要

8、依据就是在这一点上落子的可能形成的局面,如果能够形成五子连珠,那就是必胜的点,得分最高;同样四四、四三和活四都是可以制胜的棋形,得分也应很高;而三三、眠三等棋形分值相对较低一些。得分最高的点就是落子的点。 对博弈中的一方而言,不仅要评价对自己最有利的的落子点,还要考察对自己最有威胁的落子点,也就是对对手最有利的落子点,如果对手下一步可以走出五子连珠的棋形而自己只有活四,那么显然应该首先要消除对方的威胁。因此落子前应综合考虑自己和对方最有利的棋局,然后决定下一步棋该怎么走。 为方便对棋局进行评估,我们在这里规定各个棋形的得分: 眠二:2分 假活二:4分 眠三:5分 活二:8分 冲四、眠四:12分

9、 假活三:15分 活三:40分 活四:90分 五连:200分,当轮到自己落子时加倍。2.2界面设计 棋子类型:黑子和白子; 【开始游戏】按钮实例名为btnStart,类型SimpleButton; 【再玩一遍】按钮实例名为btnReplay,类型SimpleButton;棋子选择按钮实例名为mcSelectChessman,类型MovieClip;游戏结局提示信息实例名为mcGameState,类型MovieClip;2.3代码编写游戏程序包含两个类文件,都放在Classes包中。Clessman用来生成棋子,GobangDoc类是文档类,用来管理游戏的所有交互功能。在Flash软件中新建两个

10、拓展名为.as的文件,并在其中编写两个类的代码。三、详细设计方案3.1游戏界面的设计: 游戏界面设计很简单,主要有棋盘、黑白棋子、两个按钮(开始游戏按钮和再玩一遍按钮、),棋子选择按钮和提示消息等组成。游戏界面分析:我们把【开始游戏】按钮和【再玩一遍】按钮放在同一位置。【开始游戏】按钮实例名为btnStart、【再玩一遍】按钮实例名为btnReplay。这两个类型的按钮都是SimpleButton类型。开始时btnStart遮住btnReplay,当单击btnStart进入游戏后,将btnStart的visible属性设置为false,就可以显示出btnReplay。 棋子选择按钮实例名为mc

11、SelectChessman,类型为MovieClip类型,棋子选择按钮在界面下方,用来让玩家选择自己使用的棋子类型,在时间轴上包含两个关键帧,名称分别为“white”和“black”,在“white”帧上有一个stop()动作。当玩家选择改变棋子时,就在这两个关键帧之间跳转,以显示白色或黑色的棋子。 游戏结局提示信息实例名为mcGameState,也是一个MovieClip类型的元件,它的时间轴上有两个名为“win”和“lose”的关键帧。分别显示胜利和失败的信息。游戏开始时将它的visible属性设为false,一局结束之后在设置为true。3.2代码分析 游戏程序包含两个类文件,都放在C

12、lasses包中。Clessman用来生成棋子,白子和黑子都是由这个类派生,方法是改变他们的连接属性。将基类指定为Chessman,而类名分别为“WhiteChessman”和“BlackChessman”. 。 我们不必为WhiteChessman类和BlackChessman类提供专门的类定义,它们除了颜色以外其他的属性都相同。 单击【确定】按钮,会弹出“ActionScript类警告”对话框,提示swf文件中会自动生成相应的类定义,继续单击【确定】按钮即可。Chessman类中有一个属性bPlayer,用来标记当前这种颜色的棋子是不是玩家使用的棋子。此外还有一个方法是twinkle(),

13、作用是当棋子落在棋盘上后闪烁几次,便于玩家看到。GobangDoc类是文档类,用来管理游戏的所有交互功能。3.3两个类源代码 (1)Chessman类的代码如下: package Classesimport flash.display.MovieClip;import flash.events.*;public class Chessman extends MovieClipprivate var inc:uint = 0;public var bPlayer:Boolean = false;public function Chessman()this.addEventListener(Eve

14、nt.ENTER_FRAME,twinkle);public function twinkle(e:Event):voidif(!bPlayer)if(inc15)this.alpha = (inc%5)/5) + .2;inc +;elsethis.removeEventListener(Event.ENTER_FRAME,twinkle); (2)GobangDoc类的代码如下:package Classesimport flash.display.*;import flash.events.*;import flash.geom.*;import flash.text.TextField

15、;public class GobangDoc extends MovieClip private const gridsize:Number = 20;private const gridnum:Number = 15;private const NOTHING:uint = 0;private const BLACK:uint = 1;private const WHITE:uint = 2;private var crtSide:uint = WHITE;private var mySide:uint = WHITE;private var otherSide:uint;private

16、var canPlay:Boolean = false;private var aGridState:Array = ;private var aChessmen:Array = ;public const STWO:int = 2; /眠二public const FTWO:int = 4; /假活二public const STHREE:int = 5; /眠三public const TWO:int = 8; /活二public const SFOUR:int = 12; /冲四public const FTHREE:int = 15; /假活三public const THREE:in

17、t = 40; /活三public const FOUR:int = 90; /活四public const FIVE:int = 200; /五连private var aPlayer:Array = ;private var aOpponent:Array = ;private var dir:Array = -1,-1,0,-1,1,-1,1,0,1,1,0,1,-1,1,-1,0;public function GobangDoc() mcGameState.visible = false;otherSide = WHITE + BLACK - mySide;for (var i:ui

18、nt=0; igridnum; i+) aGridStatei = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;mcChessboard.addEventListener(MouseEvent.MOUSE_DOWN,AddMyChessman);btnStart.addEventListener(MouseEvent.CLICK,btnStart_Handler);btnReplay.addEventListener(MouseEvent.CLICK,btnReplay_Handler);mcSelectChessman.addEventListener(MouseEvent.

19、MOUSE_DOWN,selectChessman);private function init():voidbtnStart.visible = false;for(var i:int=0;iaChessmen.length;i+)mcChessboard.removeChild(aChessmeni);for (var j:uint=0; jgridnum; j+) aGridStatej = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;aChessmen = ;canPlay = true;public function AddMyChessman(e:MouseEven

20、t):void if(!canPlay | crtSide != mySide | e.target.name != mcChessboard) return;if (mySide = crtSide) var crtx:uint = Math.floor(e.localX/gridsize);var crty:uint = Math.floor(e.localY/gridsize);if (aGridStatecrtycrtx)return;/创建棋子var chessman:Chessman;if (mySide = BLACK) chessman = new BlackChessman(

21、); else chessman = new WhiteChessman();chessman.bPlayer = true;aGridStatecrtycrtx = mySide;chessman.x = (crtx + .5) * gridsize;chessman.y = (crty + .5) * gridsize;aChessmen.push(chessman);mcChessboard.addChild(chessman);checkWinner(crtx,crty,crtSide);/对方走crtSide = WHITE + BLACK - mySide;/计算机走var opo

22、s:Array = CalculateState(crtSide);var cx:int = opos0;var cy:int = opos1;AddChessman(cx,cy);checkWinner(cx,cy,crtSide);crtSide = mySide;/计算机添加棋子public function AddChessman(toX:int,toY:int):void if(!canPlay)return;var autox:int = toX;var autoy:int = toY;var chessman:Chessman;if (mySide = BLACK) chessm

23、an = new WhiteChessman(); else chessman = new BlackChessman();chessman.x = (autox + .5)*gridsize;chessman.y = (autoy + .5)*gridsize;aGridStateautoyautox = (BLACK + WHITE) - mySide;aChessmen.push(chessman);mcChessboard.addChild(chessman);/评估棋盘上每一格的分值,返回得分最高的棋格坐标public function CalculateState(side):Ar

24、rayvar i:int,j:int,k:int;var otherside:int = WHITE + BLACK - side;for(i = 0;igridnum;i+)for(j = 0;jgridnum;j+)if(aGridStateij != NOTHING)aOpponenti * gridnum + j = val:-1,x:j,y:i;aPlayeri * gridnum + j = val:-1,x:j,y:i;elsevar v1 = getScore(aGridState,j,i,side);aOpponenti * gridnum + j = val:v1,x:j,

25、y:i;var v2 = getScore(aGridState,j,i,otherside);aPlayeri * gridnum + j = val:v2,x:j,y:i;var maxO:Object = sortArray(aOpponent);var maxP:Object = sortArray(aPlayer);var apos:Array = 0,0;if(maxO.val -1 | str2.indexOf(str)-1 | str3.indexOf(str)-1 | str4.indexOf(str)-1)winner = side;if(winner)doWin(winn

26、er);/取胜后触发的事件private function doWin(side:int):voidmcGameState.visible = true;canPlay = false;mcChessboard.alpha = .5; if(side = mySide)mcGameState.gotoAndStop(win);elsemcGameState.gotoAndStop(lose);private function sortArray(arr):Objectvar arrLen:int = arr.length;var ar:Array = ;for(var j=0;j0 ? xp

27、- 5:0;xe = xp + 5= gridnum?gridnum:xp + 5;for(var i:int=xs;i0 ? yp - 5:0;ye = yp + 5= gridnum?gridnum:yp + 5;for(var i:int=ys;i xp ? 0 : xp - yp;ys = xp yp ? 0 : yp - xp;xe = gridnum - ys;ye = gridnum - xs;var pos:int;for(var i:int=0;i(xe-xs0?pos-4:0,pos+5arr.length?arr.length:pos+5);return arr;priv

28、ate function getYXLine(aposition:Array,xp:int,yp:int,side:int):Arrayvar arr:Array = ;var xs:int,ys:int,xe:int,ye:int;var num:int = gridnum;var half:int = Math.ceil(gridnum/2);xs = xp + yp = num?num-1:(xp + yp);ye = xe;var pos:int;for(var i:int=0;i=num?2*num-xp-yp-1:xp+yp+1);i+)if(ye - i = yp & xs +

29、i = xp)arr.push(side);pos = i;elsearr.push(apositionye - i xs + i);arr = arr.slice(pos-40?pos-4:0,pos+5arr.length?arr.length:pos+5);return arr;private function AnalysisLine(aline:Array,side:int):intvar otherside:int = WHITE + BLACK - side;var five:String = (side * 11111).toString();var four:String =

30、 0 + (side * 1111).toString() + 0;var three:String = 0 + (side * 111).toString() + 0;var two:String = 0 + (side * 11).toString() + 0;var jtwo:String = 0 + (side * 101).toString() + 0;var lfour:String = otherside.toString() + (side * 1111).toString() + 0;var rfour:String = 0 + (side * 1111).toString(

31、) + otherside.toString();var l_four:String = (side * 10111).toString();var r_four:String = (side * 11101).toString();var lthree:String = otherside.toString() + (side * 111).toString() + 0;var rthree:String = 0 + (side * 111).toString() + otherside.toString();var ltwo:String = otherside.toString() +

32、(side * 11).toString() + 0;var rtwo:String = 0 + (side * 11).toString() + otherside.toString();var rfthree:String = (side * 111).toString() + 0 + otherside.toString();var lfthree:String = otherside.toString() + 0 + (side * 111).toString();var str:String = aline.join();var res:int;if(str.indexOf(five

33、)=0)res = FIVE;if(side = otherSide)res *=2;else if(str.indexOf(four)=0)res = FOUR;else if(str.indexOf(three)=0)res = side!=mySide?THREE+4:THREE;else if(str.indexOf(two)=0 | str.indexOf(jtwo)=0 )res = TWO;else if(str.indexOf(lfour)=0 | str.indexOf(rfour)=0 | str.indexOf(l_four)=0 | str.indexOf(r_four

34、)=0)res = SFOUR;else if(str.indexOf(lthree)=0 | str.indexOf(rthree)=0)res = STHREE;else if(str.indexOf(ltwo)=0 | str.indexOf(rtwo)=0)res = STWO;else if(str.indexOf(lfthree)=0 | str.indexOf(rfthree)=0)res = FTHREE;else res = 0;return res;private function btnStart_Handler(e:MouseEvent):voidcanPlay = t

35、rue;if(mySide = WHITE)AddChessman(Math.floor(gridnum/2),Math.floor(gridnum/2);btnStart.visible = false;private function btnReplay_Handler(e:MouseEvent):voidmcGameState.visible = false;mcChessboard.alpha = 1;init();if(mySide = WHITE)AddChessman(Math.floor(gridnum/2),Math.floor(gridnum/2);private func

36、tion selectChessman(e:MouseEvent):voidif(canPlay)mcSelectChessman.buttonMode = false;return;elsemcSelectChessman.buttonMode = true;mySide = otherSide;otherSide = WHITE + BLACK - mySide;if(mySide = WHITE)mcSelectChessman.gotoAndStop(white);elsemcSelectChessman.gotoAndStop(black);crtSide = mySide;最后要将

37、文档类与Gobang.fla文件相关联,按下【Ctrl+Enter】组合键进行测试。四、最终合成与输出4.1输出文件单击【文件】、【另保存】命令,保存为.fla的文件。按【Ctrl+Enter】组合键测试影片。 4.2游戏的缺点与改进: 本代码实现的五子棋算法只能评估当前棋局中可能出现的最有状态,没有考虑今后几步的棋形,因此是一种只顾眼前利益的算法。对今后可能出现的棋形进行评估需要用到更为复杂的计算方法,例如极大值极小值算法、alpha-beta剪枝、渴望搜索(Aspiration Search)、极小窗口搜索(Minimal Window Search)、置换表(Transposition

38、Table)等五、课程设计总结通过此次课程设计,使我更加扎实的掌握了有关FLASH方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到

39、要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!