网页版 连连看 html5实现

 

先上一张效果图:

 

用到的文件夹:

llk-img中用到的图片文件

主要算法(判断两个图片是否可以消掉):

1首先点击的两个图片是相同的图片。

2作一次横向扫描和一次纵向扫描,如果存在条路p上所以图片都为空(边界的图片都为空),那么p是一条通路,两个图片可以消掉

 

一点小技巧:用于 图片标签id 和 在二维数组中行列号 的转换:

llk中主要使用的交互函数:

1 给图片标签添加监听事件:

str_element="<img id="+(i*(n+2)+j)+" src="+imgpath+" onmousedown='myclick(event)' class='llk_layout_img'/>";

2 点击网页中小图片的时候根据点击事件的x坐标和y坐标找到被点击img标签对象的引用obj,在得到obj的id,

通过id转换成行列号从而确定被点击图片在二维数组中的位置。

function myclick(myevent)
{
 event.cancelBubble=true;
 obj=document.elementFromPoint(myevent.clientX,myevent.clientY);
 id_obj=obj.id;
 row=parseInt(id_obj/n);
 col=id_obj%n;

。。。

}

llk中使用的css:

llk.html文件的内容:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>红红连连看</title>
<script>
var num_cli=0;
var obj1,obj2,obj0;
var n=6;
var imgdir="llk-img/";
function initial()
{
    
    document.write("<link href='llk-css/outstyle.css' rel='stylesheet' type='text/css' />");
    document.write("<div  id='debug_info'><h1 >  debug imformation </h1></div>");
    document.write("<div  id='llk_layout'>");
    var i, j;
    //生成连连看布局
    for(i=0;i<=n+1;i++)
    {
        for(j=0;j<=n+1;j++)
        {
            k=parseInt(10*Math.random());
            imgpath=imgdir+k+".jpg";
            str_element="<img id="+(i*(n+2)+j)+" src="+imgpath+" onmousedown='myclick(event)' class='llk_layout_img'/>";
            if(i==0||j==0||i==n+1||j==n+1)
                str_element="<img id="+(i*(n+2)+j)+" src='llk-img/20.gif' width=0 height=0 dispaly='hidden'/>";
            document.write(str_element);
        }
        document.write("<br/>");
    }
    //声音
    document.write("</div>");
    //声音1,消掉两个相同图片
    document.write("<audio id='audio_choral1' src='llk-sound/boom.ogg' >the browser doesn't support</audio>");
    //声音2,按错提示音
    document.write("<audio id='audio_choral2' src='llk-sound/boom2.ogg' >the browser doesn't support</audio>");
    //设置背景音乐
    document.write("<br/><audio id='mybgsound'src='llk-music/take-me-away.mp3' autoplay='autoplay' volume=0.2 controls >the browser doesn't support</audio>");
    //设置背景音乐声音
    document.getElementById("mybgsound").volume=0.2;
    obj0=document.getElementById(0);  
    //document.write("<embed height='150' width='310' src='llk-music/1.mp3' />");
}
//处理点击事件
function myclick(myevent)
{
    //alert("myclick myevent");
    //得到被点击的对象
    event.cancelBubble=true; 
    obj=document.elementFromPoint(myevent.clientX,myevent.clientY);
    id_obj=obj.id;
    //得到点击对象的行号与列号 并给出提示信息
    row=parseInt(id_obj/n);
    col=id_obj%n;
    document.getElementById("debug_info").innerHTML = row + " " + col + "; " + obj + " name:" + obj.name + " id:" + obj.id + " x:" + myevent.clientX + " y:" + myevent.clientY + " " + obj.src;
    if (obj.src == obj0.src)
    {return;}
    //判断当前是第几次点击
    if(num_cli==0)//点击的第1张图片,设置为点击状态
    {
        obj1=obj;
        num_cli=1;
        //obj1.class="img_selected";
    }
    else//点击的是第二张图片,送入判断逻辑
    {
        obj2=obj;
        num_cli = 0;
        if (obj2 == obj1)
            return;
        res=judgeSame(obj1,obj2);
        //alert(res);
        soundRespond(res);
        if(res==1)
        {
            obj1.src=obj0.src;
            obj2.src=obj0.src;//"p.jpg";
        }
        //judgeHealth();
    }
    judgeHealth();
}
function mymin(num1,num2)
{
    if(num1<num2)
        return num1;
    return num2;
}
function mymax(num1,num2)
{
    if(num1>num2)
        return num1;
    return num2;
}
function judgeHealth()
{
    //alert("judgeHealth");
    flagGameOver=1;
    for(i=1;i<=n;i++)
    {
        if(flagGameOver==0)
            break;
        for(j=1;j<=n;j++)
        {
            tempId=i*(n+2)+j;
            tempObj=document.getElementById(tempId);
            if(tempObj.src!=obj0.src)
            {
                flagGameOver=0;
                break;
            }
        }
    }
    if(flagGameOver==1)
    {alert("恭喜过关");retun ;}
    //还没有过关,判断棋盘是否健康(有图可消)
    flagGameHealthy=0;
    for(i=1;i<=n;i++)
    {
        if(flagGameHealthy==1)
            return 1;//break;
        for(j=1;j<=n;j++)
        {
            tempId1=i*(n+2)+j;
            tempObj1=document.getElementById(tempId1);
            if(tempObj1.src==obj0.src)
                continue;
            for(ii=i;ii<=n;ii++)
            {
                for(jj=1;jj<=n;jj++)
                {
                    if(ii==i&&jj==j)
                        continue;
                    tempId2=ii*(n+2)+jj;
                    tempObj12=document.getElementById(tempId2);
                    if(tempObj1.src==obj0.src)
                          continue;
                     if(judgeSame(tempObj1,tempObj12)==1)
                    {
                        flagGameHealthy=1;
                        return 1;
                    }
                }
            }
        }
    }
    if(flagGameHealthy==0)
    {
        //alert("没有可以消掉的图片");
        shuffle();
        judgeHealth();       
    }
}
function shuffle() {
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n; j++) {
            tempId = i * (n + 2) + j;
            tempObj = document.getElementById(tempId);
            if (tempObj.src != obj0.src) {
                k=parseInt(10*Math.random());
                imgpath=imgdir+k+".jpg";
               tempObj.src=imgpath;
            }
        }
    }
}
//判断两张图片是否可以消掉
function judgeSame(o1, o2) 
{
   //两张图片必须是同样的图片    
   if(o1.src!=o2.src)
   {
        return 0;
   }
   row1=parseInt(o1.id/(n+2));
   col1=parseInt(o1.id%(n+2));
   row2=parseInt(o2.id/(n+2));
   col2=parseInt(o2.id%(n+2));
   
   obj0=document.getElementById(0);
   //判断两张图片是否可以通过某一行可达

   throughFlag = 0;
   for(row=0;row<=n+1;row++)
   {
        //两个图片都可以列到达row行,设标志位flag,=1表示可达,=0表示不可达
        flag=1;
        //第row行,列通过
        for(col=mymin(col1,col2);col<=mymax(col1,col2);col++)
        {
            if(row==row1&&col==col1)
                continue;
            if(row==row2&&col==col2)
                continue;
            //路径上的一个图片,图片的行号为row,列号为col
            cur_id=(n+2)*row+col;
            obj=document.getElementById(cur_id);
            //该位置不为空
            if(obj.src!=obj0.src)
            {flag=0;break;}
        }
        if(flag==0)
            continue;
        //第row行,1列通过
        for(row_temp = mymin(row, row1); row_temp <= mymax(row, row1); row_temp++)
        {
            if(row_temp==row1)
                continue;
            cur_id=(n+2)*row_temp+col1;
            obj=document.getElementById(cur_id);
            if(obj.src!=obj0.src)
            {flag=0;break;}
        }
        if(flag==0)
            continue;
        //第row行,2列通过
        for (row_temp = mymin(row, row2); row_temp <= mymax(row, row2); row_temp++)
        {
            if(row_temp==row2)
                continue;
            cur_id=(n+2)*row_temp+col2;
            obj=document.getElementById(cur_id);
            if(obj.src!=obj0.src)
            {flag=0;break;}
        }
        //找到一条可行路径
        if(flag==1)
        {
            throughFlag = 1;
            return 1;
            //break;
        }    
   }
   //行列转换再次判断
   col1=parseInt(o1.id/(n+2));
   row1=parseInt(o1.id%(n+2));
   col2=parseInt(o2.id/(n+2));
   row2=parseInt(o2.id%(n+2));
   for(row=0;row<=n+1;row++)
   {
        flag=1;
        for(col=mymin(col1,col2);col<=mymax(col1,col2);col++)
        {
            if(row==row1&&col==col1)
                continue;
            if(row==row2&&col==col2)
                continue;
            cur_id=(n+2)*col+row;
            obj=document.getElementById(cur_id);
            if(obj.src!=obj0.src)
            {flag=0;break;}
        }
        if(flag==0)
            continue;
        for(row_temp=mymin(row,row1);row_temp<=mymax(row,row1);row_temp++)
        {
            if(row_temp==row1)
                continue;
            cur_id=(n+2)*col1+row_temp;
            obj=document.getElementById(cur_id);
            if(obj.src!=obj0.src)
            {flag=0;break;}
        }
        if(flag==0)
            continue;
        for(row_temp=mymin(row,row2);row_temp<=mymax(row,row2);row_temp++)
        {
            if(row_temp==row2)
                continue;
            cur_id=(n+2)*col2+row_temp;
            obj=document.getElementById(cur_id);
            if(obj.src!=obj0.src)
            {flag=0;break;}
        }
        if(flag==1)
        {
            throughFlag = 1;
            return 1;
            break;
        }    
   }
   return 0;
}
function soundRespond(flagThrough)
{
    var tempaudio;
    if(flagThrough==0)
        tempaudio=document.getElementById("audio_choral2");
    else
        tempaudio=document.getElementById("audio_choral1");
    tempaudio.currentTime=0;
    tempaudio.play();
}
</script>
</head>
<body onload="initial()" >
</body>
</html>

 new code,增加了健康检查。

  1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2 <html xmlns="http://www.w3.org/1999/xhtml">
  3 <head>
  4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5 <title>红红连连看</title>
  6 <script>
  7 var num_cli=0;
  8 var obj1,obj2,obj0;
  9 var n=6;
 10 var imgdir="llk-img/";
 11 function initial()
 12 {
 13     
 14     document.write("<link href='llk-css/outstyle.css' rel='stylesheet' type='text/css' />");
 15     document.write("<div  id='debug_info'><h1 >  debug imformation </h1></div>");
 16     document.write("<div  id='llk_layout'>");
 17     var i, j;
 18     //生成连连看布局
 19     for(i=0;i<=n+1;i++)
 20     {
 21         for(j=0;j<=n+1;j++)
 22         {
 23             k=parseInt(10*Math.random());
 24             imgpath=imgdir+k+".jpg";
 25             str_element="<img id="+(i*(n+2)+j)+" src="+imgpath+" onmousedown='myclick(event)' class='llk_layout_img'/>";
 26             if(i==0||j==0||i==n+1||j==n+1)
 27                 str_element="<img id="+(i*(n+2)+j)+" src='llk-img/20.gif' width=0 height=0 dispaly='hidden'/>";
 28             document.write(str_element);
 29         }
 30         document.write("<br/>");
 31     }
 32     //声音
 33     document.write("</div>");
 34     //声音1,消掉两个相同图片
 35     document.write("<audio id='audio_choral1' src='llk-sound/boom.ogg' >the browser doesn't support</audio>");
 36     //声音2,按错提示音
 37     document.write("<audio id='audio_choral2' src='llk-sound/boom2.ogg' >the browser doesn't support</audio>");
 38     //设置背景音乐
 39     document.write("<br/><audio id='mybgsound'src='llk-music/take-me-away.mp3' autoplay='autoplay' volume=0.2 controls >the browser doesn't support</audio>");
 40     //设置背景音乐声音
 41     document.getElementById("mybgsound").volume=0.2;
 42     obj0=document.getElementById(0);  
 43     //document.write("<embed height='150' width='310' src='llk-music/1.mp3' />");
 44 }
 45 //处理点击事件
 46 function myclick(myevent)
 47 {
 48     //alert("myclick myevent");
 49     //得到被点击的对象
 50     event.cancelBubble=true; 
 51     obj=document.elementFromPoint(myevent.clientX,myevent.clientY);
 52     id_obj=obj.id;
 53     //得到点击对象的行号与列号 并给出提示信息
 54     row=parseInt(id_obj/n);
 55     col=id_obj%n;
 56     document.getElementById("debug_info").innerHTML = row + " " + col + "; " + obj + " name:" + obj.name + " id:" + obj.id + " x:" + myevent.clientX + " y:" + myevent.clientY + " " + obj.src;
 57     if (obj.src == obj0.src)
 58     {return;}
 59     //判断当前是第几次点击
 60     if(num_cli==0)//点击的第1张图片,设置为点击状态
 61     {
 62         obj1=obj;
 63         num_cli=1;
 64         //obj1.class="img_selected";
 65     }
 66     else//点击的是第二张图片,送入判断逻辑
 67     {
 68         obj2=obj;
 69         num_cli = 0;
 70         if (obj2 == obj1)
 71             return;
 72         res=judgeSame(obj1,obj2);
 73         //alert(res);
 74         soundRespond(res);
 75         if(res==1)
 76         {
 77             obj1.src=obj0.src;
 78             obj2.src=obj0.src;//"p.jpg";
 79         }
 80         //judgeHealth();
 81     }
 82     judgeHealth();
 83 }
 84 function mymin(num1,num2)
 85 {
 86     if(num1<num2)
 87         return num1;
 88     return num2;
 89 }
 90 function mymax(num1,num2)
 91 {
 92     if(num1>num2)
 93         return num1;
 94     return num2;
 95 }
 96 function judgeHealth()
 97 {
 98     //alert("judgeHealth");
 99     flagGameOver=1;
100     for(i=1;i<=n;i++)
101     {
102         if(flagGameOver==0)
103             break;
104         for(j=1;j<=n;j++)
105         {
106             tempId=i*(n+2)+j;
107             tempObj=document.getElementById(tempId);
108             if(tempObj.src!=obj0.src)
109             {
110                 flagGameOver=0;
111                 break;
112             }
113         }
114     }
115     if(flagGameOver==1)
116     {alert("恭喜过关");retun ;}
117     //还没有过关,判断棋盘是否健康(有图可消)
118     flagGameHealthy=0;
119     for(i=1;i<=n;i++)
120     {
121         if(flagGameHealthy==1)
122             return 1;//break;
123         for(j=1;j<=n;j++)
124         {
125             tempId1=i*(n+2)+j;
126             tempObj1=document.getElementById(tempId1);
127             if(tempObj1.src==obj0.src)
128                 continue;
129             for(ii=i;ii<=n;ii++)
130             {
131                 for(jj=1;jj<=n;jj++)
132                 {
133                     if(ii==i&&jj==j)
134                         continue;
135                     tempId2=ii*(n+2)+jj;
136                     tempObj12=document.getElementById(tempId2);
137                     if(tempObj1.src==obj0.src)
138                           continue;
139                      if(judgeSame(tempObj1,tempObj12)==1)
140                     {
141                         flagGameHealthy=1;
142                         return 1;
143                     }
144                 }
145             }
146         }
147     }
148     if(flagGameHealthy==0)
149     {
150         //alert("没有可以消掉的图片");
151         shuffle();
152         judgeHealth();       
153     }
154 }
155 function shuffle() {
156     for (i = 1; i <= n; i++) {
157         for (j = 1; j <= n; j++) {
158             tempId = i * (n + 2) + j;
159             tempObj = document.getElementById(tempId);
160             if (tempObj.src != obj0.src) {
161                 k=parseInt(10*Math.random());
162                 imgpath=imgdir+k+".jpg";
163                tempObj.src=imgpath;
164             }
165         }
166     }
167 }
168 //判断两张图片是否可以消掉
169 function judgeSame(o1, o2) 
170 {
171    //两张图片必须是同样的图片    
172    if(o1.src!=o2.src)
173    {
174         return 0;
175    }
176    row1=parseInt(o1.id/(n+2));
177    col1=parseInt(o1.id%(n+2));
178    row2=parseInt(o2.id/(n+2));
179    col2=parseInt(o2.id%(n+2));
180    
181    obj0=document.getElementById(0);
182    //判断两张图片是否可以通过某一行可达
183 
184    throughFlag = 0;
185    for(row=0;row<=n+1;row++)
186    {
187         //两个图片都可以列到达row行,设标志位flag,=1表示可达,=0表示不可达
188         flag=1;
189         //第row行,列通过
190         for(col=mymin(col1,col2);col<=mymax(col1,col2);col++)
191         {
192             if(row==row1&&col==col1)
193                 continue;
194             if(row==row2&&col==col2)
195                 continue;
196             //路径上的一个图片,图片的行号为row,列号为col
197             cur_id=(n+2)*row+col;
198             obj=document.getElementById(cur_id);
199             //该位置不为空
200             if(obj.src!=obj0.src)
201             {flag=0;break;}
202         }
203         if(flag==0)
204             continue;
205         //第row行,1列通过
206         for(row_temp = mymin(row, row1); row_temp <= mymax(row, row1); row_temp++)
207         {
208             if(row_temp==row1)
209                 continue;
210             cur_id=(n+2)*row_temp+col1;
211             obj=document.getElementById(cur_id);
212             if(obj.src!=obj0.src)
213             {flag=0;break;}
214         }
215         if(flag==0)
216             continue;
217         //第row行,2列通过
218         for (row_temp = mymin(row, row2); row_temp <= mymax(row, row2); row_temp++)
219         {
220             if(row_temp==row2)
221                 continue;
222             cur_id=(n+2)*row_temp+col2;
223             obj=document.getElementById(cur_id);
224             if(obj.src!=obj0.src)
225             {flag=0;break;}
226         }
227         //找到一条可行路径
228         if(flag==1)
229         {
230             throughFlag = 1;
231             return 1;
232             //break;
233         }    
234    }
235    //行列转换再次判断
236    col1=parseInt(o1.id/(n+2));
237    row1=parseInt(o1.id%(n+2));
238    col2=parseInt(o2.id/(n+2));
239    row2=parseInt(o2.id%(n+2));
240    for(row=0;row<=n+1;row++)
241    {
242         flag=1;
243         for(col=mymin(col1,col2);col<=mymax(col1,col2);col++)
244         {
245             if(row==row1&&col==col1)
246                 continue;
247             if(row==row2&&col==col2)
248                 continue;
249             cur_id=(n+2)*col+row;
250             obj=document.getElementById(cur_id);
251             if(obj.src!=obj0.src)
252             {flag=0;break;}
253         }
254         if(flag==0)
255             continue;
256         for(row_temp=mymin(row,row1);row_temp<=mymax(row,row1);row_temp++)
257         {
258             if(row_temp==row1)
259                 continue;
260             cur_id=(n+2)*col1+row_temp;
261             obj=document.getElementById(cur_id);
262             if(obj.src!=obj0.src)
263             {flag=0;break;}
264         }
265         if(flag==0)
266             continue;
267         for(row_temp=mymin(row,row2);row_temp<=mymax(row,row2);row_temp++)
268         {
269             if(row_temp==row2)
270                 continue;
271             cur_id=(n+2)*col2+row_temp;
272             obj=document.getElementById(cur_id);
273             if(obj.src!=obj0.src)
274             {flag=0;break;}
275         }
276         if(flag==1)
277         {
278             throughFlag = 1;
279             return 1;
280             break;
281         }    
282    }
283    return 0;
284 }
285 function soundRespond(flagThrough)
286 {
287     var tempaudio;
288     if(flagThrough==0)
289         tempaudio=document.getElementById("audio_choral2");
290     else
291         tempaudio=document.getElementById("audio_choral1");
292     tempaudio.currentTime=0;
293     tempaudio.play();
294 }
295 </script>
296 </head>
297 <body onload="initial()" >
298 </body>
299 </html>
View Code

 

posted @ 2013-09-03 20:09  黄QQ  阅读(3852)  评论(0编辑  收藏  举报