九子棋游戏设计说明书.doc_第1页
九子棋游戏设计说明书.doc_第2页
九子棋游戏设计说明书.doc_第3页
九子棋游戏设计说明书.doc_第4页
九子棋游戏设计说明书.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

九子棋游戏设计说明书1、 实训目的1、 制作出九子棋游戏;2、 学会九子棋开发方法;3、 学会九子棋判断程序设计;4、 学会九子棋算法设计;2、 实训要求1、 完成的游戏必须按照九子棋游戏规则执行;2、 界面要美观;3、 实训准备1、 准备需要的素材;2、 安装Flash CS5.5软件;3、 仔细分析游戏的地图和流程图;四、实训内容(步骤及过程)1、棋子角色设计(1)棋子角色有三个界面(置空、白棋、黑棋)、两个方法以及若干属性,置空、黑棋和白棋设计如下:Color:棋子的显示界面,0表示置空,1表示白棋,2表示黑棋;i:棋子的行索引;J:棋子的列索引;Show(num):显示棋子的界面,0表示置空,1表示白棋,2表示黑棋;Shine(num):闪耀棋子,以便给玩家一些提示,num表示闪耀的次数;(2) 新建影片剪辑元件,命名为“闪耀”,在第2帧插入空白关键帧,使用椭圆工具绘制一个小圆,填充浅灰色,设置帧标签名为shine,在第3帧插入空白关键帧,复制第2帧的内容,填充更浅的颜色,在第4帧插入关键帧,输入以下代码:count+;if (count=totalCount) gotoAndStop(1); else gotoAndPlay(shine);回到第1帧,输入以下代码:stop();var count:int=0;var totalCount:int=0;function shine(times:int) count=0;totalCount=times;gotoAndPlay(shine);(3) 新建一影片剪辑元件,命名为“棋子”,在1、2、3帧内分别导入置空、白棋和黑棋,并分别设置帧标签名为:empty、white和black,然后再新建图层2,在第一帧内导入影片剪辑“闪耀”,实例名称设置为shine,并延长有效帧到第3帧;2、 比分显示剪辑的设计(1) 新建影片剪辑元件,命名为countnum,将准备好的数字图片1、2、3.9、0分别导入第1-10帧,注意这些图片数字位置应该是重合的,新建图层,给每一帧添加一条stop()语句;(2) 新建影片剪辑元件,命名为counter,将上面的countnum剪辑拖入其中,并在复制一份,分别用来表示个位数和十位数,设置他们的实例名称为num1和num2,新建图层,重命名为action,输入以下代码:stop();var count=0;num1.gotoAndStop(10);num2.gotoAndStop(10);function showNum(num:int) var a = num%10;if ( a=0) num1.gotoAndStop(10); else num1.gotoAndStop(a);var b=int(num/10);a=b%10;if ( a=0) num2.gotoAndStop(10); else num2.gotoAndStop(a);3、 音效准备导入四个特效声音文件,分别作为走棋、吃棋、胜利以及失败时的听觉效果。其中,将走棋和吃棋的声音特效连接为PlaceSound和EatSound输出,其方法为:在库中选中某个声音,右击选择“链接”选项,从弹出的对话框中选中“为ActionScript导出”复选框,并设置其链接名;4、 界面设计(1) 回到主场景,把图层一重命名为“背景”,在第一帧内导入在PS中弄好的背景图片;(2) 新建按钮元件,道速按钮素材,用文本工具输入“开始”,在鼠标经过帧和按下帧插入关键帧,然后把鼠标经过帧向上移动5个单位,吧制作好的按钮元件拖入舞台中,设置实例名称为bt_start;最终效果图如下:(3) 在背景层第2帧插入空白关键帧,使用绘图工具绘制出矩形框,填充青色;(4) 新建一图层,命名为“棋盘”,在第2帧中插入空白关键帧,导入在PS中准备好的棋盘,棋盘如下图所示;(5) 新建一图层,命名为“棋子”,在第2 帧内插入空白关键帧,在棋盘的每个点上摆放影片剪辑“棋子”,实例名称均设为chess63,如下图所示:(6) 新建图层,命名为“成绩”,在第2帧中插入空白关键帧,把白棋和黑棋分别放在界面上方的两边,然后把影片剪辑counter分别放在两个棋子旁边,白棋旁边的实例名称设置为vCounter,黑棋旁边的设置为fCounter;再使用静态文本工具在白棋后面输入“玩家”,在黑棋前面输入“电脑”;(7) 新建一按钮元件,命名为“提示”,在第一帧内放入准备好的素材图片,并延长至第3帧,如下图所示:新建图层,在第2帧插入空白关键帧,使用文本工具和绘图工具制作出如下形状:在第3帧插入关键帧;最后再把制作好的按钮元件拖入到成绩图层第2帧,并摆放在黑棋和白棋的中间,最终效果图如下:(8) 把背景、棋盘、棋子、成绩四个层的有效帧延长至第73帧;(9) 使用文本工具和绘图工具制作出以下两个形状: (10) 新建影片剪辑元件,命名为“胜利”,在第1、4、6、7帧内拖入上图的胜利字样,并设置第1帧和第6帧的透明度为0,在第1帧和第6帧创建传统补间;在第7帧输入stop()语句;(11) 同上面的方面,制作出“失败”影片剪辑;5、游戏程序设计(1)新建一图层,命名为action,在第1帧内输入以下代码:stop();bt_start.addEventListener(MouseEvent.MOUSE_DOWN,startGame);function startGame(evt:MouseEvent) gotoAndPlay(start);(2)把action图层第2帧设置帧标签,名为start,并输入以下代码:/设置游戏的原始状态var failureCount=0;/失败次数var victoryCount=0;/胜利次数var totalCount=0;/游戏总次数var whiteChess,blackChess;/手上的白棋和黑棋的数量var from:Point,to:Point;/移动棋子时的来处和去处var turn:int=0;/轮到谁先走,0表示玩家先走,1表示电脑先走var frozenWhite:Point,frozenBlack:Point;/白棋和黑子被冻结的位置(控制不能连续移动)var chesses:Array;/地图索引数组chesses=getChess();function getChess() /建立地图索引数组var chessArr:Array=new Array();for (var i=0; i7; i+) var temp:Array=new Array();for (var j=0; j7; j+) var mc:MovieClip;mc=MovieClip(getChildByName(chess+i+j);if (mc!=null) tempj=mc;mc.i=i;/位置的行索引值mc.j=j;/位置的列索引值chessArr.push(temp);return chessArr;(3)把第3帧设置帧标签,名为restart,并输入以下代码:init();/游戏初始化function init() /初始化函数/置空所有位置for (var i=0; i7; i+) for (var j=0; j0)/棋子还没有用完的初始化方法/激活所有空位,这些空位的鼠标释放操作使用putChess函数处理actionChess(0,putChess);else/棋子用完以后的走法if (haveLoad()=false)/已经无路可走failureCount+;totalCount+;gotoAndPlay(failure);/激活所有白棋,这些白棋的鼠标释放操作使用pickChess函数处理actionChess(1,pickChess);/*重要函数,用来激活一些位置,color表示位置上的棋子状态,doSomething表示响应事件的函数,只有满足条件的位置被激活,这保证了游戏规则的实现*/function actionChess(color:int,doSomething:Function,point:Point=null)if (point!=null)/定点激活if (chessespoint.xpoint.y.color = color)chessespoint.xpoint.y.addEventListener(MouseEvent.MOUSE_UP,doSomething);return;/全盘激活;for (var i=0; i7; i+)for (var j=0; j0)return true;for (var i=0; i7; i+)for (var j=0; j7; j+)if (chessesij != null & chessesij.color = 0)var point = new Point(i,j);if (frozenWhite.x = point.x & frozenWhite.y = point.y)continue;var arr:Array = getNeighbor(point);for (var k in arr)if (chessesarrk.xarrk.y.color = 0)return true;return false;/放置棋子操作function putChess(evt:MouseEvent)unactionChess();/取消所有的激活whiteChess-;/手上的棋子数减1evt.currentTarget.show(1);/显示白棋;to = new Point(evt.currentTarget.i,evt.currentTarget.j);var s=new PlaceSound();/播放放置棋子的声音s.play();play();/拿起一个棋子准备移动的操作function pickChess(evt:MouseEvent)/设置被移动的棋子的来源from = new Point(evt.currentTarget.i,evt.currentTarget.j);if (from.x = frozenWhite.x & from.y = frozenWhite.y)return;/被冻结的棋子,所以本次点击无效var arr = getNeighbor(from);/获取相邻的位置var haveLoad:Boolean = false;/判断被点击的棋子是否有出路for (var k in arr)if (chessesarrk.xarrk.y.color = 0)haveLoad = true;break;if (! haveLoad)return;/本棋子没有出路,本次点击无效unactionChess();/取消激活for (k in arr)/设置moveChess响应函数if (chessesarrk.xarrk.y.color = 0)/空位chessesarrk.xarrk.y.shine(3);/闪耀3下;chessesarrk.xarrk.y.addEventListener(MouseEvent.MOUSE_UP,moveChess);/移动棋子操作;function moveChess(evt:MouseEvent)unactionChess();/取消激活/设置移动棋子的目标位置to = new Point(evt.currentTarget.i,evt.currentTarget.j);frozenWhite.x = to.x;/更新被冻结的位置frozenWhite.y = to.y;/将源位置置空chessesfrom.xfrom.y.color = 0;chessesfrom.xfrom.y.show(0);/将目标位置显示白棋;chessesto.xto.y.color = 1;chessesto.xto.y.show(1);/播放声音;var s=new PlaceSound();s.play();play();/取消所有的事件侦听器function unactionChess()for (var i=0; i7; i+)for (var j=0; j3) j=5; else j=1; else j=3;return chessesij - step.color = color & chessesij.color = color & chessesij + step.color = color;/闪耀点所在行上的所有位置function shineLine(point:Point,times:int) var step:int,i:int,j:int;step=Math.abs(3-point.x);i=point.x;if (step=0) step=1;if (point.y3) j=5; else j=1; else j=3;chessesij - step.shine(times);chessesij.shine(times);chessesij + step.shine(times);(6)在第6帧内输入以下代码:if (checkRow(1,to) stop();shineRow(to,3);actionChess(2,killChess);/检查点所在的列是否满线function checkRow(color:int,point:Point):Boolean var step:int,i:int,j:int;step=Math.abs(3-point.y);j=point.y;if (step=0) step=1;if (point.x3) i=5; else i=1; else i=3;return chessesi - stepj.color = color & chessesij.color = color & chessesi + stepj.color = color;/闪耀点所在行列上的所有位置function shineRow(point:Point,times:int) var step:int,i:int,j:int;step=Math.abs(3-point.y);j=point.y;if (step=0) step=1;if (point.x3) i=5; else i=1; else i=3;chessesi - stepj.shine(times);chessesij.shine(times);chessesi + stepj.shine(times);(7)在第7帧内设置帧标签,名为delay,并输入以下代码:/检查是否已经胜利,如果胜利,进入胜利画面,否则继续播放,进入电脑走棋阶段if (chessCount(2)3) /白棋数少于3个victoryCount+;totalCount+;gotoAndPlay(victory);/统计所剩的棋子个数function chessCount(color:int):int var count:int=0;count+=(color=1?whiteChess:blackChess);for (var i=0; i7; i+) for (var j=0; j0) /手上还有黑棋没有走完getPoint();/智能判断,获取一个最佳的放置棋只得位置,存储于全局变量to中blackChess-;/白棋数减1/to位置显示白棋并闪耀3下chessesto.xto.y.shine(3);chessesto.xto.y.show(2);snd.play();/播放声音 else if (!getLine() /getLine智能判断,获取一条最佳的移动棋子的线路,存储于全局变量from和to中/getLine返回false表示黑棋全部被堵死,无路可走,黑棋失败,玩家胜利victoryCount+;totalCount+;gotoAndPlay(victory); else /置空源位置,显示目标位置为黑棋chessesfrom.xfrom.y.shine(3);chessesfrom.xfrom.y.show(0);chessesto.xto.y.shine(3);chessesto.xto.y.show(2);frozenBlack.x=to.x;frozenBlack.y=to.y;snd.play();/获取最佳的下棋位置function getPoint() var pointList:Array=getPointList();/最佳位置列表/随机选择一个var rand=int(Math.random()*pointList.length);to=pointListrand;/获取最佳的移动棋子的线路function getLine():Boolean var pointList:Array=getLineList();/最佳线路列表/随机选择一条if (pointList.length=0) return false;var rand=int(Math.random()*pointList.length/2);from=pointListrand*2;to=pointListrand*2+1;return true;/获取最佳位置列表function getPointList():Array var i,j;var point:Point;var empty:Array=new Array();/己方差此位置形成满线,是最佳的选择for (i=0; i7; i+) for (j=0; j0) return empty;/存在此解,返回结果/对方差此位置形成满线,应该堵住,是次优选择for (i=0; i7; i+) for (j=0; j0) return empty;/存在此解,返回结果/此位置的同行或者同列上已经有己方的棋子for (i=0; i7; i+) for (j=0; j0) return empty;/存在此解,返回结果/此位置的同行或者同列上已经有对方的棋子for (i=0; i7; i+) for (j=0; j0) return empty;/存在此解,返回结果/所有的空位for (i=0; i7; i+) for (j=0; j3) j=5; else j=1; else j=3;if (chessesij - step.color=color) count+;if (chessesij.color=color) count+;if (chessesij + step.color=color) count+;return count;/获取某点所在列上某色棋子的个数function getrcolnum(point:Point,color:int):int var count:int=0;var step:int,i:int,j:int;step=Math.abs(3-point.y);j=point.y;if (step=0) step=1;if (point.x3) i=5; else i=1; else i=3;if (chessesi- stepj.color=color) count+;if (chessesij.color=color) count+;if (chessesi+ stepj.color=color) count+;return count;/获取最佳移动棋子的路线function getLineList():Array var i,j,k;var thisPoint:Point;var arr:Array=new Array();var neighbor:Array;/移动后能给己方形成满线的for (i=0; i7; i+) for (j=0; j7; j+) if (chessesij!=null&chessesij.color=2) thisPoint=new Point(i,j);if (thisPoint.x=frozenBlack.x&thisPoint.y=frozenBlack.y) continue;/被冻结的位置,忽略判断neighbor=getNeighbor(thisPoint);for (k in neighbor) if (chessesneighbork.xneighbork.y.color!=0) continue;/此位置非空,不能移动到这个位置,忽略判断if (neighbork.x=i) if (getrcolnum(neighbork,2)=2) /可以形成行满线arr.push(new Point(i,j);arr.push(neighbork); else if (getlcolnum(neighbork,2)=2) /可以形成列满线arr.push(new Point(i,j);arr.push(neighbork);if (arr.length!=0) return arr;/存在此解,返回结果/移动后能够堵住对方形成满线for (i=0; i7; i+) for (j=0; j7; j+) if (chessesij!=null&chessesij.color=2) thisPoint=new Point(i,j);if (thisPoint.x=frozenBlack.x&thisPoint.y=frozenBlack.y) continue;neighbor=getNeighbor(thisPoint);for (k in neighbor) if (chessesneighbork.xneighbork.y.color!=0) continue;if (neighbork.x=i) if (getrcolnum(neighbork,1)=2) arr.push(new Point(i,j);arr.push(neighbork); else if (getlcolnum(neighbork,1)=2) arr.push(new Point(i,j);arr.push(neighbork);if (arr.length!=0) return arr;/存在此解,返回结果/所有可走的路线for (i=0; i7; i+) for (j=0; j7; j+) if (chessesij!=null&chessesij.color=2) thisPoint=new Point(i,j);if (thisPoint.x=frozenBlack.x&thisPoint.y=frozenBlack.y) continue;neighbor=getNeighbor(thisPoint);for (k in neighbor) if (chessesneighbork.xneighbork.y.color=0) arr.push(new Point(i,j);arr.push(neighbork);return arr;(12) 在第15帧设置帧标签,名为checkLine,并输入以下代码:/行检测阶段if (checkLine(2,to) /移动后的位置存在行满线shineLine(to,3);killOneChess(); else gotoAndPlay(checkRow);

温馨提示

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

评论

0/150

提交评论