这几天一直在忙的一个东西,因为时间的关系,只弄了主要的算法,计时,分数,划线,点击效果等内容都没有管=.=
先来看连连看的规则分析,这里将选中的2个Obj分3种情况来讨论,一是同位于X轴,二是同位于Y轴,三是不同X,Y轴。
而第三种情况其实又可以归结到第1和第2种情况,具体的操作是先判断是否同X,Y轴,是的话先检测能否直连,不能的话判断不直连的情况.
如果两者属于不同的X,Y轴,那么先判断通过一点连接,然后再判断通过两点连接的情况,这里图方便用了最烂的方法.
下边是针对示意图的分析:
对应图示的分析,假定objA和objB是不同的X,Y轴位置,那么可以从objA开始整列开始处到结束循环寻找到一点tmpA,如果objA和tmpA可以直连(testCrossAbleX()方法),那么判断tmpA和objB的拐点位置tmpB和tmpA的连通性(testCrossAbleY()方法),之后再判断tmpB和objB的连通性(testCrossAbleX()方法)和tmpB和objB是不是同一点。
其实最有效率的做法是从objA和objB两个中间的点开始检索,有兴趣的自己改吧…
Demo的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
|
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
var
PICWIDTHNUM:uint = 13;
var
PICHEIGHTNUM:uint = 10;
var
PICSIZE:uint = 40;
var
aryPic:Array = [1,2,3,4,5,6,7,8];
var
aryPicType:Array = [];
var
aryPath:Array = [];
var
aryCrossPath:Array = [];
var
WIDTHNUM:uint = PICWIDTHNUM + 2;
var
HEIGHTNUM:uint = PICHEIGHTNUM + 2;
var
PATHSIZE:uint = 40;
var
clkFlag:Boolean =
false
;
var
firstObj:Pic;
var
secondObj:Pic;
//生成路径图
setPath ();
function
setPath () {
for
(
var
i:uint=0; i < WIDTHNUM; i++) {
aryPath[i] = [];
for
(
var
j:uint=0; j < HEIGHTNUM; j++) {
var
path =
new
Path();
path.x = PATHSIZE * i;
path.y = PATHSIZE * j;
path.disX = i;
path.disY = j;
path.name =
"path"
+ path.disX * 8 + path.disY;
path.txt_disInfo.text =
"("
+ path.disX +
","
+ path.disY +
")"
;
if
(i ==0 || i == (WIDTHNUM - 1) || j == 0 || j ==(HEIGHTNUM - 1)) {
setCrossFlag (i,j,path,
true
);
}
else
{
setCrossFlag (i,j,path,
false
);
}
//trace(path.disX);
//trace(path.disY);
addChild (path);
}
}
//trace (aryPath);
}
//设置路径的可通过和不可通过crossFlag
function
setCrossFlag (i:uint,j:uint,path:Path,flag:Boolean) {
aryPath[i][j] = flag;
path.crossFlag = flag;
path.txt_CrossFlag.text = String(flag);
}
//生成图片数组并随机打乱
setTypeArray ();
function
setTypeArray () {
var
i:uint = 0;
while
(i < PICWIDTHNUM * PICHEIGHTNUM / 2) {
//picArray是图片数组
aryPicType.push (i % (aryPic.length) +1);
aryPicType.push (i % (aryPic.length) +1);
++i;
}
aryPicType = aryRandom(aryPicType);
}
//数组随机排列函数
function
aryRandom (ary:Array):Array {
var
ary_temp:Array =
new
Array();
for
(
var
i:int = ary.length; i > 0; i--) {
var
int_num:Number = int(Math.random() * ary.length);
ary_temp.push (ary[int_num]);
ary.splice (int_num, 1);
}
return
ary_temp;
}
//图片设置部分
initPic ();
var
startNum:uint = 0;
function
initPic () {
for
(
var
i:uint=0; i < PICWIDTHNUM; i++) {
for
(
var
j:uint=0; j < PICHEIGHTNUM; j++) {
setPic (i, j, aryPicType[startNum]);
startNum++;
}
}
}
//设置图片类型,位置,以及点击事件
function
setPic (i:uint, j:uint, type:uint) {
var
pic =
new
Pic();
pic.x = PATHSIZE + PICSIZE * i;
pic.y = PATHSIZE + PICSIZE * j;
pic.disX = i + 1;
pic.disY = j + 1;
pic.pType = type;
pic.name =
"pic"
+ pic.disX * 8 + pic.disY;
//trace(pic.name);
pic.txt_disInfo.text =
"("
+ pic.disX +
","
+ pic.disY +
")"
;
pic.gotoAndStop (type);
addChild (pic);
pic.addEventListener (MouseEvent.CLICK,picCLK);
}
//点击事件具体处理部分
function
picCLK (_evt:MouseEvent) {
//trace(_evt.currentTarget.name);
if
(! clkFlag) {
firstObj = _evt.currentTarget as Pic;
clkFlag =
true
;
}
else
if
(firstObj == (_evt.currentTarget as Pic)) {
//trace ("the same one");
/*firstObj = _evt.currentTarget as Pic;
clkFlag = true;*/
clkFlag =
true
;
}
else
{
secondObj = _evt.currentTarget as Pic;
if
(checkTwoObj()) {
matchSucc ();
}
else
{
matchFailed ();
}
aryCrossPath = [];
}
/*trace ("-------------------------------------------");
trace ("firstObj"+firstObj.pType);
trace ("secondObj"+secondObj.pType);
trace ("firstObj.disX"+firstObj.disX);
trace ("firstObj.disY"+firstObj.disY);
trace ("secondObj.disX"+secondObj.disX);
trace ("secondObj.disY"+secondObj.disY);
trace ("-------------------------------------------");*/
}
//判断firstObj和secondObj是否可以消除
function
checkTwoObj ():Boolean {
if
(matchTwoObj()) {
//trace ("same type");
if
(testCrossAbleXY(firstObj,secondObj)) {
return
true
;
}
}
return
false
;
}
function
matchFailed () {
firstObj = secondObj;
secondObj =
null
;
clkFlag =
true
;
//trace(aryCrossPath);
}
function
matchSucc () {
var
firstPathName =
"path"
+ firstObj.name.substr(3);
var
firstPath:Path = getChildByName(firstPathName) as Path;
var
secondPathName =
"path"
+ secondObj.name.substr(3);
var
secondPath:Path = getChildByName(secondPathName) as Path;
setCrossFlag (firstObj.disX,firstObj.disY,firstPath,
true
);
setCrossFlag (secondObj.disX,secondObj.disY,secondPath,
true
);
removeChild (firstObj);
removeChild (secondObj);
firstObj =
null
;
secondObj =
null
;
clkFlag =
false
;
drawLine(aryCrossPath);
//trace(aryCrossPath);
}
//连线函数
function
drawLine(_ary:Array){
//trace("drawLine");
var
lineSP:Shape =
new
Shape();
lineSP.graphics.beginFill(0x000000);
lineSP.graphics.lineStyle(1, 0x000000);
//lineSP.graphics.moveTo(_ary[0][0]*PICSIZE+0.5*PICSIZE,_ary[0][1]*PICSIZE+0.5*PICSIZE);
for
(
var
i:uint = 0; i<(_ary.length-1); i++){
lineSP.graphics.moveTo(_ary[i][0]*PICSIZE+0.5*PICSIZE,_ary[i][1]*PICSIZE+0.5*PICSIZE);
lineSP.graphics.lineTo(_ary[(i+1)][0]*PICSIZE+0.5*PICSIZE,_ary[(i+1)][1]*PICSIZE+0.5*PICSIZE);
//trace(_ary[i][0],_ary[i][1]);
}
lineSP.graphics.endFill();
addChild(lineSP);
setTimeout(clearLine,1000,lineSP);
}
//移除连线
function
clearLine(_lineSP:Shape){
_lineSP.graphics.clear();
}
//判断firstObj和secondObj是否是同一个类型的图,是返回true,不是返回false
function
matchTwoObj ():Boolean {
if
(firstObj.pType == secondObj.pType) {
return
true
;
}
else
{
return
false
;
}
}
//同一列方向(X相同时)的直接连通检测
function
testCrossAbleX (disX:uint, firstObjDisY:uint, secondObjDisY:uint):Boolean {
var
maxY = Math.max(firstObjDisY,secondObjDisY);
var
minY = Math.min(firstObjDisY,secondObjDisY);
if
((maxY - minY)>1) {
for
(
var
i:uint = minY+1; i< maxY; i++) {
if
(! aryPath[disX][i]) {
//trace ("testCrossAbleX failed");
return
false
;
}
}
}
//trace ("testCrossAbleX succ");
return
true
;
}
//同一行方向(Y相同时)的直接连通检测
function
testCrossAbleY (disY:uint, firstObjDisX:uint, secondObjDisX:uint):Boolean {
var
maxX = Math.max(firstObjDisX,secondObjDisX);
var
minX = Math.min(firstObjDisX,secondObjDisX);
if
((maxX - minX)>1) {
for
(
var
i:uint = minX+1; i< maxX; i++) {
if
(! aryPath[i][disY]) {
//trace ("testCrossAbleY failed");
return
false
;
}
}
}
//trace ("testCrossAbleY succ");
return
true
;
}
//firstObj和secondObj不同列也不同行时的检测
function
testCrossAbleXY (firstObj:Pic, secondObj:Pic):Boolean {
var
aryFlag1:Boolean =
false
;
var
aryFlag2:Boolean =
false
;
if
((firstObj.disX == secondObj.disX && testCrossAbleX(firstObj.disX,firstObj.disY,secondObj.disY)) || (firstObj.disY == secondObj.disY && testCrossAbleY(firstObj.disY,firstObj.disX,secondObj.disX))) {
var
aryP1:Array = [firstObj.disX,firstObj.disY];
var
aryP2:Array = [secondObj.disX,secondObj.disY];
aryCrossPath.push(aryP1);
aryCrossPath.push(aryP2);
return
true
;
}
else
{
for
(
var
i:uint = 0; i<HEIGHTNUM; i++) {
var
flagH1:Boolean;
var
flagH2:Boolean;
var
flagH3:Boolean;
if
(aryPath[firstObj.disX][i]) {
flagH1 = testCrossAbleX(firstObj.disX,i,firstObj.disY);
if
(i == secondObj.disY) {
flagH2 = testCrossAbleY(i,firstObj.disX,secondObj.disX);
}
else
{
flagH2 = aryPath[secondObj.disX][i] && testCrossAbleY(i,firstObj.disX,secondObj.disX);
}
flagH3 = testCrossAbleX(secondObj.disX,i,secondObj.disY);
//aryFlag1[i] = (testCrossAbleX(firstObj.disX,i,firstObj.disY) && aryPath[firstObj.disX][i]) && (testCrossAbleY(i,firstObj.disX,secondObj.disX) && aryPath[secondObj.disY][i]) && testCrossAbleX(secondObj.disX,i,secondObj.disY);
aryFlag1 = aryFlag1 || (flagH1 && flagH2 && flagH3);
if
(aryFlag1) {
var
aryPx1:Array = [firstObj.disX,firstObj.disY];
var
aryPx2:Array = [firstObj.disX,i];
var
aryPx3:Array = [secondObj.disX,i];
var
aryPx4:Array = [secondObj.disX,secondObj.disY];
aryCrossPath.push(aryPx1);
aryCrossPath.push(aryPx2);
aryCrossPath.push(aryPx3);
aryCrossPath.push(aryPx4);
return
true
;
}
}
}
for
(
var
j:uint = 0; j<WIDTHNUM; j++) {
var
flagW1:Boolean;
var
flagW2:Boolean;
var
flagW3:Boolean;
if
(aryPath[j][firstObj.disY]) {
flagW1 = testCrossAbleY(firstObj.disY,j,firstObj.disX);
if
(j == secondObj.disX) {
flagW2 = testCrossAbleX(j,firstObj.disY,secondObj.disY);
}
else
{
flagW2 = aryPath[j][secondObj.disY] && testCrossAbleX(j,firstObj.disY,secondObj.disY);
}
flagW3 = testCrossAbleY(secondObj.disY,j,secondObj.disX);
aryFlag2 = aryFlag2 || (flagW1 && flagW2 && flagW3);
if
(aryFlag2) {
var
aryPy1:Array = [firstObj.disX,firstObj.disY];
var
aryPy2:Array = [j,firstObj.disY];
var
aryPy3:Array = [j,secondObj.disY];
var
aryPy4:Array = [secondObj.disX,secondObj.disY];
aryCrossPath.push(aryPy1);
aryCrossPath.push(aryPy2);
aryCrossPath.push(aryPy3);
aryCrossPath.push(aryPy4);
return
true
;
}
}
}
}
aryCrossPath= [];
return
false
;
}
|
Pic类就是图片了,这里图方便我在库里丢了个元件弄了8桢,每桢画了不一样的颜色.
该类有3个属性,所在列数disX,所在行数disY,图片类型pType.
1
2
3
4
5
6
7
8
9
|
package{
import flash.display.MovieClip;
public class Pic extends MovieClip{
public
var
disX;
public
var
disY;
public
var
pType;
public
function
Pic(){}
}
|