Сохранение и сравнение значений ячеек таблицы
Я создаю простую игру на совпадение памяти и хочу сравнить текстовое значение каждой ячейки, на которую нажали, чтобы увидеть, найдено ли совпадение. Обработчик события щелчка внизу - моя попытка сделать это, но я не уверен, как сохранить ячейку, по которой щелкнули. Как сохранить текстовое значение каждой ячейки и сравнить их, сохраняя при этом ячейку, которую я сравниваю, чтобы скрыть ее, если две выбранные ячейки не совпадают? Отступ текста установлен на 100%, а переполнение скрыто по умолчанию.
var createTable = function (col, row) {
$('table').empty();
for (var i = 1; i <= row; i++) {
$('table').append($('<tr>'));
}
for (var j = 1; j <= col; j++) {
$('tr').append($('<td>'));
}
countCells = row * col;
};
createTable(4, 1);
var arr = [1, 2, 1, 2];
var pushNum = function () {
var len = arr.length;
for (var i = 0; i <= len; i++) {
var ran = Math.ceil(Math.random() * arr.length) - 1;
$('td').eq(i).append(arr[ran]);
arr.splice(ran, 1);
}
};
pushNum();
var match1;
$('td').click(function () {
$(this).css('text-indent', 0);
match1 = $(this).eq();
if (match1.val() === "1") {
alert("GOOD");
}
});
3 ответа
Лично я думаю, что я бы создал пару функций для обработки двух вещей:
1) onclick
функция в каждой ячейке, которая будет просто переключать некоторый класс "нажал" toggleClass()
), когда ячейка нажата. Он также может иметь визуальный индикатор (например, изменить цвет текста или фона или что-то в этом роде).
2) независимая функция, которая будет вызываться "onclick" в #1 после завершения переключения, чтобы проверить, были ли нажаты ровно 2 ячейки. Вы можете использовать селектор jQuery, чтобы получить все ячейки с классом "clicked", и, если длина возвращаемого набора равна 2, тогда используйте first()
а также last()
функции, чтобы получить значения нажатых ячеек, чтобы вы могли сравнить их. Это функция, в которой вы бы интегрировали свой существующий JS-код "они соответствуют" сверху.
Таким образом, вам на самом деле не нужно будет хранить значение, вы просто никогда не будете проверять, если не знаете, что сделали два выбора, а затем вы проверите их в режиме реального времени.
Мне показалось это интересным, поэтому я попытался реализовать его с помощью простого jQuery.
var $mainTable = $('#mainTable'),
myWords = [],
valA, valB, col=4, row=3, start;
// function to create the table
var createTable = function (col, row) {
var $table = $('<table>'), i;
// construct our table internally
for(var i=0; i<row; i++){
var $tr = $('<tr data-row="'+i+'">'); // make row
for(var j=0; j<col; j++){
$tr.append($('<td data-col="'+j+'">')); // make cell
}
$table.append($tr);
}
$mainTable.html($table.html());
};
// generate an array random words from a dictionary
var giveWords = function(pairsRequested){
var dictionary = ['now','this','is','only','a','test','I','think'],
ar = dictionary.slice(0,pairsRequested);
ar = ar.concat(ar);
// taken from @ http://jsfromhell.com/array/shuffle [v1.0]
for(var j, x, i = ar.length; i; j = parseInt(Math.random() * i), x = ar[--i], ar[i] = ar[j], ar[j] = x);
return ar;
}
// initialize
createTable(col,row);
myWords = giveWords(6); // our words array
// listen
$mainTable.on('click', 'td' ,function(){
var $that = $(this),
thisCol = $that.data('col'),
thisRow = $that.closest('tr').data('row');
if(!valB && !$that.hasClass('clicked')){
var itemNum = (thisRow*(col))+thisCol;
if(!valA){ // first item clicked
valA = myWords[itemNum];
$that.addClass('clicked')
.text(valA);
} else { // we already have a clicked one
valB = myWords[itemNum];
if(valA === valB){ // if they match...
$mainTable.find('.clicked')
.add($that)
.removeClass('clicked')
.addClass('revealed')
.text(valA);
// check how many open remaining
var open = $mainTable.find('td')
.not('.revealed')
.length;
if(open===0){ // if 0, game over!
var elapsed = Date.now()-start;
alert('Congratulations! cleared the table in '+elapsed/1000+' seconds.');
}
valA = valB = undefined;
} else {
$that.addClass('clicked')
.text(valB);
setTimeout(function(){ // leave the value visible for a while
$mainTable.find('.clicked')
.removeClass('clicked')
.text('');
valA = valB = undefined;
},700);
}
}
}
if(!start){ // keep time of game completion
start=Date.now();
}
});
Используемый data-num
атрибут для значений ячейки таблицы вместо использования классов. Были некоторые проблемы, которые нужно исправить, например, двойной щелчок по той же ячейке или щелчок по уже обнаруженной ячейке, но в целом, теперь это работает!
var countCells;
var createTable = function (col, row) {
var str = '';
for (var i = 1; i <= row; i++) {
str += '<tr>';
for (var j = 1; j <= col; j++) {
str += '<td>';
}
str += '</tr>';
}
$('table').html(str);
countCells = row * col;
};
createTable(6, 3);
function shuffle(o) {
for (var j, x, i = o.length; i; j = parseInt(Math.random() * i, 10), x = o[--i], o[i] = o[j], o[j] = x);
return o;
}
// http://stackru.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript
var arr = [];
for (var i = 0; i < countCells / 2; i++) {
arr[i] = arr[i + countCells / 2] = i + 1;
}
shuffle(arr);
//console.log(arr);
var tds = $('table td');
tds.each(function (i) {
this.setAttribute('data-num', arr[i]);
});
var attempts = 0;
var match1 = null;
var info = $('#info');
var wait = false;
$('td').click(function () {
if (wait) {
return;
} // wait until setTimeout executes
var num = this.getAttribute('data-num');
if (match1 === null && num != 'X') { //1st click on unmatched cell
match1 = this;
this.innerHTML = num;
attempts++;
info.text('Attempts: ' + attempts);
return;
} else { //2nd click
var num1 = match1.getAttribute('data-num'); //1st num
if (match1 === this) {
// clicked twice this cell
return;
} else if (num == 'X') {
// clicked on already revealed cell
return;
} else if (num == num1) {
// both cells match
info.text('Bingo! Attempts: ' + attempts);
this.innerHTML = match1.innerHTML = num1;
this.setAttribute('data-num', 'X');
match1.setAttribute('data-num', 'X');
match1 = null;
} else {
// cells not match
info.text('Try again. Attempts: ' + attempts);
this.innerHTML = num;
var self = this;
wait = true;
window.setTimeout(function () {
self.innerHTML = match1.innerHTML = '';
match1 = null;
wait = false;
}, 1000);
}
}
});
наслаждаться!:-)