20多行js代码写一个最简单的3x3拼图游戏,兼容各浏览器,排除无解情况
JS就是方便啊,没事的时候玩玩,有益健康。
这个本来是在论坛回一个帖子的,做了一些改进。
我的博客没什么人气,就放这里来一下。这里最大缺点是发布后自己不能编辑。
玩法:方向键
胜负:排列出12345678_就算胜利了!
兼容各浏览器,使用了“逆序和”判定,来保证一定有解。
直接体验就轻轻点击这里。
如果有好心人帮我顶一下博客那边的帖子,就很感激了。
<script>
function gd(){
var arr=[1,2,3,4,5,6,7,8].sort(function(){return Math.random()>.5});
for(var i=0,k=0,n=arr.length;i<n;i++)
for(var j=i+1;j<n;j++)
arr[i]>arr[j] && (k=1-k);
k && (i=arr[n-2]) && (arr[n-2]=arr[n-1]) && (arr[n-1]=i);
return [arr.slice(0,3),arr.slice(3,6),arr.slice(6).concat('_')];
}
var r=2,c=2,sp='\r\n',d=gd();
document.writeln('<textarea id="t1" readonly style="overflow:hidden;width:70px;height:70px;">'+d.join(sp)+'</textarea>');
var t1=document.getElementById("t1");
document.onkeyup = function (e){
var k = (e||window.event).keyCode, t, rr2=r, cc2=c;
if(k==37||k==39){
c2 += 38-k;
if(c2<0||c2>2)return;
}else if(k==38||k==40){
r2 += 39-k;
if(r2<0||r2>2)return;
}else return;
t = d[r][c];
d[r][c] = d[r2][c2];
d[r=r2][c=c2] = t;
t1.value = d.join(sp);
if(t1.value.match(/^1,2,3[^\d]*4,5,6[^0]*_$/)){
alert('YOU WIN !');
}
}
</script>
<!doctype html>
<html>
<head>
<meta charset="gb2312" />
<title></title>
<style>
</style>
</head>
<body>
<script>
function gd(){
var arr=[1,2,3,4,5,6,7,8].sort(function(){return Math.random()>.5});
for(var i=0,k=0,n=arr.length;i<n;i++)
for(var j=i+1;j<n;j++)
arr[i]>arr[j] && (k=1-k);
k && (i=arr[n-2]) && (arr[n-2]=arr[n-1]) && (arr[n-1]=i);
return [arr.slice(0,3),arr.slice(3,6),arr.slice(6).concat('_')];
}
var r=2,c=2,sp='\r\n',d=gd();
document.writeln('<textarea id="t1" readonly style="overflow:hidden;width:70px;height:70px;">'+d.join(sp)+'</textarea>');
var t1=document.getElementById("t1");
document.onkeyup = function (e){
var k = (e
[解决办法]
window.event).keyCode, t, rr2=r, cc2=c;
if(k==37
[解决办法]
k==39){
c2 += 38-k;
if(c2<0
[解决办法]
c2>2)return;
}else if(k==38
[解决办法]
k==40){
r2 += 39-k;
if(r2<0
[解决办法]
r2>2)return;
}else return;
t = d[r][c];
d[r][c] = d[r2][c2];
d[r=r2][c=c2] = t;
t1.value = d.join(sp);
if(t1.value.match(/^1,2,3[^\d]*4,5,6[^0]*_$/)){
alert('YOU WIN !');
}
}
</script>
</body>
</html>
var points = [],
temp, j = 1,
colCount = 15,
rowCount = 7,
current = [rowCount - 1, colCount - 1],
len = String(rowCount * colCount).length;
for(var row = rowCount; row--;){
var lines = [];
points.push(lines);
for(var col = colCount; col--;){
lines.push((new Array(len).join(0) + j++).slice(-len));
}
}
points[current[0]][current[1]] = new Array(len + 1).join('_');
var success = points.join('\n');
function move(direction){
if (!(/^[0-3]$/.test(direction))) return;
var offset = [[-1, 0], [0, -1], [+1, 0], [0, +1]][direction],
next = [current[0] + offset[0], current[1] + offset[1]];
if (!points[next[0]]
[解决办法]
!points[next[0]][next[1]]) return;
points[current[0]][current[1]] = points[next[0]][next[1]];
points[next[0]][next[1]] = new Array(len + 1).join('_');
current = next;
return true;
}
for(var i = rowCount * colCount * 4; i--;){
move(0
[解决办法]
(Math.random() * 4));
}
var t1 = document.getElementById("t1");
t1.value = points.join('\n');
t1.onkeyup = function(e){
if (move(40 - (e
[解决办法]
event).keyCode) && success == (t1.value = temp = points.join('\n'))){
t1.onkeyup = alert('YOU WIN !');
}
};
t1.focus();