总感觉最近总是感觉饿WIFI不怎么好用

             
Flash AS3版连连看游戏核心算法
最近参考一个JAVA的版本写了一个AS3版的连连看游戏算法, 欢迎大家拍砖指正,里面用到了as3ds类库, 还有一些粉简单的辅助类就不贴出来了, 各位闭着眼睛也能想象出来, 看主要的逻辑吧
package model.components{import de.polygonal.ds.Array2;import de.polygonal.ds.DLinkedList;import de.polygonal.ds.Iterator;import flash.geom.Point;import utils.*;/*** 连连看算法* @author Luan (verycss-.cn)*/public class Map{private var _level:uint; //游戏关卡对应的项目数量private var _map:Array2; //二维数组private var _array:Array; //辅助的一维数组private var _restBlock:uint = <font color="#; //剩余的项目数量private var _vector:DLinkedList; //保存符合条件线段的地方private var _countOfPerItem:uint; //每个项目出现的次数(偶数)private var _result:MatchResult; //暂存符合条件的结果public function Map(level:uint = <font color="#){//加2是为了加一圈0_map = new Array2( Setting.COLUMN+<font color="#, Setting.ROW+<font color="# );_array = new Array(_map.size - <font color="#*_map.width - <font color="#*_map.height + <font color="#);_vector = null;_result = new MatchResult();//调用setterthis.level = level;}/********************** getter & setter **********************/public function set level(value:uint):void{_level = value;//取得一个尽量大的偶数值_countOfPerItem = NumberUtil.getFloorEven(_map.size / _level);_restBlock = _level * _countOfPerItem;_initMap();}public function get count():uint{return _restBlock &= <font color="#?<font color="#:_restBlock;}public function get map():Array2{return _map;}public function get result():MatchResult{return _result;}/********************** 私有方法 **********************/private function _initMap():void{//一维数组初始化和乱序for (var n:uint = <font color="#; n & _array.length; n++)_array[n] = <font color="#;for (var i:uint = <font color="#; i & _level; i++){for (var j:uint = <font color="#; j & _countOfPerItem; j++){_array[i * _countOfPerItem + j] = i + <font color="#;}}_array = ArrayUtil.random(_array);ArrayUtil.drawWrappedMap(_array, _map);}/*** 横向检查* @param & & & &a* @param & & & &b* @return*/private function _hTest(a:Point, b:Point):MatchResult{if (a.x == b.x || a.y != b.y ) return null;var x_start:uint = Math.min(a.x, b.x);var x_end:uint = Math.max(a.x, b.x);for (var x:uint = x_start + <font color="#; x & x_end; x++)if ( _map.get(x, a.y) != <font color="# )return null;return _result.fill(a.clone(), b.clone());}/*** 纵向检查* @param & & & &a* @param & & & &b* @return*/private function _vTest(a:Point, b:Point):MatchResult{if (a.y == b.y || a.x != b.x) return null;var y_start:uint = Math.min(a.y, b.y);var y_end:uint = Math.max(a.y, b.y);for (var y:uint = y_start + <font color="#; y & y_end; y++)if ( _map.get(a.x, y) != <font color="# )return null;return _result.fill(a.clone(), b.clone());}/*** A 、B 之间有一个拐点* @param & & & &a* @param & & & &b* @return*/private function _oneCorner(a:Point, b:Point):MatchResult{var c:Point = new Point(a.x, b.y);var d:Point = new Point(b.x, a.y);var isMatch:Boolean = false;if (_map.get(c.x, c.y) == <font color="#) //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) == <font color="#) //D 点上必须没有障碍{isMatch = _hTest(a, d) && _vTest(b, d);if (isMatch){_result.clear();return _result.fill(a.clone(), b.clone(), d.clone());}}return null;}/*** 扫描两点决定的矩形范围内有没有完整的空白线段* @param & & & &a* @param & & & &b* @return*/private function _scanLine(a:Point, b:Point):DLinkedList{var v:DLinkedList = new DLinkedList();// 从 a, c 连线向 b 扫描,扫描竖线// 扫描 A 点左边的所有线for (var x1:Number = a.x; x1 &= <font color="#; x1--){var c1:Point = new Point(x1, a.y);var d1:Point = new Point(x1, b.y);// 存在完整路线 -- c,d点为零且纵向连通if ( _map.get(x1, a.y) == <font color="# && _map.get(x1, b.y) == <font color="# && _vTest(c1, d1) )v.}// 扫描 A 点右边的所有线for (var x2:Number = a.x; x2 & _map.width; x2++){var c2:Point = new Point(x2, a.y);var d2:Point = new Point(x2, b.y);if ( _map.get(x2, a.y) == <font color="# && _map.get(x2, b.y) == <font color="# && _vTest(c2, d2) )v.append( new Line(Line.VERTICAL, c2, d2) );}// 从 a, d 连线向 b 扫描,扫描横线// 扫描 A 点上面的所有线for (var y1:Number = a.y; y1 &= <font color="#; y1--){var c3:Point = new Point(a.x, y1);var d3:Point = new Point(b.x, y1);if ( _map.get(a.x, y1) == <font color="# && _map.get(b.x, y1) == <font color="# && _hTest(c3, d3) )v.append( new Line(Line.HORIZONTAL, c3, d3) );}// 扫描 A 点下面的所有线for (var y2:Number = a.y; y2 & _map.height; y2++){var c4:Point = new Point(a.x, y2);var d4:Point = new Point(b.x, y2);if ( _map.get(a.x, y2) == <font color="# && _map.get(b.x, y2) == <font color="# && _hTest(c4, d4) )v.append( new Line(Line.HORIZONTAL, c4, d4) );}return v;}/*** 对所有找到的符合线进行判断,看看 AC 、 DB 是否同样也可以消除* @param & & & &a* @param & & & &b* @return*/private function _twoCorner(a:Point, b:Point):MatchResult{_vector = _scanLine(a, b);if (_vector.isEmpty()) return null; //没有完整的空白线段,无解 var itr:Iterator = _vector.getIterator();while (itr.hasNext()){var ln:Line = itr.next() as Line;switch (ln.direct){case Line.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;case Line.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;}}return null;}private function _findRestPointA(map:Array2 = null):Point{var m:Array2 = map || _map;if (m.width &= m.height){for (var col:Number = <font color="#; col & m.width; col++){var max_y:Number = Math.min(col + <font color="#, m.height);for (var y1:Number = <font color="#; y1 & max_y; y1++){& & & & if (m.get(col, y1) != <font color="#)& & & & & & & & return new Point(col, y1);}for (var x1:Number = <font color="#; x1 & col; x1++){& & & & if (m.get(x1, max_y-<font color="#) != <font color="#)& & & & & & & & return new Point(x1, max_y-<font color="#);}}}else{for (var row:Number = <font color="#; row & m.height; row++){var max_x:Number = Math.min(row + <font color="#, m.width);for (var x2:Number = <font color="#; x2 & max_x; x2++){& & & & if (m.get(x2, row) != <font color="#)& & & & & & & & return new Point(x2, row);}for (var y2:Number = <font color="#; y2 & row; y2++){& & & & if (m.get(max_x-<font color="#, y2) != <font color="#)& & & & & & & & return new Point(max_x-<font color="#, y2);}}}return null;}private function _findRestPointB(a:Point, ignore_b_arr:Array = null):Point{if (!a) return null;var tempMap:Array2 = ArrayUtil.cloneArray2(_map);tempMap.set(a.x, a.y, <font color="#);if (ignore_b_arr && ignore_b_arr.length){for each (var bb:Point in ignore_b_arr)tempMap.set(bb.x, bb.y, <font color="#);}var b:Point = _findRestPointA(tempMap);if (!b) return null;while ( _map.get(a.x, a.y) != _map.get(b.x, b.y) ){tempMap.set(b.x, b.y, <font color="#);b = _findRestPointA(tempMap);if (!b) return null;} return b;}/********************** 公开方法 **********************//*** 测试两点是否可以连通* @param & & & &a* @param & & & &b* @usage 判断 两点的值相同 并且 满足连通条件* @return*/public function test(a:Point, b:Point):Boolean{_result = new MatchResult();if (_map.get(a.x, a.y) != _map.get(b.x, b.y))return false;if ( _hTest(a, b) || _vTest(a, b) || _oneCorner(a, b) || _twoCorner(a, b) )return true;elsereturn false;}/*** 自动寻找一条可连通的路径* @return*/public function autoFindLine():MatchResult{var a:Point = _findRestPointA(); if (!a) return null;var b:Point = _findRestPointB(a); if (!b) return null;var ignoreA:Array = [];var ignoreB:Array = [];while ( !this.test(a, b) ){ignoreB.push(b);b = _findRestPointB(a, ignoreB);//基于A没有可以连通的点了, 换一个A试试if (!b){ignoreB = [];ignoreA.push(a);var tempMap:Array2 = ArrayUtil.cloneArray2(_map);tempMap.set(a.x, a.y, <font color="#);if (ignoreA.length)& & & & for each (var p:Point in ignoreA)& & & & & & & & tempMap.set(p.x, p.y, <font color="#);a = _findRestPointA(tempMap);b = _findRestPointB(a);}}//找不到可以连通的B点if (!b) return null;return _result.clone();}/*** 清除两点* @param & & & &a* @param & & & &b*/public function earse(a:Point, b:Point):void{_map.set(a.x, a.y, <font color="#);_map.set(b.x, b.y, <font color="#);_restBlock -= <font color="#;}/*** 刷新*/public function refresh():void{var num:uint = this.count;if (num &= <font color="#) return;_array = ArrayUtil.random( ArrayUtil.getWarppedMapArray(_map) );ArrayUtil.drawWrappedMap(_array, _map);}}}append( new Line(Line.VERTICAL, c1, d1) );
加入和大家一起交流,相互学习,共同提高.
 下一篇:
相关文章和赞助商广告
赞助商信息as3&#9733;半年多前写的flash&as3连连看源码
半年多前刚到新公司做的,不过后来也没用
网上连连看源码也多了去了,不过我还是自己写,没做过,就练练
该代码绝对没有错误,因为我自己测过,如果缺as什么的肯定是缺Tweener,自己去下载吧
这套源码不包含自行判断是否是死局的功能,要么就另外添加,要么图标种类别太多就行了
如果看不懂代码,也可以直接在FLASH舞台上实例化使用,只要设置下位置啦、间距啦之类的
先弄一个singlebox.as
import flash.display.MovieC
import flash.events.MouseE
public class singlebox extends MovieClip
public var typesn = 0;
public var sna = 0;
public var snb = 0;
public function singlebox(mc:MovieClip)
addChild(mc);
再弄主的,lianliankan.as
参数说明:
row行数,cols列数,disxX轴间距,disyY轴间距,posx初始X位置,posy初始Y位置
_kind:7为图标共有几种
_kindnum:10为每种图标各几个
public function effect()这个函数里可自行消除的效果
(如果看不懂代码,在舞台实例化lianliankan.as时,直接填写这些参数就可以直接用了。其次,连连看图标要放在库里,且都为MovieClip,命名规则按:box0,box1,box2,box3。。。以此类推,自己要改也可以。最后,库里还要有"checkui"作为选择框,“effectmc”作为消除时的效果)
import flash.display.MovieC
import flash.events.MouseE
import flash.geom.P
import flash.utils.getDefinitionByN
import flash.utils.setT
import caurina.transitions.T
import flash.display.S
public class lianliankan extends MovieClip
public var row:
public var cols:
public var allnum:
public var midarr:Array = [];
public var boxarr:Array = [];
public var check1:MovieC
public var check2:MovieC
public var effect1:MovieC
public var effect2:MovieC
public var ischeck:Boolean =//只单个选中为false
public var midboxa:MovieClip = new MovieC
public var midboxb:MovieClip = new MovieC
public var mida:singlebox = new singlebox(new MovieClip
public var midb:singlebox = new singlebox(new MovieClip
public var linearr:Array = [];
public var midm:singlebox = new singlebox(new MovieClip
public var midn:singlebox = new singlebox(new MovieClip
public var linepointarr:Array = [];
public var linemc:Sprite = new Sprite()
public var s1:singlebox
public var s2:singlebox
public function lianliankan(_row:int,_cols:int,_disx:Number,_disy:Number,_posx:Number,_posy:Number,_kind:int,_kindnum:int)
allnum = row *
for (i = 0; i & _ i++)
for (j = 0; j & _ j++)
var midclass:Class = getDefinitionByName("box" + i) as C
var midmc:MovieClip =
var boxmc:singlebox = new singlebox(midmc);
boxmc.typesn =
midarr.push(boxmc);
//主格子堆的四周增加null格子,以方便计算边界折线
for (i = 0; i & cols + 2; i++)
boxarr.push([]);
for (j = 0; j & row + 2; j++)
if (i == 0 || j == 0 || i == cols + 1 || j == row + 1)
boxarr[i].push(null);
midrand = int(Math.random() * midarr.length);
boxarr[i].push(midarr[midrand]);
midarr.splice(midrand,1);
boxarr[i][j].x = disx * i +
boxarr[i][j].y = disy * j +
boxarr[i][j].sna =
boxarr[i][j].snb =
addChild(boxarr[i][j]);
boxarr[i][j].addEventListener(MouseEvent.CLICK,onclick);
var midcheck:Class = getDefinitionByName("checkui") as C
addChild(check1);
addChild(check2);
check1.x = check1.y = check2.x = check2.y = -100;
//effect1.x = effect1.y = effect2.x = effect2.y = -100;
addChild(linemc)
public function onclick(oc:MouseEvent)
if (! ischeck)
midboxa = MovieClip(oc.currentTarget);
check1.x = midboxa.x;
check1.y = midboxa.y;
checka = oc.currentTarget.
if (ischeck)
midboxb = MovieClip(oc.currentTarget);
if (midboxa == midboxb)
check2.x = midboxb.x;
check2.y = midboxb.y;
checkb = oc.currentTarget.
check1.x = check1.y = check2.x = check2.y = -100;
if (checktwobox())
drawline();
var s1:singlebox=boxarr[midboxa.sna][midboxa.snb] as singlebox
var s2:singlebox=boxarr[midboxb.sna][midboxb.snb] as singlebox
addChild(s1)
addChild(s2)
removeChild(boxarr[midboxa.sna][midboxa.snb]);
removeChild(boxarr[midboxb.sna][midboxb.snb]);
boxarr[midboxa.sna][midboxa.snb] =
boxarr[midboxb.sna][midboxb.snb] =
setTimeout(effect,100);
public function checktwobox()
if (checka == checkb)
if (onecheck(midboxa,midboxb))
else if (twocheck(midboxa,midboxb))
return threecheck(midboxa,midboxb);
public function drawline()
linemc.graphics.clear();
linemc.graphics.lineStyle(3,0xff6600);
linemc.graphics.moveTo(linepointarr[0].x,linepointarr[0].y);
for (i = 1; i & linepointarr. i++)
linemc.graphics.lineTo(linepointarr[i].x,linepointarr[i].y);
public function effect()
linemc.graphics.clear();
addChild(effect1);
addChild(effect2);
effect1.x = s1.x;
effect1.y = s1.y;
effect2.x = s2.x;
effect2.y = s2.y;
effect1.play();
effect2.play();
Tweener.addTween(s1,{y:770
,time:Math.random()*.2+.8
,transition:"easeInBack"
,onComplete:function(){
//removeChild(s1);
Tweener.addTween(s2,{y:770
,time:Math.random()*.2+.8
,transition:"easeInBack"
,onComplete:function(){
//removeChild(s2);
public function onecheck(a:MovieClip,b:MovieClip):Boolean
if (a.sna == b.sna)
min = Math.min(a.snb,b.snb);
max = Math.max(a.snb,b.snb);
for (i = min + 1; i & i++)
if (boxarr[a.sna][i] != null)
linepointarr = [a,b];
if (a.snb == b.snb)
min = Math.min(a.sna,b.sna);
max = Math.max(a.sna,b.sna);
for (i = min + 1; i & i++)
if (boxarr[i][a.snb] != null)
linepointarr = [a,b];
public function twocheck(a:MovieClip,b:MovieClip):Boolean
mida.sna = a.
mida.snb = b.
midb.sna = b.
midb.snb = a.
if (boxarr[mida.sna][mida.snb] == null)
mida.x = a.x;
mida.y = b.y;
if (onecheck(mida,a) && onecheck(mida,b))
linepointarr = [a,mida,b];
if (boxarr[midb.sna][midb.snb] == null)
midb.x = b.x;
midb.y = a.y;
if (onecheck(midb,a) && onecheck(midb,b))
linepointarr = [a,midb,b];
public function threecheck(a:MovieClip,b:MovieClip):Boolean
//找出所有为null的竖线
for (m = 0; m & cols + 2; m++)
if (boxarr[m][a.snb] == null && boxarr[m][b.snb] == null)
midm.sna =
midm.snb = a.
midn.sna =
midn.snb = b.
midm.x = disx * m +
midm.y = a.y;
midn.x = disx * m +
midn.y = b.y;
if (onecheck(midm,midn))
if (onecheck(midm,a) && onecheck(b,midn))
linepointarr = [a,midm,midn,b];
//找出所有为null的横线
for (m = 0; m & row + 2; m++)
if (boxarr[a.sna][m] == null && boxarr[b.sna][m] == null)
midm.sna = a.
midm.snb =
midn.sna = b.
midn.snb =
midm.x = a.x;
midm.y = disy * m +
midn.x = b.x;
midn.y = disy * m +
if (onecheck(midm,midn))
if (onecheck(midm,a) && onecheck(midn,b))
linepointarr = [a,midm,midn,b];
flex版本的源码下载:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 最近总是感觉头晕犯困 的文章

 

随机推荐