as3连连看游戏算法

这几天一直在忙的一个东西,因为时间的关系,只弄了主要的算法,计时,分数,划线,点击效果等内容都没有管=.=
先来看连连看的规则分析,这里将选中的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(){}
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值