第4章益智类的游戏4.1井字过三关游戏(1)游戏说明这是一个益智型的小游戏,通过一个“井”字形的棋子摆设,用鼠标单击“井”字的空位,谁先排成一字线就算赢,它可以和传统的五子棋游戏相媲美。本游戏编程难度并不是很大,读者可以自行打开源代码进行参考。游戏的场景如图4-1所示。图4-1特效集合的展示设计技巧(1)游戏过程中为了响应鼠标单击,要把“井”字的9个空位全部放置上影片剪辑,并分别命名。(2)当鼠标单击空位的时候告知相应的对象,实现智能的记忆和计算,主要应用到了如下的命令:·数组set()最简单的表达式应用,实现事件的判断,并赋予值。·Telltarget告知命令的应用。实现当鼠标触发相应的区域时,相应的影片剪辑执行动作。制作步骤1.主要游戏元件的制作(1)启动FlashMX2004,单击“属性”面板中的“大小”按钮,设置影片宽为550px,高为400px,背景颜色为白色,播放速度帧频为12fps,如图4-2所示。图4-2设置影片属性(2)把“图层1”命名为“背景”,执行菜单栏“插入”|“新建元件”命令,新建一个图形元件,命名为“背景”,单击“确定”按钮,进入编辑区。单击工具箱中的“线条工具”按钮,在“属性”面板中设置大小为5.75px,格式为虚线,自制一个背景,如一个大的“井”字,如图4-3所示。回到场景中,在第16帧处按F5键插入相同帧。图4-3绘制一个背景(3)执行菜单栏“插入”|“新建元件”命令,新增两个图形元件,它们是游戏双方棋子的表示符号,分别命名为“圆圈”和“打叉”,通过工具箱中的“椭圆工具”按钮和“线条工具”按钮来完成,其大小及格式与步骤(2)中设置的相同,其绘制的效果如图4-4所示。图4-4绘制双方的表示符号(4)按Ctrl+F8快捷键,新增一个影片剪辑,名称为“MC”这是制作产生“圆圈”或“打叉”的影片剪辑,在第2帧处按F6键插入关键帧,把“圆圈”元件从“库”面板中拖入编辑区。在第3帧插入关键帧,把第3帧中的“圆圈”元件删除后,将“打叉”元件从“库”面板中拖进编辑区,如图4-5所示。(5)单击返回到主场景,新增一图层并命名为“组件控制”,把MC影片剪辑分别放进“井”的9个位置,由于MC影片剪辑的第1帧没有图形,不会显示有图像,所以将场景1内的9个MC影片剪辑的实体命名为“ox1”,“ox2”,“ox3”,...,“ox9”,排列的顺序如图4-6所示。图4-5制作MC影片剪辑图4-6MC的排列示意图(6)执行菜单栏“插入”|“新建元件”命令,新增一个按钮元件用来实现鼠标与场景的交互作用,名称为“button”,这个按钮没有图像,所以我们只在“点击”帧画上一个适当大小的矩形(104px×82px),如图4-7所示。图4-7制作“点击”区(7)双击“库”面板中的MC影片剪辑,进入MC编辑区,把button按钮拉到第1帧处,返回场景1中,这时的主场景如图4-8所示。图4-8排列的MC场景4.1井字过三关(2)2.智能命令的加入(1)接下来开始游戏的编程工作。首先进入MC影片剪辑的编辑页面,在时间轴上单击“插入图层”按钮新建一个图层,命名为stop层,在第1帧加入停止命令“stop();”。(2)单击MC编辑区内的button按钮,并在“动作按钮”面板中输入下面的语句:on(release){gotoAndStop(2);}//当我方按下鼠标后,显示第2帧的“圆圈”图形set(_root.+_name,1);//记录这格已经被画了“圆圈”,告诉计算机不可把棋子放在这一格,通过set();(设置的参数)可以来完成,因为在变量名称中部分使用了其他的变量_name(名),所以用表达式(_root.+_name,)来表示_root.winox1,_root.winox2,…而这段语句描述的结果则会变成:_root.ox1=1,_root.ox2=1,....,这是Flash中表现“数组”最简单的方式再用相同语法设定一阵式,用来记录我方下过哪些子:set(_root.win+_name,1);//如果_root.winox1=1、root.winox2=1、_root.winox3=1表示这3格都是圆圈,我们便胜利了,设定了一个[_root.win+_name],这个数组可以表现为如下9个变量:_root.winox1_root.winox2_root.winox3_root.winox4_root.winox5_root.winox6_root.winox7_root.winox8_root.winox9胜利的条件是,任何一种图形组合连成一线。3个变数要是1,3个1的和即等于3,所以判断方式是,哪一种组合总和等于3。把判断式放进condition中,用or连起来,因为只要其中一种成立便可以了,程序如下(即加入动作):if(Number(_root.winox1)+Number(_root.winox2)+Number(_root.winox3)==3orNumber(_root.winox4)+Number(_root.winox5)+Number(_root.winox6)==3orNumber(_root.winox7)+Number(_root.winox8)+Number(_root.winox9)==3orNumber(_root.winox1)+Number(_root.winox4)+Number(_root.winox7)==3orNumber(_root.winox2)+Number(_root.winox5)+Number(_root.winox8)==3orNumber(_root.winox3)+Number(_root.winox6)+Number(_root.winox9)==3orNumber(_root.winox1)+Number(_root.winox5)+Number(_root.winox9)==3orNumber(_root.winox3)+Number(_root.winox5)+Number(_root.winox7)==3){//当满足胜利条件便进入一个名为“win”的帧,因为该帧位于场景1的时间轴中,所以要先加入tellTarget命令,target设为_root,即主编辑区,再加入如下跳播命令,帧标签设置为wintellTarget(_root){gotoAndStop(win);}最后我们还要制作计算机不进攻也不防守时放叉子的位置,程序代码为:if(_root.checkeq0){//先判断计算机是否放过棋子,可以从_root.check是否为0得知for(_root.a=1;_root.a10;_root.a++){if(eval(_root.ox+_root.a)ne1){//_root.ox+_root.a可以是_root.ox1~_root.ox9之间的变量,通过eval()得到该变量的值;经for的定义,配合_root.a由1~9的数值,只要找到哪一格是空的,就下在那一格tellTarget(_root.ox+_root.a){set(_root.ox+_root.a,1);//设定该格放过棋子set(_root.loseox+_root.a,1);gotoAndStop(3);break;//对方已在其选定的地方放过棋子,再用break跳出for的循环}}}}所有计算机的动作,都要在我们下完子但还没胜利的时候发生。整个button按钮的程序代码如下:on(release){gotoAndStop(2);set(_root.+_name,1);set(_root.win+_name,1);if(Number(_root.winox1)+Number(_root.winox2)+Number(_root.winox3)==3orNumber(_root.winox4)+Number(_root.winox5)+Number(_root.winox6)==3orNumber(_root.winox7)+Number(_root.winox8)+Number(_root.winox9)==3orNumber(_root.winox1)+Number(_root.winox4)+Number(_root.winox7)==3orNumber(_root.winox2)+Number(_root.winox5)+Number(_root.winox8)==3orNumber(_root.winox3)+Number(_root.winox6)+Number(_root.winox9)==3orNumber(_root.winox1)+Number(_root.winox5)+Number(_root.winox9)==3orNumber(_root.winox3)+Number(_root.winox5)+Number(_root.winox7)==3){tellTarget(_root){gotoAndStop(win);//}}else{_root.check=0;call(attack);call(defence);if(_root.checkeq0){for(_root.a=1;_root.a10;_root.a++){if(eval(_root.ox+_root.a)ne1){tellTarget(_root.ox+_root.a){set(_root.ox+_root.a,1);set(_root.loseox+_root.a,1);gotoAndStop(3);break;}}}}}}(3)接下来我们加入AI(人工智能)程序设计。先设好当我们出现失误,让计算机的棋子放在正确位置。如下列原始程序的代码及说明:if(_root.loseox1eq1and_root.loseox2eq1and_root.ox3ne1and_root.checkne1){_root.check=1;tellTarget(_root.ox3){gotoAndStop(3);}tellTarget(_root){gotoAndStop(lose);}}//当计算机未下棋子,而ox1和ox2有计算机的棋子,且ox3是空的,就把计算机设成在ox3下棋子,ox3停止第3帧,即“打叉”图形,_root.check会设成1,再播放我们输掉的画面同理,输入程序的其余代码:if(_root.loseox2eq1and_root.loseox3eq1and_root.ox1ne1and_root.checkne1){_root.check=1;tellTarget(_root.ox1){gotoAndStop(3);}tellTarget(_root){gotoAndStop(lose);}}if(_root.loseox1eq1and_root.loseox3eq1and_root.ox2ne1and_root.checkne1){_root.check=1;tellTarget(_root.ox2){gotoAndStop(3);}tellTarget(_root){gotoAndStop(lose);}}if(_root.loseox4eq1and_root.loseox5eq1and_root.ox6ne1and_root.checkne1){_root.check=1;tellTarget(_root.ox6){gotoAndStop(3);}tellTarget(_root){gotoAndStop(lose);}}if(_root.loseox4eq1and_root.loseox6eq1and_root.ox5ne1and_root.checkne1){_root.check=1;tellTarget(_root.ox5){gotoAndStop(3);}tellTarget(_root){gotoAndStop(lose);}}if(_root.loseox6e