package
{
import
flash.display.
*
;
import
flash.events.MouseEvent;
import
flash.events.Event;
import
flash.utils.getDefinitionByName;
import
flash.text.
*
;
import
flash.utils.Timer;
import
flash.events.TimerEvent;
public
class
seeLink
extends
Sprite
{
private
var mapArray:Array;
private
var widthSize:Number
=
12
;
private
var heightSize:Number
=
12
;
private
var imageArray, imageArray2:Array;
private
var oneCornerArray, twoCornerArray:Array;
private
var allArray:Array;
private
var recFrame:RecFrame;
private
var preUnit, nextUnit:mapUnit;
private
var timeBar:TimeBar;
private
var clickCount:Number
=
0
;
private
var flag:Boolean
=
false
;
private
var flag_mc:MovieClip;
public
function seeLink()
{
mapArray
=
new
Array();
allArray
=
new
Array();
oneCornerArray
=
new
Array();
twoCornerArray
=
new
Array();
setImageArray();
attachText();
attachTimeBar();
attachMap();
attachFlag(
"
start
"
);
}
private
function attachText():
void
{
var timeTextField:TextField
=
new
TextField();
timeTextField.x
=
7
;
timeTextField.y
=
15
;
timeTextField.text
=
"
时间
"
;
this
.addChild(timeTextField);
}
public
function attachTimeBar():
void
{
timeBar
=
new
TimeBar();
timeBar.x
=
40
;
timeBar.y
=
20
;
this
.addEventListener(Event.ENTER_FRAME, myOnEnterFrame);
this
.addChild(timeBar);
}
private
function myOnEnterFrame(e:Event):
void
{
timeSub();
}
private
function attachFlag(type:String):
void
{
flag_mc
=
new
Flag();
//
trace(type);
if
(type
==
"
win
"
)
{
flag_mc.gotoAndStop(
1
);
}
else
if
(type
==
"
lose
"
)
{
flag_mc.gotoAndStop(
2
);
}
else
if
(type
==
"
start
"
)
{
flag_mc.gotoAndStop(
3
);
}
flag_mc.x
=
stage.stageWidth
/
2
-
flag_mc.width
/
2
;
flag_mc.y
=
stage.stageHeight
/
2
-
flag_mc.height
/
2
;
this
.addChild(flag_mc);
var myTimer:Timer
=
new
Timer(
3000
,
1
);
myTimer.addEventListener(
"
timer
"
, timerHandler);
myTimer.start();
}
private
function timerHandler(event:TimerEvent):
void
{
trace(
"
removeFlag
"
);
this
.removeChild(flag_mc);
}
private
function checkIsWin():Boolean
{
for
(var i:Number
=
0
; i
<
mapArray.length; i
++
)
{
if
(mapArray[i]._typeNum
!=
-
1
)
{
return
false
;
}
}
return
true
;
}
private
function removeEnterFrame():
void
{
this
.removeEventListener(Event.ENTER_FRAME, myOnEnterFrame);
}
private
function timeSub():
void
{
//
trace("timeBar._width="+timeBar._width);
timeBar.width
-=
0.08
;
if
(timeBar.width
<
0.5
)
{
//
trace("remove");
timeBar.width
=
0
;
attachFlag(
"
lose
"
);
removeEnterFrame();
}
else
{
var isWin:Boolean
=
checkIsWin();
if
(isWin)
{
attachFlag(
"
win
"
);
removeEnterFrame();
}
}
}
public
function setLatterArray(_Arr:Array):Array
{
var len:Number
=
_Arr.length;
var j:Number;
for
(j
=
0
; j
<
len; j
++
)
{
var rand:Number
=
Math.floor(Math.random()
*
len);
var temp:Number
=
_Arr[j];
_Arr[j]
=
_Arr[rand];
_Arr[rand]
=
temp;
}
return
_Arr;
}
private
function setImageArray()
{
var beforeArray
=
new
Array();
for
(var i:Number
=
0
; i
<
(widthSize
*
heightSize
-
4
*
(heightSize
-
1
))
/
2
; i
++
)
{
var randomNum
=
Math.floor(Math.random()
*
28
);
beforeArray.push(randomNum);
}
//
trace("before beforeArray="+beforeArray);
var tempArray:Array
=
beforeArray.slice(
0
);
//
trace("before tempArray="+tempArray);
var laterArray:Array
=
setLatterArray(tempArray);
//
trace("later laterArray="+laterArray);
//
trace("imageArray2="+imageArray2);
allArray
=
beforeArray.concat(laterArray);
//
trace("allArray="+allArray);
}
private
function attachMap()
{
var arrayNum:Number
=
0
;
for
(var i:Number
=
0
; i
<
heightSize; i
++
)
{
for
(var j:Number
=
0
; j
<
widthSize; j
++
)
{
//
加载底
var edge:Edge
=
new
Edge();
edge.x
=
20
+
j
*
edge.width;
edge.y
=
80
+
i
*
edge.height;
//
edge.name = i*10+j;
this
.addChild(edge);
var _num
=
i
*
heightSize
+
j;
//
加上周围透明mc,用来显示路径
if
(i
==
0
||
i
==
heightSize
-
1
||
j
==
0
||
j
==
widthSize
-
1
)
{
var cls
=
getDefinitionByName(
"
cover
"
);
var temp
=
new
cls();
edge.addChild(temp)
mapArray[_num]
=
new
mapUnit(
this
, edge, i, j,
-
1
);
}
else
{
//
底上加载各种图片
var typeNum
=
allArray[arrayNum];
arrayNum
++
;
var image_cls
=
getDefinitionByName(
"
type
"
+
typeNum);
var image
=
new
image_cls();
image.name
=
typeNum;
edge.addChild(image)
mapArray[_num]
=
new
mapUnit(
this
, edge, i, j, typeNum);
}
}
}
}
private
function removeRecFrame()
{
/*
trace("recFrame="+recFrame);
if(recFrame!=null){
this.removeChild(recFrame);
}
*/
recFrame.visible
=
false
;
}
private
function attachRecFrame(unit:mapUnit)
{
//
removeRecFrame();
if
(recFrame
==
null
)
{
recFrame
=
new
RecFrame();
this
.addChild(recFrame);
}
recFrame.visible
=
true
;
recFrame.x
=
unit.graphic.x;
recFrame.y
=
unit.graphic.y;
}
private
function addClickCount():
void
{
clickCount
++
;
}
public
function addRecFrame(unit:mapUnit)
{
addClickCount();
attachRecFrame(unit);
//
trace("clickCount="+clickCount);
if
(clickCount
==
1
)
{
preUnit
=
unit;
}
else
{
if
(preUnit
==
unit)
{
//
trace("flag="+flag);
flag
=
!
flag;
//
trace("== flag="+flag);
if
(flag)
{
removeRecFrame();
}
else
{
attachRecFrame(unit);
}
}
else
{
//
trace("preUnit._typeNum="+preUnit._typeNum);
//
trace("unit._typeNum="+unit._typeNum);
if
(preUnit._typeNum
==
unit._typeNum)
{
checkIsLink(preUnit, unit)
}
preUnit
=
unit;
flag
=
false
;
}
}
}
private
function checkIsLink(preUnit, nextUnit:mapUnit)
{
var isBeeLink:Number
=
isBeeLineLink(preUnit, nextUnit);
trace(
"
isBeeLink=
"
+
isBeeLink);
//
isBeeLink return parameter:
//
0.没有符合条件;
//
1.符合条件,联结成功;
//
2.符合条件,没有联结成功.
//
一级检测成功
if
(isBeeLink
==
1
)
{
removeHandle(preUnit, nextUnit);
}
//
一级检测不成功
if
(isBeeLink
==
2
||
isBeeLink
==
0
)
{
//
离开一级检验,进入二级检测.
secondCheck(preUnit, nextUnit);
}
}
private
function secondCheck(preUnit, nextUnit:mapUnit):
void
{
var _isOneCornerLink:Boolean
=
isOneCornerLink(preUnit, nextUnit);
trace(
"
_isOneCornerLink=
"
+
_isOneCornerLink);
//
二级检测成功
if
(_isOneCornerLink)
{
removeHandle(preUnit, nextUnit);
}
else
{
//
二级检测不成功,离开二级检验,进入三级检验.
thirdCheck(preUnit, nextUnit);
}
}
private
function thirdCheck(preUnit, nextUnit:mapUnit):
void
{
var _isTwoCornerLink:Boolean
=
isTwoCornerLink(preUnit, nextUnit);
trace(
"
_isTwoCornerLink=
"
+
_isTwoCornerLink);
if
(_isTwoCornerLink)
{
removeHandle(preUnit, nextUnit);
}
removeArray();
}
private
function isTwoCornerLink(preUnit, nextUnit:mapUnit):Boolean
{
//
trace("preUnit.xNo="+preUnit.xNo);
//
trace("preUnit.yNo="+preUnit.yNo);
//
trace("nextUnit.xNo="+nextUnit.xNo);
//
trace("nextUnit.yNo="+nextUnit.yNo);
//
trace("in isTwoCornerLink");
pushToOneCornerArray(preUnit);
pushToTwoCornerArray(nextUnit);
//
trace("oneCornerArray.length="+oneCornerArray.length);
//
trace("twoCornerArray.length="+twoCornerArray.length);
var tempArray:Array
=
new
Array();
for
(var i:Number
=
0
; i
<
oneCornerArray.length; i
++
)
{
for
(var j:Number
=
0
; j
<
twoCornerArray.length; j
++
)
{
var temp1:mapUnit
=
oneCornerArray[i];
var temp2:mapUnit
=
twoCornerArray[j];
//
trace("temp1.xNo="+temp1.xNo);
//
trace("temp1.yNo="+temp1.yNo);
//
trace("temp2.xNo="+temp2.xNo);
//
trace("temp2.yNo="+temp2.yNo);
if
(temp1.xNo
==
temp2.xNo)
{
if
(temp1.yNo
==
preUnit.yNo
&&
temp2.yNo
==
nextUnit.yNo)
{
tempArray.push({one: temp1, two: temp2});
}
}
if
(temp1.yNo
==
temp2.yNo)
{
if
(temp1.xNo
==
preUnit.xNo
&&
temp2.xNo
==
nextUnit.xNo)
{
tempArray.push({one: temp1, two: temp2});
}
}
}
}
//
trace("tempArray.length="+tempArray.length);
for
(var m:Number
=
0
; m
<
tempArray.length; m
++
)
{
var oneCorner:mapUnit
=
tempArray[m].one;
var twoCorner:mapUnit
=
tempArray[m].two;
//
trace("oneCorner.xNo="+oneCorner.xNo);
//
trace("oneCorner.yNo="+oneCorner.yNo);
//
trace("twoCorner.xNo="+twoCorner.xNo);
//
trace("twoCorner.yNo="+twoCorner.yNo);
if
(oneCorner.yNo
==
twoCorner.yNo)
{
var result1:Number
=
compare(oneCorner.yNo, oneCorner.xNo, twoCorner.xNo,
"
x
"
);
}
if
(oneCorner.xNo
==
twoCorner.xNo)
{
var result2:Number
=
compare(oneCorner.xNo, oneCorner.yNo, twoCorner.yNo,
"
y
"
);
}
if
(result1
==
1
||
result2
==
1
)
{
return
true
;
}
}
return
false
;
}
private
function removeHandle(preUnit, nextUnit:mapUnit):
void
{
removeUnit(preUnit);
removeUnit(nextUnit);
removeRecFrame();
}
private
function removeArray():
void
{
//
trace("oneCornerArray.length="+oneCornerArray.length);
//
trace("twoCornerArray.length="+twoCornerArray.length);
oneCornerArray.splice(
0
);
twoCornerArray.splice(
0
);
}
private
function checkOneCornerLink(cornerUnit, preUnit, nextUnit:mapUnit):Boolean
{
//
如果拐角为空
//
trace("cornerUnit._typeNum="+cornerUnit._typeNum);
//
trace("cornerUnit.xNo="+cornerUnit.xNo);
//
trace("cornerUnit.yNo="+cornerUnit.yNo);
if
(cornerUnit._typeNum
==
-
1
)
{
//
如果拐角满足条件可以联结,则返回成功,否则,判断另一个拐角
var result1, result2:Number;
if
(cornerUnit.xNo
==
preUnit.xNo)
{
result1
=
compare(cornerUnit.xNo, cornerUnit.yNo, preUnit.yNo,
"
y
"
);
}
if
(cornerUnit.yNo
==
preUnit.yNo)
{
result1
=
compare(cornerUnit.yNo, cornerUnit.xNo, preUnit.xNo,
"
x
"
);
}
if
(cornerUnit.xNo
==
nextUnit.xNo)
{
result2
=
compare(cornerUnit.xNo, cornerUnit.yNo, nextUnit.yNo,
"
y
"
);
}
if
(cornerUnit.yNo
==
nextUnit.yNo)
{
result2
=
compare(cornerUnit.yNo, cornerUnit.xNo, nextUnit.xNo,
"
x
"
);
}
//
result,result,result,result,result,result,result,result,result,result;
//
trace("result1="+result1);
//
trace("result2="+result2);
if
(result1
==
1
&&
result2
==
1
)
{
return
true
;
}
else
{
//
如果中间有中断,返回不成功
return
false
;
}
}
else
{
//
如果拐角不为空,则直接返回不成功
return
false
;
}
}
private
function isOneCornerLink(preUnit, nextUnit:mapUnit):Boolean
{
//
trace("preUnit.xNo="+preUnit.xNo);
//
trace("preUnit.yNo="+preUnit.yNo);
//
trace("nextUnit.xNo="+nextUnit.xNo);
//
trace("nextUnit.yNo="+nextUnit.yNo);
//
找到拐点
var oneCornerUnit:mapUnit
=
getUnit(preUnit.xNo, nextUnit.yNo);
var oneTest:Boolean
=
checkOneCornerLink(oneCornerUnit, preUnit, nextUnit);
//
trace("oneTest="+oneTest);
//
如果此拐点连接不成功
if
(
!
oneTest)
{
//
找到另一个拐点
var oneCornerUnit2:mapUnit
=
getUnit(nextUnit.xNo, preUnit.yNo);
//
trace("oneCornerUnit2._typeNum="+oneCornerUnit2._typeNum);
return
checkOneCornerLink(oneCornerUnit2, preUnit, nextUnit);
}
else
{
return
oneTest;
}
}
private
function removeUnit(unit:mapUnit)
{
//
trace("unit._typeNum="+unit._typeNum);
//
trace(unit.graphic.getChildByName(unit._typeNum));
unit.graphic.removeChild(unit.graphic.getChildByName(unit._typeNum));
//
delete unit.graphic.onPress;
unit.removeMouseEvent();
unit.setTypeNum(
-
1
);
}
//
判断两点之间图片是否全为空,1表示为空,可以连接,2表示不为空,中断连接
private
function compare(variable, preNo, nextNo:Number, type:String):Number
{
//
trace("in compare type="+type);
if
(preNo
<
nextNo)
{
min
=
preNo;
max
=
nextNo;
}
else
{
min
=
nextNo;
max
=
preNo;
}
//
trace("min="+min);
//
trace("max="+max);
if
(max
-
min
==
1
)
{
return
1
;
}
else
{
var tempUnit:mapUnit;
for
(var i:Number
=
min
+
1
; i
<
max; i
++
)
{
if
(type
==
"
x
"
)
{
tempUnit
=
getUnit(i, variable);
}
else
if
(type
==
"
y
"
)
{
tempUnit
=
getUnit(variable, i);
}
//
trace("tempUnit._typeNum="+tempUnit._typeNum);
//
trace("tempUnit._xNo="+tempUnit.xNo);
//
trace("tempUnit._yNo="+tempUnit.yNo);
if
(tempUnit._typeNum
!=
-
1
)
{
return
2
;
}
}
return
1
;
}
}
private
function isBeeLineLink(preUnit, nextUnit:mapUnit):Number
{
if
(preUnit.xNo
==
nextUnit.xNo)
{
return
compare(preUnit.xNo, preUnit.yNo, nextUnit.yNo,
"
y
"
);
}
if
(preUnit.yNo
==
nextUnit.yNo)
{
return
compare(preUnit.yNo, preUnit.xNo, nextUnit.xNo,
"
x
"
);
}
if
(preUnit.yNo
!=
nextUnit.yNo
&&
preUnit.xNo
!=
nextUnit.xNo)
{
return
0
;
}
}
private
function getUnit(xNo, yNo:Number):mapUnit
{
//
trace("getUnit xNo="+xNo);
//
trace("getUnit yNo="+yNo);
var num:Number
=
yNo
*
heightSize
+
xNo;
return
mapArray[num];
}
private
function pushToOneCornerArray(preUnit:mapUnit):
void
{
//
trace("left***************************");
for
(var i:Number
=
preUnit.xNo
-
1
; i
>
-
1
; i
--
)
{
var unitLeft:mapUnit
=
getUnit(i, preUnit.yNo);
//
图片不为空
//
trace("unitLeft._typeNum="+unitLeft._typeNum);
if
(unitLeft._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
oneCornerArray.push(unitLeft);
}
}
//
trace("right***************************");
//
trace("oneCornerArray.length="+oneCornerArray.length);
for
(var j:Number
=
preUnit.xNo
+
1
; j
<
widthSize; j
++
)
{
var unitRight:mapUnit
=
getUnit(j, preUnit.yNo);
//
trace("unitRight._typeNum="+unitRight._typeNum);
//
trace("unitRight.xNo="+unitRight.xNo);
//
trace("unitRight.yNo="+unitRight.yNo);
//
图片不为空
if
(unitRight._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
oneCornerArray.push(unitRight);
}
}
//
trace("up***************************");
//
trace("oneCornerArray.length="+oneCornerArray.length);
for
(var m:Number
=
preUnit.yNo
-
1
; m
>
-
1
; m
--
)
{
var unitUp:mapUnit
=
getUnit(preUnit.xNo, m);
//
trace("unitUp._typeNum="+unitUp._typeNum);
//
图片不为空
if
(unitUp._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
oneCornerArray.push(unitUp);
}
}
//
trace("down***************************");
//
trace("oneCornerArray.length="+oneCornerArray.length);
for
(var n:Number
=
preUnit.yNo
+
1
; n
<
heightSize; n
++
)
{
var unitDown:mapUnit
=
getUnit(preUnit.xNo, n);
//
trace("unitDown._typeNum="+unitDown._typeNum);
//
图片不为空
if
(unitDown._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
oneCornerArray.push(unitDown);
}
}
//
trace("oneCornerArray.length="+oneCornerArray.length);
}
private
function pushToTwoCornerArray(nextUnit:mapUnit):
void
{
//
trace("Two corner left***************************");
for
(var i:Number
=
nextUnit.xNo
-
1
; i
>
-
1
; i
--
)
{
var unitLeft
=
getUnit(i, nextUnit.yNo);
//
图片不为空
if
(unitLeft._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
twoCornerArray.push(unitLeft);
}
}
//
trace("Two corner right***************************");
for
(var j:Number
=
nextUnit.xNo
+
1
; j
<
widthSize; j
++
)
{
var unitRight
=
getUnit(j, nextUnit.yNo);
//
trace("unitRight._typeNum="+unitRight._typeNum);
//
trace("unitRight.xNo="+unitRight.xNo);
//
trace("unitRight.yNo="+unitRight.yNo);
//
图片不为空
if
(unitRight._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
twoCornerArray.push(unitRight);
}
}
//
trace("Two corner up***************************");
for
(var m:Number
=
nextUnit.yNo
-
1
; m
>
-
1
; m
--
)
{
var unitUp
=
getUnit(nextUnit.xNo, m);
//
图片不为空
if
(unitUp._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
twoCornerArray.push(unitUp);
}
}
//
trace("Two corner down***************************");
for
(var n:Number
=
nextUnit.yNo
+
1
; n
<
heightSize; n
++
)
{
var unitDown
=
getUnit(nextUnit.xNo, n);
//
图片不为空
if
(unitDown._typeNum
!=
-
1
)
{
break
;
}
else
{
//
图片为空,则把这个位置的unit放入数组作为corner考虑
twoCornerArray.push(unitDown);
}
}
}
}
}