【发布时间】:2020-12-04 21:10:41
【问题描述】:
我似乎找不到我的代码有什么问题。以下是项目的要求:
在本次作业中,您将使用 HTML、CSS 和 JavaScript 在浏览器中构建一个记忆游戏。你的目标是建立一个基于卡片的记忆游戏。 玩家将看到一组卡片,正面朝下,并且可以点击卡片以显示下面的内容。 点击两张牌后,游戏应该检查它们是否匹配。如果他们这样做,他们将保持面朝上。 如果没有,卡片应向玩家显示一秒钟,然后向下翻转。* 游戏的目标是匹配所有对。*
在使用我当前的代码玩游戏时,如果卡片彼此不匹配,它们不会重新出现。我认为我的代码中的最后一个“if else”语句就是原因。我也认为可以通过创建另一个 if 语句来纠正它
[ if (flipCount === 2 & firstCard.style.classList !== secondCard.style.classList) ]
但是当前的 else 语句还不够吗?
const gameContainer = document.getElementById("game");
let hasFlippedCard = false;
let firstCard, secondCard;
let noClicking = false;
const COLORS = [
"red",
"blue",
"green",
"orange",
"purple",
"red",
"blue",
"green",
"orange",
"purple"
];
// here is a helper function to shuffle an array
// it returns the same array with values shuffled
// it is based on an algorithm called Fisher Yates if you want ot research more
function shuffle(array) {
let counter = array.length;
// While there are elements in the array
while (counter > 0) {
// Pick a random index
let index = Math.floor(Math.random() * counter);
// Decrease counter by 1
counter--;
// And swap the last element with it
let temp = array[counter];
array[counter] = array[index];
array[index] = temp;
}
return array;
}
let shuffledColors = shuffle(COLORS);
// this function loops over the array of colors
// it creates a new div and gives it a class with the value of the color
// it also adds an event listener for a click for each card
function createDivsForColors(colorArray) {
for (let color of colorArray) {
// create a new div
const newDiv = document.createElement("div");
// give it a class attribute for the value we are looping over
newDiv.classList.add(color);
// call a function handleCardClick when a div is clicked on
newDiv.addEventListener("click", handleCardClick);
// append the div to the element with an id of game
gameContainer.append(newDiv);
}
}
// TODO: Implement this function!
function handleCardClick(event) {
// console.log(event.target);
if (noClicking) return;
// if the card has been flipped, nothing will happen
if (event.target.classList.contains("flip")) return;
//change background color of card to class name
let selectedColor = event.target.className;
event.target.style.backgroundColor = selectedColor;
// add class name of flip to 1st and 2nd clicked card's class
event.target.classList.add('flip');
//create variable holding the total number of cards flipped (with class name flip)
let flipCount = document.querySelectorAll('div .flip').length;
//define first card and second card variables
if (!hasFlippedCard) {
hasFlippedCard = true;
firstCard = this;
} else {
hasFlippedCard = false;
secondCard = this;
}
// console.log("eventtarget is"); console.dir(event.target);
// console.log("firstcard classname is", firstCard.className);
// console.log("secondcard classname is", secondCard.className)
// console.log("Card is flipped?", hasFlippedCard);
// console.log("First card is", firstCard);
// console.log("Second card is", secondCard);
// console.log("number of flips", flipCount);
// if two cards have flipped and the classes do not match.
// Make no change to new background color
if (flipCount <2) return;
if (flipCount === 2 & firstCard.classList === secondCard.classList) {
function matchedCards(){
firstCard.classList.remove('flip');
secondCard.classList.remove('flip');
}
matchedCards();
}
else {
noClicking = true;
function resetCards(){
firstCard.classList.remove('flip');
secondCard.classList.remove('flip');
firstCard.style.backgroundColor = "";
secondCard.style.backgroundColor = "";
noClicking = false;
}
setTimeout(resetCards, 1000)}
// run resetFlips function after one second
// console.dir(event.target);
}
// when the DOM loads
createDivsForColors(shuffledColors);
#game div {
border: 2px solid black;
width: 15%;
height: 200px;
margin: 10px;
display: inline-block;
background-color: white;
}
h1 {
text-align: center;
}
body {
margin: 0;
background-color: #c9e0e8;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Memory Game!</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>Memory Game!</h1>
<div id="game">
</div>
<script src="script.js"></script>
</body>
</html>
【问题讨论】:
-
javascript AND 运算符是 && 不是 &(它是按位比较器)。
-
谢谢!我改了代码,但是卡在不匹配的时候还是没有翻过来。
-
接下来的事情。直接比较类列表不是一个好主意。尽管它在这种情况下可能有效,也可能无效,但您必须保证类的顺序和(我假设)修剪空格。我认为您使用
.contains的地方要明智得多。 (但这也可能不是您问题的根源) -
我认为比较 classList === classList 可能会比较两个对象是否是 same 对象。您可以尝试使用
==运算符来进行快速测试。如果可能的话,我会尽量坚持使用===运算符...... -
更改为
if (flipCount == 2 && firstCard.className == secondCard.className) {
标签: javascript html if-statement springboard