JS经典拼板游戏

原文链接:http://www.guimigame.com/thread-49-1-1.html,对于代码有什么不明白的地方,可以到这里给我发问哦!

效果演示

废话不多说了,直接上代码!

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>JS重现_经典拼板游戏</title>
</head>
<body>
<style>
*{margin:0;padding:0;}
.shell{margin:20px auto;position:relative;width:499px;height:299px;border:#666 10px solid;background:#FAFAFA;}
.shell p{position:absolute;width:99px;height:99px;background:url(http://www.guimigame.com/data/attachment/portal/201405/07/115743h7mwmw3k6ew0z6lc.jpg) no-repeat 0 0;cursor:pointer;}
.bar{margin:0 auto;width:499px;font:600 16px/1.8em Verdana;}
.bar em{font-style:normal;margin-right:10px;color:#F00;}
#showall{font:12px/1.8em Verdana;cursor:pointer;}
#show{background:url(http://www.guimigame.com/data/attachment/portal/201405/07/115743h7mwmw3k6ew0z6lc.jpg) no-repeat 0 0;}
</style>
<div id="shell" class="shell"></div>
<div id="bar" class="bar">
	<b>计时:</b><em id="times">00:00</em>
	<b>步数:</b><em id="steps">0</em>
	<select id="hard">
		<option value="1">入门模式</option>
		<option value="4">简单模式</option>
		<option value="8">一般模式</option>
		<option value="16">困难模式</option>
		<option value="32">超难模式</option>
	</select>
	<b id="showall">查看原图</b>
</div>
<div id="show" class="shell" style="display:none;"></div>
<script type="text/javascript">
speller={
	init:function(n)
	{
		this.hard=n;
		this.step=this.useTime=0;
		this.blank = 14;			// 设置第15块为空白
		this.createGrid();
		clearInterval(this.timer);
		this.timer=setInterval(
			function()
			{
				speller.useTime++;/* 累加时间并格式化显示 */
				document.getElementById("times").innerHTML=(‘0‘+parseInt(speller.useTime/60)).slice(-2)+‘:‘+(‘0‘+speller.useTime%60).slice(-2);
			},
		1000);
	},
	createGrid:function()
	{
		var X=function(n){return n%5 * 100;};
		var Y=function(n){return parseInt(n/5) * 100;};
		for(var i = 0, html = []; i < 15; i++)
		{
			// 注意speller.move(this);
			html.push(‘<p onclick="speller.move(this);" id="‘+i+‘" class="‘+i+‘"  style="left:‘+X(i)+‘px;top:‘+Y(i)+‘px;background-position:-‘+X(i)+‘px -‘+Y(i)+‘px;"></p>‘);
		}
		// 将html数组放到id="shell"的div中。注:可以用firedebug查看哦!
		document.getElementById("shell").innerHTML = html.join(‘‘);
		this.random();
	},
	random:function()
	{
		// 这里获取的ps是上面document.getElementById("shell").innerHTML = html.join(‘‘);的结果,ps是数组
		var ps = document.getElementById("shell").getElementsByTagName("P");
		var l  = ps.length;
		var me = this;
		ps[this.blank].style.display = "none";

		function GetRandomNum()
		{
			var num = (0 + Math.round(Math.random() * 14));
			if (num == this.blank)
			{
				return GetRandomNum();
			}
			return num;
		}
		var en = function()
		{
			return parseInt(Math.random() * l);
		}
		var getp = function(n)
		{
			for(var i=0;i<l;i++)
			{
				if(ps[i].className == n)
				{
					return ps[i];
				}
			}
		}
		for(var i = 0; i < me.hard; i++)
		{
			// 找到一张拼图与空白交换
			this.move2(getp(GetRandomNum()));
		}
	},
	move2:function(p)
	{
		var pos = p.className;
		var POS = this.blank;
		p.style.top = parseInt(POS/5) * 100 +"px";
		p.style.left = POS%5 * 100 +"px";
		p.className = POS;
		this.blank = pos;
	},
	move:function(p)
	{
		var pos = p.className;
		var POS = this.blank;
		var abs = Math.abs(pos-POS);
		var max = pos > POS ? pos : POS;
		if(abs == 5)
		{
			this.fx(parseInt(pos/5)*100,parseInt(POS/5)*100,function(x){p.style.top=x+"px";},function(){},100,.4)
		}
		else if(abs == 1 && max%5 != 0)
		{
			this.fx(pos%5 * 100,POS%5 * 100,function(x){p.style.left=x+"px";},function(){},100,.4)
		}
		else
		{
			return;
		}
		p.className = POS;
		this.blank = pos;
		document.getElementById("steps").innerHTML = ++this.step;
		if(this.check())
		{
			var me = this;
			var last = document.getElementById("shell").getElementsByTagName("P")[14];
			last.style.display="block";
			this.blank = 10000;
			this.fx(0,100,function(x){last.style.opacity=x/100;last.style.filter="alpha(opacity="+x+")";},function(){alert(‘你真棒!再来一次吧!‘);me.init();},200,1)
		}
	},
	check:function()
	{
		var p=document.getElementById("shell").getElementsByTagName("P");
		for(var i=0, l = p.length; i < l; i++)
		{
			if(p[i].className != p[i].id)
			{
				return false;
			}
		}
		return true;
	},
	fx:function(f,t,fn,end,tm,pow)
	{
		var D = Date;
		var d = new D;
		var e;
		var c = tm;
		return e=setInterval(function (){
			var z=Math.min(1,(new D-d)/c);
			(false === fn(+f+(t-f)*Math.pow(z,pow),z)||z==1) && end && end(clearTimeout(e));
		},10);
	}
}

speller.init(document.getElementById("hard").value);

document.getElementById("showall").onclick=function()
{
	document.getElementById("show").style.display=document.getElementById("show").style.display == "none" ? "" : "none";
}
document.getElementById("hard").onchange=function()
{
	speller.init(this.value);
}
document.all && document.execCommand("BackgroundImageCache", false, true);

window.open(‘http://www.guimigame.com/thread-49-1-1.html‘);

</script>
<h3>原文链接:<a href="http://www.guimigame.com/thread-49-1-1.html">http://www.guimigame.com/thread-49-1-1.html</a></h3>
</body>
</html>

JS经典拼板游戏

时间: 2024-10-22 21:38:31

JS经典拼板游戏的相关文章

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;    

使用AxureRP7.0制作经典小游戏"大家来找茬"

本案例是<网站蓝图AxureRP7.0从入门到精通视频教程>中的最后一节,适用于对Axure基础知识掌握比较熟练的同学:教程由axure原型库网站录制,转载请注明出处!相信很多刚接触Axure或者学习了一段时间但并没有深入的同学们,看到这个案例一定很惊讶,使用Axure竟然能做出如此逼真的交互效果!通过此案例也可以激发广大同学们学习Axure的热情和信心!试想一下,如果你有情侣的话,把你们珍藏的合影拿出来处理几张,做成大家来找茬的小游戏,不但锻炼了自己的技能,还能给对方一个惊喜,岂不是一举两得

Vue.js实现拼图游戏

Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5516065.html 前言 为了进一步让大家了解Vue.js的神奇魅力,了解Vue.js的一种以数据为驱动的理念,本文主要利用Vue实现了一个数字拼图游戏,其原理并不是很复杂,效果图如下: demo展示地址为:https://luozhihao.github.io/vue-puzz

简单数字拼板游戏学习

VS2010/MFC/对话框程序 MFC练习 1.新建一个矩形类. MoveDown(),MoveUp(),MoveLeft(),MoveRight()是移动的动作.int position是表示该矩形当前的实际位置,按如下布局: 0 1 2 3 4 5 6 7 8 .MoveXXX()函数一是要判断是否可以响应,而是响应后要修改position的值与当前位置匹配. 如MoveUp()函数中,如果该矩形position为0,1,2,则应该不动(此判断也可省,在键盘响应处理中会根据空格所在位置指定

JS开发HTML5游戏《神奇的六边形》(四)

近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容太多,为方便大家阅读,所以分成四部分来讲解. 本文为第四部分,主要包括: 16.分数往上飘动画 17.形状飞入动画 18.其他动画表现添加 19.游戏结束界面 20. 添加LOGO 21. 渲染优化 若要一次性查看所有文档,也可点击这里. 十六. 分数往上飘的动画 在表现加分时,分数会有个缩放的效果,然后往上

【前端】Vue.js经典开源项目汇总

Vue.js经典开源项目汇总 原文链接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什么? Vue.js(读音 /vju?/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用. Vue.js 的目标是通过

Vue.js经典开源项目汇总

Vue.js经典开源项目汇总 原文链接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什么? Vue.js(读音 /vju?/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用. Vue.js 的目标是通过

JS经典算法

JS经典算法: // 1.字符串颠倒 str.split('').reverse().join('') // 2.不借助中间量,颠倒a.b a=[b,b=a][0] // 3.快速获取数组的最大值.最小值 Array.prototype.max = function () { return Math.max.apply(null, this) } Array.prototype.min = function () { return Math.min.apply(null, this) } //

Classic Minesweeper Simple 经典扫雷游戏简洁版

老游戏新尝试,复刻经典扫雷游戏,简洁版,设计时尽可能减少文字信息,模仿iOS的特点,上手即用.提供最基本的设置和统计信息,毕竟大家是为了玩儿游戏,不是做大数据分析不是吗?试试吧,欢迎讨论分享. 操作: 长按标旗 点按翻开 扫动滚屏 捏合缩放 This is a classic minesweeper, the famous logic game. If you want to win, find and flag all the mines hidden in blocks. Have a tr