<script type='text/javascript'>
[code=javascript]X = Y = 40;
var S='',D;
for (var y = 0; y < Y; y++) for (var x = 0; x < X; x++) {
S+='<div style="display:inline;width:10px;height:10px;font-size:1px;background-color:#c0c0c0;" id="x' + x + 'y' + y + '"></div>';
if (x == X - 1) {
S+='<br>';
}
};
if (D=document.body) D.appendChild(document.createElement('div')).innerHTML = S;
else document.write(S);
var sk = {
Snake: [[X >> 1, Y >> 1]],
Dir: [0, 1]
};
function cDie(snake) {
return ((snake.join('x')).match(new RegExp(Y + '(x|$)|' + X + ',|-|(\\d+,\\d+(x|$)).*?\\2', 'ig')));
}
function $(xy) {
return document.getElementById('x' + xy[0] + 'y' + xy[1]);
}
function setc(obj, color) {
obj.style.backgroundColor = color;
}
var cancel, R = sk.Snake[0],
add = 0;
timer = setInterval(function() {
cancel = 0;
var st;
with(sk) {
for (var i = Snake.length; i--;) {
if (i == Snake.length - 1) {
setc($(Snake[i]), '#c0c0c0');
st = Snake[i].join(',').split(',');
}
if (i) setc($(Snake[i] = Snake[i - 1].join(',').split(',')), 'blue');
if (uequ(Snake[i], R)) R = 0 * ++add;
}
if (add) {--add;
Snake.push(st);
}
Snake[0][0] += Dir[0];
Snake[0][1] += Dir[1];
var res;
if (res = cDie(Snake)) {
clearInterval(timer);
alert(((res + '').match(/x.+?x/) ? '咬到自己!': '撞墙!') + '游戏结束!');
return;
}
setc($(Snake[0]), 'red');
}
if (!R) R = [Math.random() * X | 0, Math.random() * Y | 0];
setc($(R), 'green');
},
50);
document.onkeydown = function(e) {
e = e || event;
e = e.keyCode || e.which;
var w = {
'38': [0, -1],
'39': [1, 0],
'40': [0, 1],
'37': [ - 1, 0]
};
if (!cancel && !uequ(sk.Dir, w[e])) {
cancel = sk.Dir = w[e];
}
};
function uequ(a1, a2) {
return (a1 + '\n' + a2).replace(/-|,/g, '').match(/^(\d+)\n\1$/);
}
alert('按确定开始游戏!');
</script>游戏JavaScript原创

解决方案 »

  1.   

    <script type='text/javascript'>
    X = Y = 40;
    var S='',D;
    for (var y = 0; y < Y; y++) for (var x = 0; x < X; x++) {
        S+='<div style="display:inline;width:10px;height:10px;font-size:1px;background-color:#c0c0c0;" id="x' + x + 'y' + y + '"></div>';
        if (x == X - 1) {
            S+='<br>';
        }
    };
    if (D=document.body) D.appendChild(document.createElement('div')).innerHTML = S;
    else document.write(S);
    var sk = {
        Snake: [[X >> 1, Y >> 1]],
        Dir: [0, 1]
    };
    function cDie(snake) {
        return ((snake.join('x')).match(new RegExp(Y + '(x|$)|' + X + ',|-|(\\d+,\\d+(x|$)).*?\\2', 'ig')));
    }
    function $(xy) {
        return document.getElementById('x' + xy[0] + 'y' + xy[1]);
    }
    function setc(obj, color) {
        obj.style.backgroundColor = color;
    }
    var cancel, R = sk.Snake[0],
    add = 0;
    timer = setInterval(function() {
        cancel = 0;
        var st;
        with(sk) {
            for (var i = Snake.length; i--;) {
                if (i == Snake.length - 1) {
                    setc($(Snake[i]), '#c0c0c0');
                    st = Snake[i].join(',').split(',');
                }
                if (i) setc($(Snake[i] = Snake[i - 1].join(',').split(',')), 'blue');
                if (uequ(Snake[i], R)) R = 0 * ++add;
            }
            if (add) {--add;
                Snake.push(st);
            }
            Snake[0][0] += Dir[0];
            Snake[0][1] += Dir[1];
            var res;
            if (res = cDie(Snake)) {
                clearInterval(timer);
                alert(((res + '').match(/x.+?x/) ? '咬到自己!': '撞墙!') + '游戏结束!');
                return;
            }
            setc($(Snake[0]), 'red');
        }
        if (!R) R = [Math.random() * X | 0, Math.random() * Y | 0];
        setc($(R), 'green');
    },
    50);
    document.onkeydown = function(e) {
        e = e || event;
        e = e.keyCode || e.which;
        var w = {
            '38': [0, -1],
            '39': [1, 0],
            '40': [0, 1],
            '37': [ - 1, 0]
        };
        if (!cancel && !uequ(sk.Dir, w[e])) {
            cancel = sk.Dir = w[e];
        }
    };
    function uequ(a1, a2) {
        return (a1 + '\n' + a2).replace(/-|,/g, '').match(/^(\d+)\n\1$/);
    }
    alert('按确定开始游戏!');
    </script>
      

  2.   

    bug,按上下左右之外的键就出错
      

  3.   

    表示Chrome Maxthon什么东西都没有。。
    只有IE可以运行。。
    然后是速度太TM快了。。
      

  4.   

    bug 二。当吃了10个豆之后就会自动GAME OVER
      

  5.   

    <script type='text/javascript'>
    X = Y = 40;
    var S='',D;
    for (var y = 0; y < Y; y++) for (var x = 0; x < X; x++) {
        S+='<div style="display:inline-block;_display:inline;width:10px;height:10px;font-size:1px;background-color:#c0c0c0;" id="x' + x + 'y' + y + '"></div>';
        if (x == X - 1) {
            S+='<br>';
        }
    };
    if (D=document.body) D.appendChild(document.createElement('div')).innerHTML = S;
    else document.write(S);
    var sk = {
        Snake: [[X >> 1, Y >> 1]],
        Dir: [0, 1]
    };
    function cDie(snake) {
        return ((snake.join('x')).match(new RegExp(Y + '(x|$)|' + X + ',|-|(\\d+,\\d+(x|$)).*?\\2', 'ig')));
    }
    function $(xy) {
        return document.getElementById('x' + xy[0] + 'y' + xy[1]);
    }
    function setc(obj, color) {
        obj.style.backgroundColor = color;
    }
    var cancel, R = sk.Snake[0],
    add = 0;
    timer = setInterval(function() {
        cancel = 0;
        var st;
        with(sk) {
            for (var i = Snake.length; i--;) {
                if (i == Snake.length - 1) {
                    setc($(Snake[i]), '#c0c0c0');
                    st = Snake[i].join(',').split(',');
                }
                if (i) setc($(Snake[i] = Snake[i - 1].join(',').split(',')), 'blue');
                if (uequ(Snake[i], R)) R = 0 * ++add;
            }
            if (add) {--add;
                Snake.push(st);
            }
            Snake[0][0] += Dir[0];
            Snake[0][1] += Dir[1];
            var res;
            if (res = cDie(Snake)) {
                clearInterval(timer);
                alert(((res + '').match(/x.+?x/) ? '咬到自己!': '撞墙!') + '游戏结束!');
                return;
            }
            setc($(Snake[0]), 'red');
        }
        if (!R) R = [Math.random() * X | 0, Math.random() * Y | 0];
        setc($(R), 'green');
    },
    100);
    document.onkeydown = function(e) {
        e = e || event;
        e = e.keyCode || e.which;
        var w = {
            '38': [0, -1],
            '39': [1, 0],
            '40': [0, 1],
            '37': [ - 1, 0]
        };
        if (!cancel && !uequ(sk.Dir, w[e])) {
            cancel = sk.Dir = w[e]||sk.Dir;
        }
    };
    function uequ(a1, a2) {
        return (a1 + '\n' + a2).replace(/-|,/g, '').match(/^(\d+)\n\1$/);
    }
    alert('按确定开始游戏!');
    </script>话说chrome会什么都没有主要是因为webkit和ie对display:inline的理解不同导致的。。ie不支持inline-block(但是ie上inline的效果等同于webkit上的inline-block,这一点确实让人很费解。。),所以改了之后就好了
      

  6.   

    算法可能还有bug,明明没咬到自己都说咬到了
      

  7.   

    <script type='text/javascript'>
    X = Y = 30;
    var S='';
    for (var y = 0; y < Y; y++)
        for (var x = 0; x < X; x++)
            S+='<div style="display:inline-block;_display:inline;width:10px;height:10px;font-size:1px;background-color:#c0c0c0;" id="x' + x + 'y' + y + '"></div>'+(x == X - 1?'<br>':'');
    document.write(S);
    var sk = {
        Snake: [[X >> 1, Y >> 1]],
        Dir: [0, 1]
    };
    function $(xy) {
        return document.getElementById('x' + xy[0] + 'y' + xy[1]);
    }
    function setc(obj, color) {
        obj.style.backgroundColor = color;
    }
    var cancel, R ,add = 2;
    (function() {
        cancel = 0;
        var st;
        with(sk) {
            for (var i=Snake.length; i--;) {
                if(i==Snake.length-1){
                    setc($(Snake[i]), '#c0c0c0');
                    st = Snake[i].join(',').split(',');
                }
                i && setc($(Snake[i] = Snake[i - 1].join(',').split(',')), 'blue');
                if (uequ(Snake[i], R)) R = 0 * ++add;
            }
            if (add) {
                --add;
                Snake.push(st);
            }
            Snake[0][0] += Dir[0];
            Snake[0][1] += Dir[1];
            var res;
            if (res = ('x'+Snake.join('xx')+'x').match(new RegExp('x'+X + ',|,' + Y + 'x|-|(x\\d+,\\d+x).*?x\\1', 'ig')))
                return alert(((res + '').match(/x.+?x/) ? '咬到自己!': '撞墙!'));
    setTimeout(arguments.callee,100);
            setc($(Snake[0]), 'red');
        }
        setc($(R = R || [Math.random() * X | 0, Math.random() * Y | 0]), 'green');
    })();
    document.onkeydown = function(e) {
        e = e || event;
        e = e.keyCode || e.which;
        var w = {
            '38': [0, -1],
            '39': [1, 0],
            '40': [0, 1],
            '37': [ - 1, 0]
        };
        if (!cancel && !uequ(sk.Dir, w[e])) {
            cancel = sk.Dir = w[e]||sk.Dir;
        }
    };
    function uequ(a1, a2) {
        return (a1 + '\n' + a2).replace(/-|,/g, '').match(/^(\d+)\n\1$/);
    }
    alert('按确定开始游戏!');
    </script>说实话我自己都有点不确定这个有没有问题了。。不过我自己测试了好几遍都没发现问题。。