




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
信息科学与工程学院课程设计任务书 题目: 二维动画设计-五子棋游戏制作 学 号: 姓 名: 专 业: 课 程: 二维动画设计 指导教师: 职称: 完成时间: 2012年5月-2012年6月课程设计任务书及成绩评定课程设计的任务和具体要求二维动画设计课程设计为该门课程的综合设计环节,能够有效锻炼学生的自主学习能力和综合设计能力,培养学生的创新精神和动手实践能力。 1、内容要求: 1)flash动画作品内容完整丰实,思想健康、积极向上,表现一个主题。 2)动画作品有适当的控制交互功能。 2、技术要求: 1)动画画面设计合理,画面转换恰当。2)体现flash编写小游戏的优势。3) 掌握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制作课程设计 撰写课程设计实验报告参考文献、资料索引序号文献、资料名称编著者出版单位1 flash 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、课程设计的总结 16一、概述1、 课程设计目的二维动画设计课程设计为该门课程的综合设计环节,能够有效锻炼自主学习能力和综合设计能力,培养创新精神和动手实践能力。通过此次课程设计应: (1). 熟练掌握flash制作所需的基本知识。 (2).熟练掌握flash动画的整个制作过程。(3). 进一步熟悉as 3.0面向对象编程的方法及技巧。(4). 充分利用flash实现游戏编程的优势完成五子棋游戏的制作。(5). 真正做到学以致用,将所学应用于实践。(6). 将以往所学的知识与本课程综合起来应用于实际设计中,培养在实际工作中分析问题和解决问题的能力。2、课程设计要求 通过本次设计,应达到下列基本要求:(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).掌握各种动画作品的测试、优化、输出及发布。3、actionscript 3.0actionscript 3.0是针对 adobe flash player 运行时环境的编程语言,它在 flash 内容和应用程序中实现了交互性、数据处理以及其它许多功能。各种交互功能的实现都要依赖于as 3.0。运用它编写具有交互性的小游戏是很有优势的。4、五子棋术语五连:五个同一颜色的棋子在一条线上,首先形成这一局面的的一方获得胜利。四四:一子落下同时形成两个“四”的棋形。四三:同时具备两个先手,其中一个为“活三”,另一个为“四”。三三:一子落下形成了两个活三的棋形。活四:四个同一颜色的棋子在一条直线上,并且两边没有阻挡。嵌五:也叫跳冲四。活三(包括连三和跳三):连三是紧紧相连的同色的三子;跳三是中间间隔一子的活三。眠三:一端有对方棋子阻拦的三叫眠三。假活三:在活三两端相隔一点的位置上有对方的棋子(或边线)的阻拦。活二:包括连二和跳二。眠二:一端有对方棋子的阻拦“二”。假活二:在活二两端相隔一点的位置上有对方的棋子(或边线)的阻拦。长连:相同颜色的连续六子或六子以上。二、总体设计方案2.1算法分析: 假定我们遵循最基本的五子棋规则,不考虑长连和黑子禁手的问题。要让电脑能够根据盘面状态决定在哪里下子,就需要考虑盘面上可能落子的重要程度,并选择其中最重要的点,为此需要通过给这些点打分来最为衡量的标准。 对重要程度的评估,主要依据就是在这一点上落子的可能形成的局面,如果能够形成五子连珠,那就是必胜的点,得分最高;同样四四、四三和活四都是可以制胜的棋形,得分也应很高;而三三、眠三等棋形分值相对较低一些。得分最高的点就是落子的点。 对博弈中的一方而言,不仅要评价对自己最有利的的落子点,还要考察对自己最有威胁的落子点,也就是对对手最有利的落子点,如果对手下一步可以走出五子连珠的棋形而自己只有活四,那么显然应该首先要消除对方的威胁。因此落子前应综合考虑自己和对方最有利的棋局,然后决定下一步棋该怎么走。 为方便对棋局进行评估,我们在这里规定各个棋形的得分: 眠二:2分 假活二:4分 眠三:5分 活二:8分 冲四、眠四:12分 假活三:15分 活三:40分 活四:90分 五连:200分,当轮到自己落子时加倍。2.2界面设计 棋子类型:黑子和白子; 【开始游戏】按钮实例名为btnstart,类型simplebutton; 【再玩一遍】按钮实例名为btnreplay,类型simplebutton;棋子选择按钮实例名为mcselectchessman,类型movieclip;游戏结局提示信息实例名为mcgamestate,类型movieclip;2.3代码编写游戏程序包含两个类文件,都放在classes包中。clessman用来生成棋子,gobangdoc类是文档类,用来管理游戏的所有交互功能。在flash软件中新建两个拓展名为.as的文件,并在其中编写两个类的代码。三、详细设计方案3.1游戏界面的设计: 游戏界面设计很简单,主要有棋盘、黑白棋子、两个按钮(开始游戏按钮和再玩一遍按钮、),棋子选择按钮和提示消息等组成。游戏界面分析:我们把【开始游戏】按钮和【再玩一遍】按钮放在同一位置。【开始游戏】按钮实例名为btnstart、【再玩一遍】按钮实例名为btnreplay。这两个类型的按钮都是simplebutton类型。开始时btnstart遮住btnreplay,当单击btnstart进入游戏后,将btnstart的visible属性设置为false,就可以显示出btnreplay。 棋子选择按钮实例名为mcselectchessman,类型为movieclip类型,棋子选择按钮在界面下方,用来让玩家选择自己使用的棋子类型,在时间轴上包含两个关键帧,名称分别为“white”和“black”,在“white”帧上有一个stop()动作。当玩家选择改变棋子时,就在这两个关键帧之间跳转,以显示白色或黑色的棋子。 游戏结局提示信息实例名为mcgamestate,也是一个movieclip类型的元件,它的时间轴上有两个名为“win”和“lose”的关键帧。分别显示胜利和失败的信息。游戏开始时将它的visible属性设为false,一局结束之后在设置为true。3.2代码分析 游戏程序包含两个类文件,都放在classes包中。clessman用来生成棋子,白子和黑子都是由这个类派生,方法是改变他们的连接属性。将基类指定为chessman,而类名分别为“whitechessman”和“blackchessman”. 。 我们不必为whitechessman类和blackchessman类提供专门的类定义,它们除了颜色以外其他的属性都相同。 单击【确定】按钮,会弹出“actionscript类警告”对话框,提示swf文件中会自动生成相应的类定义,继续单击【确定】按钮即可。chessman类中有一个属性bplayer,用来标记当前这种颜色的棋子是不是玩家使用的棋子。此外还有一个方法是twinkle(),作用是当棋子落在棋盘上后闪烁几次,便于玩家看到。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(event.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;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 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: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;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_handler);mcselectchessman.addeventlistener(mouseevent.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:mouseevent):void if(!canplay | crtside != myside | != 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(); 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 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;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);mcchessboard.addchild(chessman);/评估棋盘上每一格的分值,返回得分最高的棋格坐标public function calculatestate(side):arrayvar 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,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):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 - 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;private 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 + 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 = 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() + 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() + (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)=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)=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 = true;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 function selectchessman(e:mouseevent):voidif(canplay)mcselectchessman.buttonmode = false;return;elsemcselectchessman.buttonmode = true;myside = ot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汉字笔画名称表课件
- 应急疏散演练讲话稿14篇
- 新疆喀什地区英吉沙县2024-2025学年高二下学期7月期末考试历史试卷(含答案)
- 2024-2025学年度河南省新密市高二下学期期中考试历史试题(含答案)
- 电商平台新趋势与竞争局势
- 汉字十课件教学课件
- “云·仓·配”带你走进智慧新世界-智慧仓储与配送管理知到智慧树见面课答案
- 天然气市场供应与需求分析
- 汉字书法课件模板楷书山
- 2025机械设备转让合同模板
- 2025年教师招聘小学语文真题及答案
- 2025年(完整版)十八项核心制度培训考核试题(含答案)
- 2025年低压电工理论考试1000题(附答案)
- 2025年益阳市融资担保有限责任公司招聘考试笔试试卷【附答案】
- 【湖南】2025年高考湖南卷化学高考真题+答案
- KET教学课件新版
- (完整版)文献调研报告模板
- 《透视灵魂看人生》-曾仕强
- 浅谈新课标下的高中英语教学
- 金沙县网约车从业资格考试模拟试卷
- T∕ACSC 01-2022 辅助生殖医学中心建设标准(高清最新版)
评论
0/150
提交评论