连连看算法实现web版

假期闲来无事,写了一个连连看,基本思想是:

1.先找直线可以连接消除的,边缘的如果中间有图片也能消除;

2.找转一个弯可以消除的(A和B),看是否存在一个点C既可以和A消除又可以跟B消除;

3.找转两个弯可以消除的(A和B),看是否存在一个点C既可以和A转个弯消除,又可以和B直线消除;

代码如下(代码不多,所以注释就省略了,莫喷,图片无法提供下载所以就都贴到上面去了,右键另存为吧),希望高手能指点,如果有更好的算法一起分享。

感谢 @key yao 找到的bug,代码更新了,欢迎指出新的bug。

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta charset="utf-8">
  5         <title>连连看</title>
  6         <style>
  7             body,div{
  8                 margin:0;
  9                 padding:0;
 10             }
 11             body{
 12                 text-align:center;
 13             }
 14             #wrapper{
 15                 position:absolute;
 16                 top:50%;
 17                 left:50%;
 18                 margin-top:-240px;
 19                 margin-left:-240px;
 20                 width:480px;
 21                 height:480px;
 22             }
 23             #canvas{
 24                 background-color:gray;
 25             }
 26         </style>
 27     </head>
 28     <body>
 29         <div id="wrapper"></div>
 30         <script type="text/javascript">
 31             (function(){
 32                 var LinkGame = {
 33                     filePath : "images/",
 34                     level : 1,
 35                     images : ["1.gif","2.gif","3.gif","4.gif","5.gif","6.gif","7.gif","8.gif","9.gif","10.gif","11.gif","12.gif","13.gif","14.gif","15.gif","16.gif","17.gif","18.gif","19.gif","20.gif"],
 36                     init : function(){
 37                         var that = this;
 38                         that.createPanel(3);
 39                         that.bindEvent();
 40                     },
 41                     //level: 1(4*4) 2(8*8) 3(12*12)
 42                     createPanel : function(level){
 43                         if(level > 3){
 44                             return;
 45                         }
 46                         var that = this,
 47                             wrapper = document.getElementById("wrapper"),
 48                             count = 16*level*level,
 49                             content = "<div id='canvas' style='width:"+4*level*35+"px;height:"+4*level*39+"px'>",
 50                             contentArr = [],
 51                             randomImg = 0,
 52                             randomIndex = 0,
 53                             position = [];
 54                         that.level = level;
 55                         for(var i = 0;i < count;i++){
 56                             if(i % 2 == 0){
 57                                 randomImg=parseInt(Math.random()*19);
 58                             }
 59                             contentArr.push(" style='width:35px;height:39px;float:left;cursor:pointer' class='image"+randomImg+"'><img src='"+that.filePath+that.images[randomImg]+"'/></div>");
 60                         }
 61                         for(var j = 0;j < count;j++){
 62                             randomIndex=parseInt(Math.random()*contentArr.length);
 63                             //row column
 64                             position = [parseInt(j/(level*4)),j%(level*4)];
 65                             content += "<div id='position_"+position[0]+"_"+position[1]+"'"+contentArr.splice(randomIndex,1);
 66                         }
 67                         content += "</div>";
 68                         wrapper.innerHTML=content;
 69                     },
 70                     bindEvent : function(){
 71                         var target = null,
 72                             clickTime = 0,
 73                             that = this,
 74                             wrapper = document.getElementById("wrapper"),
 75                             canvas = document.getElementById("canvas"),
 76                             elem1 = null,
 77                             elem2 = null,
 78                             parent1 = null,
 79                             parent2 = null,
 80                             islink = false,
 81                             tagname;
 82                         helper.addEventHandler(canvas,'click',function(e){
 83                             e = e || window.event;
 84                             if(e.target){
 85                                 target = e.target;
 86                             }else{
 87                                 target = e.srcElement;
 88                             }
 89                             tagName = target.tagName;
 90                             if(tagName != "IMG"){
 91                                 return;
 92                             }
 93                             if(clickTime == 2){
 94                                 clickTime = 0;
 95                                 elem1 = null;
 96                                 elem2 = null;
 97                             }
 98                             
 99                             if(clickTime == 0){
100                                 elem1 = target;
101                                 parent1 = elem1.parentNode;
102                                 parent1.setAttribute("clicked","clicked");
103                                 parent1.style.outline='1px solid red';
104                             }else{
105                                 elem2 = target;
106                                 parent2 = elem2.parentNode;
107                                 if(parent1.getAttribute('id') == parent2.getAttribute('id')){
108                                     clickTime = 0;
109                                     parent1.setAttribute("clicked","");
110                                     parent1.style.outline='';
111                                     elem1 = null;
112                                     elem2 = null;
113                                     return;
114                                 }
115                                 parent2.style.outline='1px solid red';
116                                 islink = that.isLink(parent1,parent2);
117                                 if(islink){
118                                     that.removeLinked(parent1,parent2);
119                                 }else{
120                                     that.cancelLinked(parent1,parent2);
121                                 }
122                                 parent1.style.outline='';
123                                 parent2.style.outline='';
124                             }
125                             clickTime++;
126                             
127                         });
128                     },
129                     isLink : function(elem1,elem2){
130                         var that = this;
131                         if(!that.isSameImg(elem1,elem2)){
132                             return false;
133                         }
134                         var    islink = that.isOneDerictLine(elem1,elem2) || that.isTwoLine(elem1,elem2) || that.isThreeLine(elem1,elem2);    
135                         return islink;
136                     },
137                     isOneDerictLine : function(elem1,elem2){
138                         var elem1Id = elem1.getAttribute('id'),
139                             elem2Id = elem2.getAttribute('id'),
140                             elem1Row = elem1Id.split("_")[1],
141                             elem2Row = elem2Id.split("_")[1],
142                             elem1Column = elem1Id.split("_")[2],
143                             elem2Column = elem2Id.split("_")[2];
144                         if(elem1Id == elem2Id){
145                             return false;
146                         }
147                         var that = this;    
148                         if(elem1Row == elem2Row){
149                             if(elem1Row == 0 || elem1Row == (that.level*4-1)){
150                                 return true;
151                             }else{
152                                 var dValue = Math.abs(elem1Column-elem2Column);
153                                 if(dValue == 1){
154                                     return true;
155                                 }else{
156                                     var minValue = Math.min(elem1Column,elem2Column);
157                                     var maxValue = Math.max(elem1Column,elem2Column);
158                                     var tempElem = null;
159                                     for(var i=1;i<maxValue-minValue;i++){
160                                         tempElem = document.getElementById("position_"+elem1Row+"_"+(minValue+i)+"");
161                                         //alert("position_"+elem1Row+"_"+(minValue+i)+"");
162                                         if(tempElem.childNodes.length > 0){
163                                             return false;
164                                         }
165                                     }
166                                     return true;
167                                 }
168                             }
169                             
170                         }else if( elem1Column == elem2Column){
171                             if(elem1Column == 0 || elem1Column == (that.level*4-1)){
172                                 return true;
173                             }else{
174                                 var minValue = Math.min(elem1Row,elem2Row);
175                                 var maxValue = Math.max(elem1Row,elem2Row);
176                                 var tempElem = null;
177                                 for(var i=1;i<(maxValue-minValue);i++){
178                                     tempElem = document.getElementById("position_"+(minValue+i)+"_"+elem1Column+"");
179                                     if(tempElem.childNodes.length > 0){
180                                         return false;
181                                     }
182                                 }
183                                 return true;
184                             }
185                         }else{
186                             return false;
187                         }
188                         
189                     },
190                     isOneLine : function(elem1,elem2){
191                         var elem1Id = elem1.getAttribute('id'),
192                             elem2Id = elem2.getAttribute('id'),
193                             elem1Row = elem1Id.split("_")[1],
194                             elem2Row = elem2Id.split("_")[1],
195                             elem1Column = elem1Id.split("_")[2],
196                             elem2Column = elem2Id.split("_")[2];
197                         var that = this;    
198                         if(elem1Id == elem2Id){
199                             return true;
200                         }
201                         if(elem1Row == elem2Row){
202                             var dValue = Math.abs(elem1Column-elem2Column);
203                             if(dValue == 1){
204                                 return true;
205                             }else{
206                                 var minValue = Math.min(elem1Column,elem2Column);
207                                 var maxValue = Math.max(elem1Column,elem2Column);
208                                 var tempElem = null;
209                                 for(var i=1;i<maxValue-minValue;i++){
210                                     tempElem = document.getElementById("position_"+elem1Row+"_"+(minValue+i)+"");
211                                     //alert("position_"+elem1Row+"_"+(minValue+i)+"");
212                                     if(tempElem.childNodes.length > 0){
213                                         return false;
214                                     }
215                                 }
216                                 return true;
217                             }        
218                         }else if( elem1Column == elem2Column){
219                             var minValue = Math.min(elem1Row,elem2Row);
220                             var maxValue = Math.max(elem1Row,elem2Row);
221                             var tempElem = null;
222                             for(var i=1;i<(maxValue-minValue);i++){
223                                 tempElem = document.getElementById("position_"+(minValue+i)+"_"+elem1Column+"");
224                                 if(tempElem.childNodes.length > 0){
225                                     return false;
226                                 }
227                             }
228                             return true;        
229                         }else{
230                             return false;
231                         }
232                         
233                     },
234                     isTwoLine : function(elem1,elem2){
235                         var    that = this,
236                             elem1Id = elem1.getAttribute('id'),
237                             elem2Id = elem2.getAttribute('id'),
238                             elem1Row = elem1Id.split("_")[1],
239                             elem2Row = elem2Id.split("_")[1],
240                             elem1Column = elem1Id.split("_")[2],
241                             elem2Column = elem2Id.split("_")[2];
242                         var tempElem1Id = "position_"+elem1Row+"_"+elem2Column+"";
243                         var tempElem2Id = "position_"+elem2Row+"_"+elem1Column+"";
244                         var tempElem1 = document.getElementById(tempElem1Id);
245                         var tempElem2 = document.getElementById(tempElem2Id);
246                         if((tempElem1.childNodes.length == 0 && that.isOneLine(tempElem1,elem1) && that.isOneLine(tempElem1,elem2))||(tempElem2.childNodes.length == 0 && that.isOneLine(tempElem2,elem1) && that.isOneLine(tempElem2,elem2))){
247                             return true;
248                         }else{
249                             return false;
250                         }
251                     },
252                     isThreeLine : function(elem1,elem2){
253                         var    that = this,
254                             elem1Id = elem1.getAttribute('id'),
255                             elem2Id = elem2.getAttribute('id'),
256                             elem1Row = elem1Id.split("_")[1],
257                             elem2Row = elem2Id.split("_")[1],
258                             elem1Column = elem1Id.split("_")[2],
259                             elem2Column = elem2Id.split("_")[2],
260                             tempElem1,
261                             tempElem2;
262                         for(var i = 0;i < (that.level)*4;i++){
263                             tempElem1 = document.getElementById("position_"+elem1Row+"_"+i+"");
264                             tempElem2 = document.getElementById("position_"+i+"_"+elem1Column+"");
265                             if(that.isOneLine(tempElem1,elem1) && that.isTwoLine(tempElem1,elem2) && tempElem1.childNodes.length == 0){
266                                 return true;
267                             }else if(that.isOneLine(tempElem2,elem1) && that.isTwoLine(tempElem2,elem2) && tempElem2.childNodes.length == 0){
268                                 return true;
269                             }
270                         }
271                         var isOneLineLeft = that.isOneLine(document.getElementById("position_"+elem1Row+"_0"),elem1)&&
272                                            that.isOneLine(document.getElementById("position_"+elem2Row+"_0"),elem2) &&
273                                            (elem1.getAttribute('id') == ("position_"+elem1Row+"_0") || document.getElementById("position_"+elem1Row+"_0").childNodes.length == 0)&&
274                                            (elem2.getAttribute('id') == ("position_"+elem2Row+"_0") || document.getElementById("position_"+elem2Row+"_0").childNodes.length == 0);
275                         var isOneLineRight = that.isOneLine(document.getElementById("position_"+elem1Row+"_"+(that.level*4-1)+""),elem1)&&
276                                             that.isOneLine(document.getElementById("position_"+elem2Row+"_"+(that.level*4-1)+""),elem2)&&
277                                             (elem1.getAttribute('id') == ("position_"+elem1Row+"_"+(that.level*4-1)+"") || document.getElementById("position_"+elem1Row+"_"+(that.level*4-1)+"").childNodes.length == 0) &&
278                                             (elem2.getAttribute('id') == ("position_"+elem2Row+"_"+(that.level*4-1)+"") || document.getElementById("position_"+elem2Row+"_"+(that.level*4-1)+"").childNodes.length == 0);
279                         var isOneLineTop =  that.isOneLine(document.getElementById("position_0_"+elem1Column+""),elem1) &&
280                                            that.isOneLine(document.getElementById("position_0_"+elem2Column+""),elem2) &&
281                                            (elem1.getAttribute('id') == ("position_0_"+elem1Column+"") || document.getElementById("position_0_"+elem1Column+"").childNodes.length == 0) &&
282                                            (elem2.getAttribute('id') == ("position_0_"+elem2Column+"") || document.getElementById("position_0_"+elem2Column+"").childNodes.length == 0);
283                         var isOneLineBottom = that.isOneLine(document.getElementById("position_"+(that.level*4-1)+"_"+elem1Column+""),elem1) &&
284                                              that.isOneLine(document.getElementById("position_"+(that.level*4-1)+"_"+elem2Column+""),elem2) &&
285                                              (elem1.getAttribute('id') == ("position_"+(that.level*4-1)+"_"+elem1Column+"") || document.getElementById("position_"+(that.level*4-1)+"_"+elem1Column+"").childNodes.length == 0) &&
286                                              (elem2.getAttribute('id') == ("position_"+(that.level*4-1)+"_"+elem2Column+"") || document.getElementById("position_"+(that.level*4-1)+"_"+elem2Column+"").childNodes.length == 0);                   
287                         if(isOneLineLeft || isOneLineRight || isOneLineTop || isOneLineBottom){
288                             return true;
289                         }else{
290                             return false;
291                         }
292                     },
293                     removeLinked : function(elem1,elem2){
294                         elem1.style.cursor = "auto";
295                         elem2.style.cursor = "auto";
296                         elem1.removeChild(elem1.firstChild);
297                         elem2.removeChild(elem2.firstChild);
298                     },
299                     isSameImg : function(elem1,elem2){
300                         return elem1.getAttribute('class') == elem2.getAttribute('class');
301                     },
302                     cancelLinked : function(elem1,elem2){}
303                 };
304                 var helper = {
305                     addEventHandler : function (oElement, sEvent, fnHandler) {
306                         oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler)    
307                     }
308                 }
309                 
310                 LinkGame.init();
311             })();
312         </script>
313     </body>
314 </html>

 

 

posted @ 2013-04-08 11:43  _蜡人  阅读(1759)  评论(15编辑  收藏  举报