a级毛片在线观看_欧美性69式xxxx护士_欧美va天堂在线电影_美女扒开内裤羞羞网站

PS設計教程網歡迎你!

Flash AS3教程:連連看小游戲AS代碼

文章來源于 moorwind.com,感謝作者 kono 給我們帶來經精彩的文章!
設計教程/設計教程/Flash教程2009-10-14
最近參考一個JAVA的版本寫了一個AS3版的連連看游戲算法, 歡迎大家拍磚指正,里面用到了as3ds類庫, 還有一些粉簡單的輔助類就不貼出來了, 各位閉著眼睛也能想象出來, 看主要的邏輯吧

最近參考一個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) == 0) //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 >= 0; 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) == 0 && _map.get(x1, b.y) == 0 && _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) == 0 && _map.get(x2, b.y) == 0 && _vTest(c2, d2) )
v
.append( new Line(Line.VERTICAL, c2, d2) );
}

// 從 a, d 連線向 b 掃描,掃描橫線

// 掃描 A 點上面的所有線
for (var y1:Number = a.y; y1 >= 0; y1--)
{
var c3:Point = new Point(a.x, y1);
var d3:Point = new Point(b.x, y1);

if ( _map.get(a.x, y1) == 0 && _map.get(b.x, y1) == 0 && _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) == 0 && _map.get(b.x, y2) == 0 && _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 = 0; col < m.width; col++)
{
var max_y:Number = Math.min(col + 1, m.height);

for (var y1:Number = 0; y1 < max_y; y1++)
{
       
if (m.get(col, y1) != 0)
               
return new Point(col, y1);
}

for (var x1:Number = 0; x1 < col; x1++)
{
       
if (m.get(x1, max_y-1) != 0)
               
return new Point(x1, max_y-1);
}
}
}
else
{
for (var row:Number = 0; row < m.height; row++)
{
var max_x:Number = Math.min(row + 1, m.width);

for (var x2:Number = 0; x2 < max_x; x2++)
{
       
if (m.get(x2, row) != 0)
               
return new Point(x2, row);
}

for (var y2:Number = 0; y2 < row; y2++)
{
       
if (m.get(max_x-1, y2) != 0)
               
return new Point(max_x-1, 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, 0);

if (ignore_b_arr && ignore_b_arr.length)
{
for each (var bb:Point in ignore_b_arr)
tempMap
.set(bb.x, bb.y, 0);
}

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, 0);

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;
else
return 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, 0);

if (ignoreA.length)
       
for each (var p:Point in ignoreA)
                tempMap
.set(p.x, p.y, 0);

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, 0);
_map
.set(b.x, b.y, 0);
_restBlock
-= 2;
}

/**
* 刷新
*/

public function refresh():void
{
var num:uint = this.count;
if (num <= 0) return;

_array
= ArrayUtil.random( ArrayUtil.getWarppedMapArray(_map) );

ArrayUtil.drawWrappedMap(_array, _map);
}

}

}
append( new Line(Line.VERTICAL, c1, d1) );

版權所有PS設計教程網公安備案:蘇公網安備 32058302001023號工信部備案:滬ICP備09005587號
aaa
a级毛片在线观看_欧美性69式xxxx护士_欧美va天堂在线电影_美女扒开内裤羞羞网站
亚洲国产精品t66y| 欧美性xxxxx极品少妇| 国产农村妇女精品| av欧美精品.com| 依依成人精品视频| 6080国产精品一区二区| 久久精品国产亚洲一区二区三区| 欧美va亚洲va| 国产成人av一区二区三区在线 | 91一区二区在线| 国产精品黄色在线观看| 欧美日韩黄色一区二区| 狠狠色丁香婷婷综合| 国产精品久久久久久久久免费丝袜 | 韩国av一区二区三区| 日韩一区在线播放| 欧美人xxxx| 国产aⅴ综合色| 欧美国产欧美亚州国产日韩mv天天看完整| 99国产精品久| 精品伊人久久久久7777人| 国产精品久久久久桃色tv| 欧美美女一区二区三区| 成人精品在线视频观看| 日韩电影在线观看电影| 国产亚洲视频系列| 欧美视频日韩视频在线观看| 国产高清精品在线| 亚洲成av人片在线| 久久久美女毛片| 欧美男女性生活在线直播观看| 国产精品一区一区三区| 视频一区国产视频| 亚洲欧洲中文日韩久久av乱码| 精品精品国产高清a毛片牛牛| 91香蕉视频黄| 国产精品资源在线看| 婷婷成人激情在线网| 国产精品卡一卡二| 欧美不卡一区二区| 欧美三级欧美一级| 成人精品鲁一区一区二区| 日韩国产成人精品| 国产精品全国免费观看高清| 日韩欧美一区在线观看| 欧美日韩免费在线视频| 91色porny| 成人午夜电影久久影院| 黑人巨大精品欧美黑白配亚洲| 亚洲精品乱码久久久久久久久| 日本一二三不卡| 欧美mv日韩mv亚洲| 欧美一区二区黄色| 欧美嫩在线观看| 欧美三级在线视频| 欧美三级视频在线播放| 一本一本大道香蕉久在线精品| 国产精品一区二区三区网站| 蜜臀av性久久久久蜜臀aⅴ| 亚洲成a人片在线观看中文| 日韩码欧中文字| 国产女人18水真多18精品一级做 | 欧美一级免费大片| 欧美丝袜丝交足nylons图片| av在线免费不卡| 99久久伊人精品| caoporn国产一区二区| 成人av免费在线播放| 国产成人h网站| 成人av资源站| 不卡在线观看av| 视频在线观看91| 欧美日韩免费观看一区三区| 欧美写真视频网站| 91福利精品视频| 欧美怡红院视频| 欧美日韩精品一区二区三区| 欧美三级中文字幕在线观看| 欧美精选午夜久久久乱码6080| 欧美日韩成人高清| 日韩欧美一二三四区| 欧美成人aa大片| 中文一区在线播放| 亚洲视频一二三| 亚洲成人久久影院| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久成人av少妇免费| 成人性生交大片免费看在线播放| av一二三不卡影片| 欧美日韩在线播放三区四区| 日韩网站在线看片你懂的| 久久这里都是精品| 亚洲视频香蕉人妖| 日韩中文字幕一区二区三区| 国产乱码精品1区2区3区| 成人免费黄色在线| 欧美视频一区二| 久久久久一区二区三区四区| 国产精品久久毛片a| 亚洲福利视频一区二区| 精品一区二区三区欧美| www.性欧美| 538在线一区二区精品国产| www国产成人免费观看视频 深夜成人网| 亚洲国产成人私人影院tom| 亚洲一区日韩精品中文字幕| 美女www一区二区| 99re热视频这里只精品| 91精品国产综合久久婷婷香蕉| 久久亚洲春色中文字幕久久久| 亚洲色图制服诱惑| 日本中文一区二区三区| av网站一区二区三区| 欧美一区二区三级| 亚洲视频中文字幕| 九一久久久久久| 在线精品亚洲一区二区不卡| 亚洲精品在线观看视频| 一区二区三区波多野结衣在线观看| 蜜臀91精品一区二区三区 | 精品久久久久久久久久久久久久久久久 | 亚洲欧美日韩国产手机在线 | 丰满亚洲少妇av| 日韩一区二区中文字幕| 中文字幕亚洲在| 久久激情综合网| 欧美午夜精品电影| 国产精品毛片a∨一区二区三区| 午夜欧美视频在线观看| 丁香亚洲综合激情啪啪综合| 欧美一级夜夜爽| 亚洲国产成人av| av亚洲精华国产精华| 国产日韩欧美高清| 蜜臀91精品一区二区三区| 欧美性猛交一区二区三区精品| 国产精品入口麻豆九色| 美女免费视频一区| 91精品国产麻豆| 亚洲第一成年网| 91黄色免费看| 亚洲色图清纯唯美| 成人精品一区二区三区中文字幕| www国产精品av| 激情av综合网| 精品国产免费人成在线观看| 日韩电影免费在线观看网站| 欧美又粗又大又爽| 裸体歌舞表演一区二区| 欧美美女黄视频| 五月天激情综合网| 欧美视频中文字幕| 亚洲伊人色欲综合网| 91福利资源站| 亚洲一二三四在线观看| 91福利社在线观看| 亚洲午夜久久久久久久久久久| 91麻豆国产香蕉久久精品| 国产精品你懂的在线| 成人国产亚洲欧美成人综合网| 国产人成一区二区三区影院| 国产成人欧美日韩在线电影| 国产欧美一区在线| 豆国产96在线|亚洲| 国产精品理论片在线观看| 972aa.com艺术欧美| 亚洲一区二区三区国产| 欧美无人高清视频在线观看| 亚洲成av人片在线| 日韩免费看网站| 国产一区在线观看视频| 欧美国产日韩一二三区| 色悠悠亚洲一区二区| 尤物视频一区二区| 91精品国产全国免费观看| 国内精品久久久久影院色| 国产女同互慰高潮91漫画| 91蝌蚪porny成人天涯| 亚洲线精品一区二区三区八戒| 欧美日韩精品欧美日韩精品一| 日日摸夜夜添夜夜添亚洲女人| 日韩一级高清毛片| 国产成人午夜视频| 一区二区在线观看免费| 欧美肥大bbwbbw高潮| 国产一区二区中文字幕| 亚洲视频一区二区免费在线观看 | 精品国产电影一区二区| 成人污污视频在线观看| 一区二区三区四区av| 日韩一区二区视频在线观看| 国产成人午夜电影网| 亚洲最大的成人av| 欧美mv日韩mv亚洲| 91色综合久久久久婷婷| 日韩精彩视频在线观看| 国产欧美精品一区二区三区四区| 日本大香伊一区二区三区| 精品无人码麻豆乱码1区2区 | 欧美性受极品xxxx喷水|