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

PS設計教程網歡迎你!

Flash AS3版連連看游戲核心算法

文章來源于 moorwind.com,感謝作者 kono 給我們帶來經精彩的文章!
設計教程/設計教程/Flash教程2009-09-16
最近參考一個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天堂在线电影_美女扒开内裤羞羞网站
亚洲人成影院在线观看| 欧美日韩视频在线观看一区二区三区| 国产欧美精品一区aⅴ影院| 国产河南妇女毛片精品久久久| 国产精品午夜春色av| 色呦呦国产精品| 舔着乳尖日韩一区| 欧美不卡在线视频| 91小视频在线免费看| 亚洲h在线观看| 26uuu国产电影一区二区| 成人aaaa免费全部观看| 午夜精品福利一区二区三区蜜桃| 日韩精品一区二区三区在线观看| 成人听书哪个软件好| 五月开心婷婷久久| 久久久久久久电影| 欧美中文字幕一区二区三区亚洲 | 亚洲嫩草精品久久| 精品国产百合女同互慰| 91首页免费视频| 国产一区二区三区免费看| 一区二区三区在线观看网站| 2021国产精品久久精品| 欧洲在线/亚洲| 国产精品2024| 日韩和欧美一区二区三区| 国产精品天美传媒沈樵| 日韩一区二区三区免费看| 91免费在线视频观看| 国产乱码精品一区二区三区五月婷| 亚洲欧美另类久久久精品| 精品国产乱码久久久久久蜜臀 | 日韩三级.com| 欧美午夜一区二区| 成人美女视频在线看| 麻豆国产欧美日韩综合精品二区| 亚洲人xxxx| 国产精品天美传媒| 久久久噜噜噜久久人人看 | 欧美三电影在线| 色婷婷亚洲一区二区三区| 国产麻豆视频精品| 日本伊人午夜精品| 午夜精品福利在线| 一区二区三区鲁丝不卡| 国产精品久久午夜| 久久色.com| 久久综合中文字幕| 精品嫩草影院久久| 日韩欧美中文字幕公布| 3d成人动漫网站| 欧美日韩久久一区| 91成人免费在线| 91高清视频免费看| 色婷婷综合久久久久中文一区二区| 国产成人h网站| 国产sm精品调教视频网站| 国产精品中文字幕欧美| 极品少妇一区二区| 韩国成人福利片在线播放| 青娱乐精品视频在线| 青青草97国产精品免费观看无弹窗版| 亚洲最大色网站| 亚洲成人免费电影| 日韩中文字幕1| 日韩福利电影在线观看| 免费在线一区观看| 玖玖九九国产精品| 国内偷窥港台综合视频在线播放| 蜜桃精品视频在线| 久久疯狂做爰流白浆xx| 国产一区二区在线看| 国产高清精品网站| 99久久精品免费精品国产| 91麻豆蜜桃一区二区三区| 色88888久久久久久影院按摩| 91美女视频网站| 欧美无乱码久久久免费午夜一区| 在线观看亚洲一区| 欧美日本一道本在线视频| 91麻豆精品91久久久久久清纯| 日韩午夜精品电影| 日本一区二区三区免费乱视频| 国产精品欧美久久久久一区二区| 国产精品动漫网站| 亚洲成人777| 久久99日本精品| 国产盗摄女厕一区二区三区| gogogo免费视频观看亚洲一| 日本精品视频一区二区三区| 777午夜精品视频在线播放| 26uuu欧美日本| 亚洲精品日产精品乱码不卡| 婷婷六月综合网| 国产精品1区2区3区在线观看| 91丨porny丨在线| 日韩一区二区三区三四区视频在线观看 | 波多野结衣一区二区三区 | 蜜桃av噜噜一区| 国产69精品一区二区亚洲孕妇| 91浏览器打开| 日韩一区二区三区在线视频| 国产精品美女www爽爽爽| 亚洲宅男天堂在线观看无病毒| 狂野欧美性猛交blacked| 一本大道久久a久久综合| 欧美一区二区免费视频| 国产精品国产三级国产普通话蜜臀 | 国产精品久久久久久久久搜平片 | 国产精品的网站| 免费成人美女在线观看| 91亚洲精品久久久蜜桃网站 | 中文字幕亚洲区| 日本成人在线电影网| 99在线精品免费| 精品sm在线观看| 日韩精品欧美成人高清一区二区| 成人爽a毛片一区二区免费| 欧美一区二区三区四区五区| 亚洲欧洲综合另类在线| 国产精品影视在线| 91精品国产福利| 亚洲欧美另类久久久精品| 国产精品一卡二| 4438成人网| 亚洲不卡一区二区三区| 成人动漫视频在线| wwww国产精品欧美| 日韩国产精品久久久久久亚洲| 97久久超碰国产精品电影| 亚洲精品在线电影| 青青草国产精品97视觉盛宴| 欧美视频一区二区在线观看| 亚洲人被黑人高潮完整版| 成人激情综合网站| 久久精品亚洲精品国产欧美kt∨ | 日韩免费成人网| 日本欧美久久久久免费播放网| 色综合久久中文综合久久牛| 国产精品美女久久久久久久网站| 老司机免费视频一区二区三区| 欧美日本韩国一区| 亚洲国产欧美另类丝袜| 色成人在线视频| 中文字幕五月欧美| 成人手机在线视频| 国产精品传媒在线| www.亚洲在线| ...av二区三区久久精品| 国产宾馆实践打屁股91| 欧美激情在线观看视频免费| 国产在线观看免费一区| 精品国产乱子伦一区| 狠狠色狠狠色合久久伊人| 欧美va天堂va视频va在线| 久久精品国产999大香线蕉| 欧美一级视频精品观看| 日本aⅴ精品一区二区三区 | 视频一区在线播放| 884aa四虎影成人精品一区| 日韩中文字幕一区二区三区| 欧美一区永久视频免费观看| 青青草视频一区| 久久蜜桃香蕉精品一区二区三区| 国产一区二区三区观看| 中文字幕成人网| 99re亚洲国产精品| 亚洲国产精品一区二区久久恐怖片| 在线免费精品视频| 日本一不卡视频| 久久久久久久久久久久久久久99| 懂色一区二区三区免费观看| 成人免费在线视频观看| 欧美在线视频不卡| 另类调教123区| 国产日韩欧美精品电影三级在线| 99在线热播精品免费| 午夜精品福利一区二区三区av| 日韩三级在线免费观看| 国产99久久久精品| 亚洲一区二区欧美日韩| 精品久久人人做人人爱| 99国产精品视频免费观看| 亚洲一区二区五区| 精品久久久久久久久久久久久久久久久| 国产在线精品一区二区不卡了| 亚洲欧洲av一区二区三区久久| 欧美高清精品3d| 国产成人自拍高清视频在线免费播放| 亚洲欧美怡红院| 日韩精品一区在线| 色综合久久中文字幕| 人人爽香蕉精品| 中文字幕日韩一区二区| 欧美一区二区在线观看| 北条麻妃一区二区三区| 爽好多水快深点欧美视频| 久久精品一区二区三区不卡| 欧美日韩亚洲国产综合|