1、FLASH课程设计信息科学与工程学院课程设计任务书 题目: 二维动画设计-五子棋游戏制作 学 号: 姓 名: 专 业: 课 程: 二维动画设计 指导教师: 职称: 完成时间: 2012年5月-2012年6月课程设计任务书及成绩评定课程设计的任务和具体要求二维动画设计课程设计为该门课程的综合设计环节,能够有效锻炼学生的自主学习能力和综合设计能力,培养学生的创新精神和动手实践能力。 1、内容要求: 1)Flash动画作品内容完整丰实,思想健康、积极向上,表现一个主题。 2)动画作品有适当的控制交互功能。 2、技术要求: 1)动画画面设计合理,画面转换恰当。2)体现Flash编写小游戏的优势。3)
2、掌握ActionScript 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制作课程设计 撰写课程设计实验报告参考文献、资料索引序号文献、资料名称编著者出版
3、单位1 Flash cs3动画制作案例教程 俞欣 北京大学出版社 2 动画设计原理 于瑾 西安科技出版社3 Flash精彩动画设计 柏松 航空工业出版社4 Flash动画风暴 伍福军 北京电子出版社5 AS3.0游戏制作案例教程 张辉 清华大学出版社目 录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游戏缺点与改进
4、165、课程设计的总结 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分 冲四、
9、眠四:12分 假活三: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。 棋子选择按钮
11、实例名为mcSelectChessman,类型为MovieClip类型,棋子选择按钮在界面下方,用来让玩家选择自己使用的棋子类型,在时间轴上包含两个关键帧,名称分别为“white”和“black”,在“white”帧上有一个stop()动作。当玩家选择改变棋子时,就在这两个关键帧之间跳转,以显示白色或黑色的棋子。 游戏结局提示信息实例名为mcGameState,也是一个MovieClip类型的元件,它的时间轴上有两个名为“win”和“lose”的关键帧。分别显示胜利和失败的信息。游戏开始时将它的visible属性设为false,一局结束之后在设置为true。3.2代码分析 游戏程序包含两个类文
12、件,都放在Classes包中。Clessman用来生成棋子,白子和黑子都是由这个类派生,方法是改变他们的连接属性。将基类指定为Chessman,而类名分别为“WhiteChessman”和“BlackChessman”. 。 我们不必为WhiteChessman类和BlackChessman类提供专门的类定义,它们除了颜色以外其他的属性都相同。 单击【确定】按钮,会弹出“ActionScript类警告”对话框,提示swf文件中会自动生成相应的类定义,继续单击【确定】按钮即可。Chessman类中有一个属性bPlayer,用来标记当前这种颜色的棋子是不是玩家使用的棋子。此外还有一个方法是twin
13、kle(),作用是当棋子落在棋盘上后闪烁几次,便于玩家看到。GobangDoc类是文档类,用来管理游戏的所有交互功能。3.3两个类源代码 (1)Chessman类的代码如下: package Classes import flash.display.MovieClip; import flash.events.*; public class Chessman extends MovieClip private var inc:uint = 0; public var bPlayer:Boolean = false; public function Chessman() this.addEven
14、tListener(Event.ENTER_FRAME,twinkle); public function twinkle(e:Event):void if(!bPlayer) if(inc15) this.alpha = (inc%5)/5) + .2; inc +; else this.removeEventListener(Event.ENTER_FRAME,twinkle); (2)GobangDoc类的代码如下:package Classes import flash.display.*; import flash.events.*; import flash.geom.*; imp
15、ort flash.text.TextField; 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; pri
16、vate var otherSide:uint; private 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 F
17、THREE:int = 15; /假活三 public const THREE:int = 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;
18、 otherSide = WHITE + BLACK - mySide; for (var i:uint=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_H
19、andler); mcSelectChessman.addEventListener(MouseEvent.MOUSE_DOWN,selectChessman); private function init():void btnStart.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
20、 = ; canPlay = true; public function AddMyChessman(e:MouseEvent):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
21、 chessman:Chessman; if (mySide = BLACK) chessman = new BlackChessman(); 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); chec
22、kWinner(crtx,crty,crtSide); /对方走 crtSide = WHITE + BLACK - mySide; /计算机走 var opos: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;
23、 var autox:int = toX; var autoy:int = toY; var chessman:Chessman; if (mySide = BLACK) chessman = new WhiteChessman(); else chessman = new BlackChessman(); chessman.x = (autox + .5)*gridsize; chessman.y = (autoy + .5)*gridsize; aGridStateautoyautox = (BLACK + WHITE) - mySide; aChessmen.push(chessman)
24、; mcChessboard.addChild(chessman); /评估棋盘上每一格的分值,返回得分最高的棋格坐标 public function CalculateState(side):Array var 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 * grid
25、num + j = val:-1,x:j,y:i; else var v1 = getScore(aGridState,j,i,side); aOpponenti * gridnum + j = val:v1,x:j,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(winner); /取胜后触发的事件 private function doWin(side:int):void mcGameState.visible = true; canPlay = false; mcChessboard.alpha = .5; if(side = mySide) mcGameState.gotoAndStop(win);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1