javascript - 扫描记忆游戏中是否进行了所有匹配
问题描述
我用 6 辆车(3 场比赛)制作了一个记忆游戏。我想做的东西是所有 3 场比赛都让你听到胜利的声音 ( win.play()
)。所以我需要一个 if 语句来扫描是否完成了所有 3 个匹配项,然后播放音频。但我不知道如何扫描是否匹配。
const cards = document.querySelectorAll('.memory-card');
let hasFlippedCard = false;
let lockBoard = false;
let firstCard, secondCard;
function flipCard() {
if (lockBoard) return;
if (this === firstCard) return;
this.classList.add('flip');
if (!hasFlippedCard) {
hasFlippedCard = true;
firstCard = this;
return;
}
secondCard = this;
checkForMatch();
}
function checkForMatch() {
let isMatch = firstCard.dataset.framework === secondCard.dataset.framework;
isMatch ? disableCards() : unflipCards();
}
function disableCards() {
firstCard.removeEventListener('click', flipCard);
secondCard.removeEventListener('click', flipCard);
resetBoard();
}
function unflipCards() {
lockBoard = true;
setTimeout(() => {
firstCard.classList.remove('flip');
secondCard.classList.remove('flip');
resetBoard();
}, 1200);
}
function resetBoard() {
[hasFlippedCard, lockBoard] = [false, false];
[firstCard, secondCard] = [null, null];
}
(function shuffle() {
cards.forEach(card => {
let randomPos = Math.floor(Math.random() * 6);
card.style.order = randomPos;
});
})();
cards.forEach(card => card.addEventListener('click', flipCard));
// if ..... {
// win.play();
// }
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
height: 50vh;
display: flex;
background-image: url("img/achtergrond.png");
}
.memory-game {
width: 700px;
height: 500px;
margin: auto;
display: flex;
flex-wrap: wrap;
perspective: 1000px;
}
.memory-card {
width: calc(33% - 10px);
height: calc(50% - 10px);
margin: 5px;
position: relative;
transform: scale(1);
transform-style: preserve-3d;
transition: transform .5s;
box-shadow: 1px 1px 1px rgba(0,0,0,.3);
}
.memory-card:active {
transform: scale(0.97);
transition: transform .2s;
}
.memory-card.flip {
transform: rotateY(180deg);
}
.front-face,
.back-face {
width: 100%;
height: 100%;
padding: 20px;
position: absolute;
border-radius: 5px;
background: #DFD7CB;
backface-visibility: hidden;
}
.front-face {
transform: rotateY(180deg);
}
<body>
<section class="memory-game">
<div class="memory-card" data-framework="ember">
<img class="front-face" src="img/banaan.png" alt="banaan" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="ember">
<img class="front-face" src="img/banaan.png" alt="banaan" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="backbone">
<img class="front-face" src="img/bril.png" alt="bril" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="backbone">
<img class="front-face" src="img/bril.png" alt="bril" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="react">
<img class="front-face" src="img/vogel.png" alt="vogel" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="react">
<img class="front-face" src="img/vogel.png" alt="vogel" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
</section>
<script src="script.js"></script>
<audio id="win" src="media/win.wav"></audio>
</body>
所以我需要一些东西(一个 if 语句),如果所有 3 场比赛都进行,那么胜利的声音就会win.play()
播放。
解决方案
您可以定义一个变量allMatched
并在找到匹配项时增加其值。然后在 resetBoard 函数中,您可以检查是否allMatched
等于卡长度的一半,然后运行音频。
const cards = document.querySelectorAll('.memory-card');
let hasFlippedCard = false;
let lockBoard = false;
let allMatched = 0;
let firstCard, secondCard;
function flipCard() {
if (lockBoard) return;
if (this === firstCard) return;
this.classList.add('flip');
if (!hasFlippedCard) {
hasFlippedCard = true;
firstCard = this;
return;
}
secondCard = this;
checkForMatch();
}
function checkForMatch() {
let isMatch = firstCard.dataset.framework === secondCard.dataset.framework;
isMatch ? disableCards() : unflipCards();
}
function disableCards() {
firstCard.removeEventListener('click', flipCard);
secondCard.removeEventListener('click', flipCard);
allMatched++;
resetBoard();
}
function unflipCards() {
lockBoard = true;
setTimeout(() => {
firstCard.classList.remove('flip');
secondCard.classList.remove('flip');
resetBoard();
}, 1200);
}
function resetBoard() {
[hasFlippedCard, lockBoard] = [false, false];
[firstCard, secondCard] = [null, null];
if (allMatched == cards.length/2) {
win.play();
}
}
(function shuffle() {
cards.forEach(card => {
let randomPos = Math.floor(Math.random() * 6);
card.style.order = randomPos;
});
})();
cards.forEach(card => card.addEventListener('click', flipCard));
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
body {
height: 50vh;
display: flex;
background-image: url("img/achtergrond.png");
}
.memory-game {
width: 700px;
height: 500px;
margin: auto;
display: flex;
flex-wrap: wrap;
perspective: 1000px;
}
.memory-card {
width: calc(33% - 10px);
height: calc(50% - 10px);
margin: 5px;
position: relative;
transform: scale(1);
transform-style: preserve-3d;
transition: transform .5s;
box-shadow: 1px 1px 1px rgba(0,0,0,.3);
}
.memory-card:active {
transform: scale(0.97);
transition: transform .2s;
}
.memory-card.flip {
transform: rotateY(180deg);
}
.front-face,
.back-face {
width: 100%;
height: 100%;
padding: 20px;
position: absolute;
border-radius: 5px;
background: #DFD7CB;
backface-visibility: hidden;
}
.front-face {
transform: rotateY(180deg);
}
<section class="memory-game">
<div class="memory-card" data-framework="ember">
<img class="front-face" src="img/banaan.png" alt="banaan" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="ember">
<img class="front-face" src="img/banaan.png" alt="banaan" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="backbone">
<img class="front-face" src="img/bril.png" alt="bril" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="backbone">
<img class="front-face" src="img/bril.png" alt="bril" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="react">
<img class="front-face" src="img/vogel.png" alt="vogel" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
<div class="memory-card" data-framework="react">
<img class="front-face" src="img/vogel.png" alt="vogel" />
<img class="back-face" src="img/vraagteken.png" alt="?" />
</div>
</section>
<audio id="win" src="media/win.wav"></audio>
推荐阅读
- r - R:par(cex.lab=2) 在 plot(effect(),…) 中不起作用
- cakephp - How to add field value on RulesChecker message
- java - XOR Neural Net converges to 0.5
- java - 如何在android上将kotlin转换为java?
- excel - 如何将PETREL中的地震属性导出为excel格式?
- html - 浏览按钮,将在 html 中显示本地目录文件夹中的图像文件
- shopify - Shopify 应用列表存在问题
- python - 如何让我的 PATH 在 ZSH 中更简洁?
- wireshark - Wireshark 仅在 ubuntu14.04 中捕获 802.11 信标和 probresponce
- css - 从文本区域的中间开始输入不适用于离子