`
zhouxianglh
  • 浏览: 267366 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

连连看-js

阅读更多

前几天写了,算是一个小小的总结吧.

//连连看  2010.07.14 isw2 zhoux
(function () {
	var cellDivCSS = "cellDiv";//选中前样式
	var selectDivCSS = "selectDiv";//选中后样式
	var maxChangePath = 2;//最多转向2次
	//图块
	var cell = function (panel, con, row) {//显示的图块
		this.elem = document.createElement("div");
		this.disImage;
		this.con = con;
		this.row = row;
		this.display = false;
		var height = "48", width = "48";
		$(this.elem).attr("class", cellDivCSS);
		$(this.elem).click(function () {
			panel.cellClick(con, row);
		});
		this.init = function (imageSrc) {//初始化图块
			this.disImage = document.createElement("img");
			this.disImage.src = imageSrc;
			this.elem.appendChild(this.disImage);
			$(this.disImage).attr({height:height,width:width,alt:imageSrc});
			this.display = true;
		};
		this.hide = function (speed) {//隐藏图块
			$(this.disImage).hide(speed);
			this.display = false;
		};
		this.show = function (speed) {//显示图块
			$(this.disImage).show(speed);
			this.display = true;
		};
		this.selectByPath = function (changePath, path, selectPath, endCell) {//根据路径查找
			var tempCell = panel.cellPath(selectPath, this.con, this.row);
			if (null == tempCell) {//图块不可使用
				return false;
			}
			if (tempCell.con === endCell.con && tempCell.row == endCell.row) {//图块找到
				return true;
			}
			if (tempCell.display) {//如果此图块有显示
				return false;
			}
			if (path !== selectPath && changePath < maxChangePath && tempCell.selectPath(changePath + 1, path, endCell)) {//如需转向
				return true;
			} else if (path === selectPath && tempCell.selectPath(changePath, path, endCell)) {//不需转向
				return true;
			}else{
				return false;
			}
		};
		this.selectPath = function (changePath, path, endCell) {//选择路径
			if (path != "down" && this.selectByPath(changePath, path, "up", endCell)) {//上
				return true;
			}
			if (path != "up" && this.selectByPath(changePath, path, "down", endCell)) {//下
				return true;
			}
			if (path != "right" && this.selectByPath(changePath, path, "left", endCell)) {//左
				return true;
			}
			if (path != "left" && this.selectByPath(changePath, path, "right", endCell)) {//右
				return true;
			}
			return false;
		};
	};
	//面板
	var panel = function () {
		this.row = 6, this.con = 6;
		var cellList, elem, selected = [];
		var imageList = ["image/chrome.png", "image/firefox.png", "image/google.png", "image/ie.png", "image/java.png", "image/opera.png", "image/ubuntu.png","image/eclipse.png","image/gnome.png","image/msn.png","image/redhat.png","image/windows.png"];
		var selectDisplayImage = function () {//筛选出显示在面板上的图层(私有)
			var row, con, i, j, tempArr = [], countArr = 0;
			for (row = 0, i = cellList.length; row < i; row++) {
				for (con = 0, j = cellList[row].length; con < j; con++) {
					if (cellList[row][con].display === true) {
						tempArr[countArr++] = cellList[row][con];
					}
				}
			}
			return tempArr;
		};
		var setSelect = function (cell) {//设置选中
			$(cell.elem).attr("class", selectDivCSS);
		};
		var setUnselect = function (cell) {//取消选中
			$(cell.elem).attr("class", cellDivCSS);
		};
		this.init = function (panelId) {//初始化面板
			var row, con, i, j;
			elem = $("#" + panelId)[0];
			cellList = new Array(this.row + 2);
			for (row = 0, i = cellList.length; row < i; row++) {//初始化DIV
				cellList[row] = new Array(this.con + 2);
				for (con = 0, j = cellList[row].length; con < j; con++) {
					cellList[row][con] = new cell(this, con, row);
					elem.appendChild(cellList[row][con].elem);
					if (row > 0 && row < i - 1 && con > 0 && con < j - 1) {//设置是否显示
						cellList[row][con].display = true;
					}
				}
			}
			this.radomImage();
		};
		this.radomImage = function () {//在现有的块上生成随机图片
			var i, j, count, countArr = 0, imageLength = imageList.length, indexImage, tempArr;
			tempArr = selectDisplayImage();//筛选出在面板上显示的图块
			for (indexImage in tempArr) {//删除原有图片
				$(tempArr.disImage).remove();
			}
			for (countArr = 0, count = tempArr.length; countArr < count / 2; countArr++) {//随机生成新图片,每次两张,保证配对
				do {
					i = Math.floor(Math.random() * count);
					j = Math.floor(Math.random() * count);
				} while (i == j || (tempArr[i].disImage != null) || (tempArr[j].disImage != null));
				indexImage = Math.floor(Math.random() * imageLength);
				tempArr[i].init(imageList[indexImage]);
				tempArr[j].init(imageList[indexImage]);
			}
		};
		this.cellClick = function (con, row) {
			if (!cellList[row][con].display) {
				return;
			}
			if (cellList[row][con] == selected[0] || cellList[row][con] == selected[1]) {
				if (cellList[row][con] == selected[0]) {//取消选中第一个
					selected[0] = selected[1];
					selected[1] = null;
				} else if (cellList[row][con] == selected[1]) {//取消选中第二个
					selected[1] = null;
				}
				setUnselect(cellList[row][con]);
			} else {
				if (null == selected[0]) {//选中第一个
					selected[0] = cellList[row][con];
					setSelect(selected[0]);
				} else {
					if (null == selected[1]) {//选中第二个
						selected[1] = cellList[row][con];
						if(selected[1].disImage.src == selected[0].disImage.src){//如果图片相同
							if (selected[1].selectPath(0, "up", selected[0]) || selected[1].selectPath(0, "down", selected[0]) || selected[1].selectPath(0, "left", selected[0]) || selected[1].selectPath(0, "right", selected[0])) {
								selected[1].hide("slow");
								selected[0].hide("slow");
								if(!this.checkUse()){//检查是否可继续操作
									this.radomImage();
								}
							}
						}
						setUnselect(selected[0]);//取消选中的第一个
						setUnselect(selected[1]);//取消选中的第二个
						selected[1] = null;
						selected[0] = null;
					}
				}
			}
		};
		this.cellPath = function (path, con, row) {//选择旁边的cell
			try {//数组越界
				switch (path) {
				  case "up":
					return cellList[++row][con];
				  case "down":
					return cellList[--row][con];
				  case "right":
					return cellList[row][++con];
				  case "left":
					return cellList[row][--con];
				}
			}
			catch (e) {
			}
			return null;
		};
		this.checkUse = function(){//查看是否还可以继续操作
			var tempArr = selectDisplayImage(),i,j,k;
			if(tempArr.length == 0){
				return true;
			}
			for(i in tempArr){
				for(j = parseInt(i)+1,k = tempArr.length;j < k ;j++){
					if(tempArr[i].disImage.src == tempArr[j].disImage.src){//如果图片相同
						if (tempArr[i].selectPath(0, "up", tempArr[j]) || tempArr[i].selectPath(0, "down", tempArr[j]) || tempArr[i].selectPath(0, "left", tempArr[j]) || tempArr[i].selectPath(0, "right", tempArr[j])) {
							return true;
						}
					}
				}
			}
			alert("error");
			return false;
		};
	};
	window._ = window.panel = new panel();
})();

 

 

分享到:
评论
1 楼 xulei1992 2014-10-31  
打开只有一个读到一半的进度条啊亲

相关推荐

    图标连连看--js版连连看

    本项目“图标连连看--js版连连看”是基于JavaScript实现的一款经典休闲游戏——连连看。通过这个游戏,我们可以深入理解JavaScript在图形用户界面(GUI)设计和游戏逻辑中的应用。 一、JavaScript基础与DOM操作 ...

    javascript连连看-QQ-源码

    【JavaScript连连看游戏详解】 本项目是一个基于JavaScript实现的连连看游戏,采用了QQ头像作为游戏元素,使得游戏更具趣味性。在这个项目中,我们主要会涉及到以下几个关键知识点: 1. **HTML布局**:游戏界面的...

    Android应用源码之三国杀版连连看-IT计算机-毕业设计.zip

    开发者可以通过WebView加载本地存储的HTML、CSS和JavaScript文件,使得三国杀版连连看的游戏界面和交互逻辑能够在Android设备上流畅运行。 源码分析中,我们可以看到以下几个关键知识点: 1. **Activity和Intent**...

    JavaScript应用实例-连连看.js

    JavaScript应用实例-连连看.js

    JavaScript应用实例-玩吧连连看.js

    JavaScript应用实例-玩吧连连看.js

    js 版连连看2.0

    【JavaScript版连连看2.0】是一款基于JavaScript编程语言开发的轻量级休闲游戏,它在网页环境中为玩家提供了一种趣味盎然的娱乐方式。这款游戏的实现充分展示了JavaScript在网页交互和游戏开发中的强大能力。 ...

    js 版的连连看3个

    "js 版的连连看3个"这个项目涉及到了使用JavaScript实现连连看游戏的代码。连连看,又称为对对碰,是一款流行的休闲益智游戏,玩家需要在限定时间内找出并消除所有可以配对的相同元素。 描述中提到的两个已做好版本...

    连连看游戏--BASIC4PPC源码

    - 添加计时标签`js`,用于显示计时文字。 - 添加计时显示标签`s`,用于显示游戏计时。 - 添加提示按钮`ts`,用于显示剩余提示次数。 - 添加多个按钮控件`ButtonXX`,其中`XX`表示按钮的位置坐标,用于放置不同的...

    js游戏连连看代码

    在本项目中,“js游戏连连看代码”是一个使用JavaScript语言编写的前端小游戏。JavaScript,简称JS,是一种广泛应用于网页和网络应用的脚本语言,主要负责处理网页中的动态内容。它是HTML和CSS的强力补充,使得网页...

    js连连看,javascript脚本写的一款小游戏

    本文将深入探讨“js连连看”这款小游戏背后的JavaScript技术及其相关知识点。 首先,"js连连看"是一款基于纯JavaScript编写的休闲游戏。这款游戏的实现完全依赖于JavaScript的事件处理、DOM操作以及算法设计。下面...

    连连看游戏JavaScript版本

    "连连看游戏JavaScript版本"是一个基于JavaScript编程语言开发的小型休闲游戏。JavaScript是Web开发中的主要脚本语言,常用于实现网页的动态交互效果。在这个项目中,开发者使用JavaScript来控制游戏逻辑,包括游戏...

    javascript连连看

    JavaScript连连看是一款基于JavaScript开发的在线游戏,它模拟了经典的桌面游戏连连看,目标是通过消除相同的图片对来清空游戏盘面。这个游戏的核心在于它的逻辑实现,包括图像的匹配规则、用户交互以及游戏状态的...

    js 连连看游戏源码

    总的来说,这个纯JS实现的连连看游戏源码是一个很好的学习资源,涵盖了JavaScript基础、canvas绘图、响应式设计等多个方面,对于想要提升JavaScript游戏开发技能的开发者来说,无疑是一份宝贵的实践案例。...

    JS连连看游戏源码

    JS连连看是一款基于JavaScript编程语言实现的在线休闲游戏,深受用户喜爱。这个游戏的核心在于其逻辑算法与交互设计,下面将详细解析JS连连看游戏的实现过程及其关键技术。 首先,我们需要理解游戏的基本规则。...

    JAVASCRIPT写的连连看

    JavaScript编写的连连看游戏是一种基于Web的休闲娱乐应用,它利用了JavaScript这门客户端脚本语言的特性,为用户在浏览器环境下提供了互动的游戏体验。在火狐浏览器下,这款游戏能够流畅运行,显示了良好的跨平台...

    基于js的连连看代码和展示

    在这个基于JavaScript(js)实现的连连看项目中,我们将探讨如何利用js和jQuery库来创建这样一个游戏。 首先,我们需要理解JavaScript的基本语法和数据结构,这是编写任何JavaScript程序的基础。JavaScript是一种弱...

    canvas小游戏-连连看

    "canvas小游戏-连连看"是一款基于JavaScript和HTML5 Canvas技术实现的经典连连看游戏。Canvas是HTML5中的一个重要元素,它允许开发者在网页上绘制图形,非常适合用来开发各种交互式的2D游戏。在这个项目中,...

    JS实战之连连看.rar

    在"js连连看游戏代码"中,我们可以看到整个项目的源代码,包括HTML用于构建游戏界面,CSS用于样式设计,以及JavaScript文件用于处理游戏逻辑和用户交互。通过阅读和理解这些代码,开发者不仅可以学习到如何用...

    JavaScript应用实例-连连看(1).js

    JavaScript应用实例-连连看(1).js

Global site tag (gtag.js) - Google Analytics