Flash AS3版连连看游戏核心算法
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-07
最近参考一个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-ok@yahoo.com.cn) */ public class Map { private var _level:uint; //游戏关卡对应的项目数量 private var _map:Array2; //二维数组 private var _array:Array; //辅助的一维数组 private var _restBlock:uint = 0; //剩余的项目数量 private var _vector:DLinkedList; //保存符合条件线段的地方 private var _countOfPerItem:uint; //每个项目出现的次数(偶数) private var _result:MatchResult; //暂存符合条件的结果 public function Map(level:uint = 16) { //加2是为了加一圈0 _map = new Array2( Setting.COLUMN+2, Setting.ROW+2 ); _array = new Array(_map.size - 2*_map.width - 2*_map.height + 4); _vector = null; _result = new MatchResult(); //调用setter this.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 <= 0?0:_restBlock; } public function get map():Array2 { return _map; } public function get result():MatchResult { return _result; } /********************** 私有方法 **********************/ private function _initMap():void { //一维数组初始化和乱序 for (var n:uint = 0; n < _array.length; n++) _array[n] = 0; for (var i:uint = 0; i < _level; i++) { for (var j:uint = 0; j < _countOfPerItem; j++) { _array[i * _countOfPerItem + j] = i + 1; } } _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 + 1; x < x_end; x++) if ( _map.get(x, a.y) != 0 ) 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 + 1; y < y_end; y++) if ( _map.get(a.x, y) != 0 ) 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) == 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) == |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Flash AS3版连连看游戏核心算法的所有评论