Не могу открыть одновременно две карточки в игре "Пары"
На данный момент в коде открывается одна карточка, которая сразу закрывается, если пара не совпала. А нужно так - открыл по клику одну карточку, потом открыл по клику вторую, далее обе закрываются, если пары не совпадали, или обе остались если пара совпала.
let input = document.querySelector('.input');
let button = document.querySelector('.button');
let wrapperCards = document.querySelector('.wrapper-cards');
let time = document.querySelector('.time');
let buttonGame = document.createElement("button");
let modalEnd = document.createElement("div");
let timeInterval
let arrCardOpen = [];
// создаем масив
let result = 4
let newArr = new Array();
button.onclick = function() {
let value = +input.value;
// очищаем .wrapper-cards
if (document.querySelector(".card")) {
wrapperCards.innerHTML = ''
}
button.disabled = true;
// проверяем введеное число
if (value % 2 == 0 && value <= 10 && value >= 4) {
result = value;
} else {
result = 4;
input.value = 4
alert('Введите четное число от 4 до 10')
}
// задаем ширину .wrapper-cards
wrapperCards.style.width = (160 * result) + 'px';
// создаем новый масив
for (let i = 0; i < result * result; i++) {
newArr[i] = Math.trunc(i / 2) + 1
}
// перемешиваем масив
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
shuffle(newArr);
// создаем div .card
function getListContent() {
let fragment = new DocumentFragment();
for (let i = 0; i < result * result; i++) {
let card = document.createElement("div");
card.classList.add('card');
card.dataset.number = newArr[i];
fragment.append(card);
}
return fragment;
}
wrapperCards.append(getListContent()); // (*)
// находим .card
let cardInDom = document.querySelectorAll(".card");
// вызываем функцию по клику на .card и показываем цифру
let temp;
for (let card of cardInDom) {
card.onclick = () => {
if (card.classList.contains("open")) return;
let cardValue = card.dataset.number;
card.innerHTML = cardValue;
if (temp && temp != card) {
if (temp.dataset.number == cardValue) {
temp.classList.add("open");
card.classList.add("open");
temp = null;
if (document.querySelectorAll(".card.open").length === result * result) {
andGame();
clearInterval(interval);
}
} else {
temp.innerHTML = "";
temp = card;
}
} else temp = card;
};
};
let interval = setInterval(function() {
timeInterval = parseFloat(time.textContent)
if (timeInterval <= 0) {
clearInterval(interval);
andGame();
} else {
time.textContent = timeInterval - 1
};
}, 1000);
};
// закнчиваем игру
const andGame = function() {
modalEnd.classList.add('modal-end');
document.body.append(modalEnd);
buttonGame.classList.add('button-game');
modalEnd.append(buttonGame);
buttonGame.append(document.createTextNode("Начать заново"));
}
// начинаеем игру
buttonGame.onclick = function() {
modalEnd.remove();
buttonGame.innerHTML = ''
time.textContent = 60
timeInterval = parseFloat(time.textContent)
button.onclick()
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <link rel="stylesheet" href="style.css"> -->
<title>Document</title>
<style>
.wrapper-cards {
display: flex;
flex-wrap: wrap;
margin-top: 40px;
}
.card {
width: 120px;
height: 120px;
margin-right: 35px;
margin-bottom: 35px;
border: 2px solid black;
text-align: center;
font-size: 128px;
cursor: pointer;
}
.card:hover {
box-shadow: 0 0 5px #2f2d2d;
}
.modal-end {
position: absolute;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, 0.9);
z-index: 100;
}
.button-game {
background-color: sandybrown;
padding: 20px;
border-radius: 30px;
cursor: pointer;
}
.button-game:hover {
background-color: rgb(173, 133, 98);
}
</style>
</head>
<body>
<div class="wrapper">
<input class="input" value="4" type="number" min="4" max="10">
<button class="button">Начать игру</button>
</div>
<h2 class="">Время игры <span class="time">60</span> сек</h2>
<div class="wrapper-cards">
<!-- <div class="card"></div>
<div class="card"></div>
<div class="card"></div>
<div class="card"></div> -->
</div>
<script src="main.js"></script>
</body>
</html>
Ответы (1 шт):
Автор решения: Pavel Nazarian
→ Ссылка
Во-первых, вы очищали только одну карточку, во-вторых, не обнуляли temp. Соответственно следующая проверка проходила некорректно.
temp.innerHTML = "";
temp = card;
Очищаем обе карточки, обнуляем темп, добавляем таймаут, и можно еще блокировать нажатие на карточку на время таймаута
document.querySelector('.wrapper-cards').classList.add('disabled');
setTimeout(()=>{
card.innerHTML = "";
temp.innerHTML = "";
temp = null;
document.querySelector('.wrapper-cards').classList.remove('disabled');},
500);
}
добавим в css
.wrapper-cards.disabled * {
pointer-events: none;
}
let input = document.querySelector('.input');
let button = document.querySelector('.button');
let wrapperCards = document.querySelector('.wrapper-cards');
let time = document.querySelector('.time');
let buttonGame = document.createElement("button");
let modalEnd = document.createElement("div");
let timeInterval
let arrCardOpen = [];
// создаем масив
let result = 4
let newArr = new Array();
button.onclick = function() {
let value = +input.value;
// очищаем .wrapper-cards
if (document.querySelector(".card")) {
wrapperCards.innerHTML = ''
}
button.disabled = true;
// проверяем введеное число
if (value % 2 == 0 && value <= 10 && value >= 4) {
result = value;
} else {
result = 4;
input.value = 4
alert('Введите четное число от 4 до 10')
}
// задаем ширину .wrapper-cards
wrapperCards.style.width = (160 * result) + 'px';
// создаем новый масив
for (let i = 0; i < result * result; i++) {
newArr[i] = Math.trunc(i / 2) + 1
}
// перемешиваем масив
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
shuffle(newArr);
// создаем div .card
function getListContent() {
let fragment = new DocumentFragment();
for (let i = 0; i < result * result; i++) {
let card = document.createElement("div");
card.classList.add('card');
card.dataset.number = newArr[i];
fragment.append(card);
}
return fragment;
}
wrapperCards.append(getListContent()); // (*)
// находим .card
let cardInDom = document.querySelectorAll(".card");
// вызываем функцию по клику на .card и показываем цифру
let temp;
for (let card of cardInDom) {
card.onclick = () => {
if (card.classList.contains("open")) return;
let cardValue = card.dataset.number;
card.innerHTML = cardValue;
if (temp && temp != card) {
if (temp.dataset.number == cardValue) {
temp.classList.add("open");
card.classList.add("open");
temp = null;
if (document.querySelectorAll(".card.open").length === result * result) {
andGame();
clearInterval(interval);
}
} else {
document.querySelector('.wrapper-cards').classList.add('disabled');
setTimeout(()=>{
card.innerHTML = "";
temp.innerHTML = "";
temp = null;
document.querySelector('.wrapper-cards').classList.remove('disabled');},
500);
}
} else temp = card;
};
};
let interval = setInterval(function() {
timeInterval = parseFloat(time.textContent)
if (timeInterval <= 0) {
clearInterval(interval);
andGame();
} else {
time.textContent = timeInterval - 1
};
}, 1000);
};
// закнчиваем игру
const andGame = function() {
modalEnd.classList.add('modal-end');
document.body.append(modalEnd);
buttonGame.classList.add('button-game');
modalEnd.append(buttonGame);
buttonGame.append(document.createTextNode("Начать заново"));
}
// начинаеем игру
buttonGame.onclick = function() {
modalEnd.remove();
buttonGame.innerHTML = ''
time.textContent = 60
timeInterval = parseFloat(time.textContent)
button.onclick()
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <link rel="stylesheet" href="style.css"> -->
<title>Document</title>
<style>
.wrapper-cards {
display: flex;
flex-wrap: wrap;
margin-top: 40px;
}
.wrapper-cards.disabled * {
pointer-events: none;
}
.card {
width: 120px;
height: 120px;
margin-right: 35px;
margin-bottom: 35px;
border: 2px solid black;
text-align: center;
font-size: 128px;
cursor: pointer;
}
.card:hover {
box-shadow: 0 0 5px #2f2d2d;
}
.modal-end {
position: absolute;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(255, 255, 255, 0.9);
z-index: 100;
}
.button-game {
background-color: sandybrown;
padding: 20px;
border-radius: 30px;
cursor: pointer;
}
.button-game:hover {
background-color: rgb(173, 133, 98);
}
</style>
</head>
<body>
<div class="wrapper">
<input class="input" value="4" type="number" min="4" max="10">
<button class="button">Начать игру</button>
</div>
<h2 class="">Время игры <span class="time">60</span> сек</h2>
<div class="wrapper-cards">
<!-- <div class="card"></div>
<div class="card"></div>
<div class="card"></div>
<div class="card"></div> -->
</div>
<script src="main.js"></script>
</body>
</html>