|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
占用硬盘空间少,所以被广泛应用于游戏、网络视频、网站广告、交互设计等。
poluoluo中心提醒:比来参考一个JAVA的版本写了一个AS3版的连连看游戏算法,接待人人拍砖斧正,内里用到了as3ds类库,另有一些粉复杂的帮助类就不贴出来了,列位闭着眼睛也能设想出来,看次要的逻辑吧
比来参考一个JAVA的版本写了一个AS3版的连连看游戏算法,接待人人拍砖斧正,内里用到了as3ds类库,另有一些粉复杂的帮助类就不贴出来了,列位闭着眼睛也能设想出来,看次要的逻辑吧- packagemodel.components{importde.polygonal.ds.Array2;importde.polygonal.ds.DLinkedList;importde.polygonal.ds.Iterator;importFlash.geom.Point;importutils.*;/***连连看算法*@authorLuan(veryCSS-ok@yahoo.com.cn)*/publicclassMap{privatevar_level:uint;//游戏关卡对应的项目数目privatevar_map:Array2;//二维数组privatevar_array:Array;//帮助的一维数组privatevar_restBlock:uint=0;//残剩的项目数目privatevar_vector:DLinkedList;//保留切合前提线段的中央privatevar_countOfPerItem:uint;//每一个项目呈现的次数(偶数)privatevar_result:MatchResult;//暂存切合前提的了局publicfunctionMap(level:uint=16){//加2是为了加一圈0_map=newArray2(Setting.COLUMN+2,Setting.ROW+2);_array=newArray(_map.size-2*_map.width-2*_map.height+4);_vector=null;_result=newMatchResult();//挪用setterthis.level=level;}/**********************getter&setter**********************/publicfunctionsetlevel(value:uint):void{_level=value;//获得一个只管年夜的偶数值_countOfPerItem=NumberUtil.getFloorEven(_map.size/_level);_restBlock=_level*_countOfPerItem;_initMap();}publicfunctiongetcount():uint{return_restBlock<=0?0:_restBlock;}publicfunctiongetmap():Array2{return_map;}publicfunctiongetresult():MatchResult{return_result;}/**********************公有办法**********************/privatefunction_initMap():void{//一维数组初始化和乱序for(varn:uint=0;n<_array.length;n++)_array[n]=0;for(vari:uint=0;i<_level;i++){for(varj:uint=0;j<_countOfPerItem;j++){_array[i*_countOfPerItem+j]=i+1;}}_array=ArrayUtil.random(_array);ArrayUtil.drawWrappedMap(_array,_map);}/***横向反省*@parama*@paramb*@return*/privatefunction_hTest(a:Point,b:Point):MatchResult{if(a.x==b.x||a.y!=b.y)returnnull;varx_start:uint=Math.min(a.x,b.x);varx_end:uint=Math.max(a.x,b.x);for(varx:uint=x_start+1;x<x_end;x++)if(_map.get(x,a.y)!=0)returnnull;return_result.fill(a.clone(),b.clone());}/***纵向反省*@parama*@paramb*@return*/privatefunction_vTest(a:Point,b:Point):MatchResult{if(a.y==b.y||a.x!=b.x)returnnull;vary_start:uint=Math.min(a.y,b.y);vary_end:uint=Math.max(a.y,b.y);for(vary:uint=y_start+1;y<y_end;y++)if(_map.get(a.x,y)!=0)returnnull;return_result.fill(a.clone(),b.clone());}/***A、B之间有一个拐点*@parama*@paramb*@return*/privatefunction_oneCorner(a:Point,b:Point):MatchResult{varc:Point=newPoint(a.x,b.y);vard:Point=newPoint(b.x,a.y);varisMatch:Boolean=false;if(_map.get(c.x,c.y)==0)//C点上必需没有停滞{isMatch=_vTest(a,c)&&_hTest(b,c);if(isMatch){_result.clear();return_result.fill(a.clone(),b.clone(),c.clone());}}if(_map.get(d.x,d.y)==0)//D点上必需没有停滞{isMatch=_hTest(a,d)&&_vTest(b,d);if(isMatch){_result.clear();return_result.fill(a.clone(),b.clone(),d.clone());}}returnnull;}/***扫描两点决意的矩形局限内有无完全的空缺线段*@parama*@paramb*@return*/privatefunction_scanLine(a:Point,b:Point):DLinkedList{varv:DLinkedList=newDLinkedList();//从a,c连线向b扫描,扫描竖线//扫描A点右边的一切线for(varx1:Number=a.x;x1>=0;x1--){varc1:Point=newPoint(x1,a.y);vard1:Point=newPoint(x1,b.y);//存在完全线路--c,d点为零且纵向连通if(_map.get(x1,a.y)==0&&_map.get(x1,b.y)==0&&_vTest(c1,d1))v.}//扫描A点右侧的一切线for(varx2:Number=a.x;x2<_map.width;x2++){varc2:Point=newPoint(x2,a.y);vard2:Point=newPoint(x2,b.y);if(_map.get(x2,a.y)==0&&_map.get(x2,b.y)==0&&_vTest(c2,d2))v.append(newLine(Line.VERTICAL,c2,d2));}//从a,d连线向b扫描,扫描横线//扫描A点下面的一切线for(vary1:Number=a.y;y1>=0;y1--){varc3:Point=newPoint(a.x,y1);vard3:Point=newPoint(b.x,y1);if(_map.get(a.x,y1)==0&&_map.get(b.x,y1)==0&&_hTest(c3,d3))v.append(newLine(Line.HORIZONTAL,c3,d3));}//扫描A点上面的一切线for(vary2:Number=a.y;y2<_map.height;y2++){varc4:Point=newPoint(a.x,y2);vard4:Point=newPoint(b.x,y2);if(_map.get(a.x,y2)==0&&_map.get(b.x,y2)==0&&_hTest(c4,d4))v.append(newLine(Line.HORIZONTAL,c4,d4));}returnv;}/***对一切找到的切合线举行判别,看看AC、DB是不是一样也能够打消*@parama*@paramb*@return*/privatefunction_twoCorner(a:Point,b:Point):MatchResult{_vector=_scanLine(a,b);if(_vector.isEmpty())returnnull;//没有完全的空缺线段,无解varitr:Iterator=_vector.getIterator();while(itr.hasNext()){varln:Line=itr.next()asLine;switch(ln.direct){caseLine.HORIZONTAL:if(_vTest(a,ln.a)&&_vTest(b,ln.b)){_result.clear();return_result.fill(a.clone(),b.clone(),ln.a.clone(),ln.b.clone());}break;caseLine.VERTICAL:if(_hTest(a,ln.a)&&_hTest(b,ln.b)){_result.clear();return_result.fill(a.clone(),b.clone(),ln.a.clone(),ln.b.clone());}break;}}returnnull;}privatefunction_findRestPointA(map:Array2=null):Point{varm:Array2=map||_map;if(m.width>=m.height){for(varcol:Number=0;col<m.width;col++){varmax_y:Number=Math.min(col+1,m.height);for(vary1:Number=0;y1<max_y;y1++){if(m.get(col,y1)!=0)returnnewPoint(col,y1);}for(varx1:Number=0;x1<col;x1++){if(m.get(x1,max_y-1)!=0)returnnewPoint(x1,max_y-1);}}}else{for(varrow:Number=0;row<m.height;row++){varmax_x:Number=Math.min(row+1,m.width);for(varx2:Number=0;x2<max_x;x2++){if(m.get(x2,row)!=0)returnnewPoint(x2,row);}for(vary2:Number=0;y2<row;y2++){if(m.get(max_x-1,y2)!=0)returnnewPoint(max_x-1,y2);}}}returnnull;}privatefunction_findRestPointB(a:Point,ignore_b_arr:Array=null):Point{if(!a)returnnull;vartempMap:Array2=ArrayUtil.cloneArray2(_map);tempMap.set(a.x,a.y,0);if(ignore_b_arr&&ignore_b_arr.length){foreach(varbb:Pointinignore_b_arr)tempMap.set(bb.x,bb.y,0);}varb:Point=_findRestPointA(tempMap);if(!b)returnnull;while(_map.get(a.x,a.y)!=_map.get(b.x,b.y)){tempMap.set(b.x,b.y,0);b=_findRestPointA(tempMap);if(!b)returnnull;}returnb;}/**********************公然办法**********************//***测试两点是不是能够连通*@parama*@paramb*@usage判别两点的值不异而且满意连通前提*@return*/publicfunctiontest(a:Point,b:Point):Boolean{_result=newMatchResult();if(_map.get(a.x,a.y)!=_map.get(b.x,b.y))returnfalse;if(_hTest(a,b)||_vTest(a,b)||_oneCorner(a,b)||_twoCorner(a,b))returntrue;elsereturnfalse;}/***主动寻觅一条可连通的路径*@return*/publicfunctionautoFindLine():MatchResult{vara:Point=_findRestPointA();if(!a)returnnull;varb:Point=_findRestPointB(a);if(!b)returnnull;varignoreA:Array=[];varignoreB:Array=[];while(!this.test(a,b)){ignoreB.push(b);b=_findRestPointB(a,ignoreB);//基于A没有能够连通的点了,换一个A尝尝if(!b){ignoreB=[];ignoreA.push(a);vartempMap:Array2=ArrayUtil.cloneArray2(_map);tempMap.set(a.x,a.y,0);if(ignoreA.length)foreach(varp:PointinignoreA)tempMap.set(p.x,p.y,0);a=_findRestPointA(tempMap);b=_findRestPointB(a);}}//找不到能够连通的B点if(!b)returnnull;return_result.clone();}/***扫除两点*@parama*@paramb*/publicfunctionearse(a:Point,b:Point):void{_map.set(a.x,a.y,0);_map.set(b.x,b.y,0);_restBlock-=2;}/***革新*/publicfunctionrefresh():void{varnum:uint=this.count;if(num<=0)return;_array=ArrayUtil.random(ArrayUtil.getWarppedMapArray(_map));ArrayUtil.drawWrappedMap(_array,_map);}}}append(newLine(Line.VERTICAL,c1,d1));
复制代码 </p>
Flash是一个非常优秀的矢量动画制作软件,它以流式控制技术和矢量技术为核心,制作的动画具有短小精悍的特点,所以被广泛应用于网页动画的设计中,以成为当前网页动画设计最为流行的软件之一。 |
|