30多行js代码写一个M*N拼图游戏

来源:未知 责任编辑:智问网络 发表时间:2013-11-04 19:50 点击:

刚写过一篇《20多行js代码写一个最简单的3x3拼图游戏》,受zswang的启发下改进了代码,现在做了一个任意M行N列(M,N大于等于2)的拼图,js代码30多行。

先上图:

 

玩法:方向键,不用解释了。

直接体验就轻轻点击这里。


保证拼图有解的方法主要有2种:

1.从结局开始移动若干次,浅显易懂,但是空格不在末尾了,如果要把空格移回末尾,还要多两个循环;

2.用算法检测随机开局是否有解,如果无解则调整为有解或重新开局。

本篇采用了方法2,使用的算法叫做“逆序和”,保证有解、且空格在末尾。

 

关于开局的生成方法有3种:

1.数组随机排序。

2.模拟洗牌算法。

3.从结局开始进行若干次随机方向的移动。


本篇使用算法2,《20多行js代码写一个最简单的3x3拼图游戏》使用的是算法1,zswang的拼图使用算法3。

数组随机排序的效率可能不好,所以改成模拟洗牌算法,循环随机交换。

另外,我加上了很方便的layout()和replay()函数,可以立即重新开始、立即切换布局。


<div id="t1" style="border:1px solid black; padding:5px; display:inline-block;"></div> 
<script> 
var t1=document.getElementById("t1"); 
function layout(M,N){ 
    R=M; C=N; r=R-1; c=C-1; D=[]; n=R*C-1; 
    w = (n+'').length; 
    rgx = new RegExp('(.{'+(w*C+c-1)+'}),','g'); 
    space = new Array(w+1).join('_'); 
    zero = new Array(w).join(0); 
    replay(); 

function replay(){ 
    i=n; 
    while(i--){ 
        D[i]=(zero+(i+1)).slice(-w); 
    } 
    D[n] = space; 
    ok = D+''; 
    while(++i<n){ 
        j=D[rnd = Math.random()*(n-1)|0]; 
        D[rnd]=D[i]; 
        D[i]=j; 
    } 
    for(i=0,k=0;i<n;i++) 
        for(j=i+1;j<n;j++) 
            D[i]>D[j] && (k=1-k); 
    k && (i=D[n-2]) && (D[n-2]=D[n-1]) && (D[n-1]=i); 
    t1.innerHTML = (D+'').replace(rgx,'$1<br>'); 

function move(dir){ 
    if (dir>=0&&dir<4) { 
        k = [[0,1],[1,0],[0,-1],[-1,0]][dir], rr2 = r+k[0], cc2 = c+k[1]; 
        if (r2+1 && r2<R && c2+1 && c2<C) 
        return D[r*C+c] = D[r2*C+c2], 
            D[(r=r2)*C+(c=c2)] = space, 
            t1.innerHTML = (D+'').replace(rgx,'$1<br>'); 
    } 

document.onkeyup = function (e){ 
    if(move((e||window.event).keyCode-37) && (D+'')==ok && alert('YOU WIN !')); 

layout(4,4); 
</script> 


摘自 无心的专栏

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Gb2312转utf-8编码的方法(vbs+js)
    • 如何使用Ajax技术开发Web应用程序(1)
    • js跳转路径问题
    • JavaScript模仿桌面窗口
    • 用js检测两个线段是否相交
    • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
    • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
    • 我是如何去了解jquery的(六),案例之幻灯片轮换
    • Jquery封装幻灯片效果
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1