连连看-js
时间:2010-07-17 来源:zhouxianglh
前几天写了,算是一个小小的总结吧.
//连连看 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({
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();
})();
相关阅读 更多 +










