javascript - 我希望循环只运行一次 - JavaScript
问题描述
我希望运行这个游戏一次,然后在任务完成后链接到另一个 html 页面。但是,一旦用户成功完成挑战,此游戏就会重复。
我只想玩一次游戏。如果需要,我可以上传 html 和 css 文件。
希望有人可以解决这个问题,如果需要,我可以上传 html 和 css 文件。虽然这些都比较简单。
const onSectionClick = event => {
event.preventDefault()
const cardClicked = event.composedPath().find(element => (
[...element.classList].includes('card')))
if (!cardClicked.disabled) {
cardClicked.disabled = true
const currentRotation = cardClicked.dataset.rotation
const newRotation = `${Number(currentRotation) + 1}`
cardClicked.dataset.rotation = newRotation
if (newRotation === "4") {
const imageFragment = cardClicked.querySelector('.imageFragment')
cardClicked.addEventListener('transitionend', () => {
imageFragment.style.transitionDuration = "0s"
requestAnimationFrame(() => {
cardClicked.dataset.rotation = "0"
requestAnimationFrame(() => {
imageFragment.style.transitionDuration = ""
})
})
}, {
once: true
})
}
const allCards = [...document.querySelectorAll('.card')]
const isPuzzleComplete = allCards.every(card => ["0", "4"].includes(card.dataset.rotation))
if (isPuzzleComplete) {
allCards.forEach(card => card.disabled = true)
setTimeout(() => {
index += 1
if (index === puzzles.length) {
index = 0
}
tableOnStart(puzzles[index], 3)
}, 3000)
} else {
cardClicked.addEventListener('transitionend', () => {
cardClicked.disabled = false
}, {
once: true
})
}
}
}
const tableOnStart = (puzzle, size = 4) => {
const getRandomRotation = () => Math.floor(Math.random() * 4)
const renderCard = (x, y) => `
<button class="card" data-rotation="${getRandomRotation()}" style="width: ${(80 / size)}vmin; height: ${(80 / size)}vmin;">
<div class="imageFragment" style=" background-image: url('https://i.imgur.com/z2VZELB.jpeg'); background-position: ${y * (100 / (size - 1))}% ${x * (100 / (size - 1))}%; background-size: ${(size) * 100}% ${(size) * 100}%;
"
></div>
</button>
`
const renderRow = children => `
<div class="row">${children}</div>
`
const indices = Array.from(Array(size).keys())
const boardHTML = indices.map(rowIndex => (
renderRow(
indices.map(columnIndex => (
renderCard(rowIndex, columnIndex)
)).join('')
)
)).join('')
document.getElementById('board').innerHTML = boardHTML
document.querySelectorAll('.card').forEach(card => {
card.addEventListener('click', onSectionClick)
card.addEventListener('contextmenu', onSectionClick)
card.addEventListener('auxclick', onSectionClick)
})
}
const puzzles = [
'floorMap'
]
let index = Math.floor(Math.random() * puzzles.length)
tableOnStart(puzzles[index], 3)
document.addEventListener('click', {
once: true
})
* {
padding: 0;
margin: 0;
box-sizing: border-box;
user-select: none;
font-size: 0;
}
html,
body {
height: 100%;
}
#board {
background-image: url("https://images.unsplash.com/photo-1523861751938-121b5323b48b?ixid=MXwxMjA3fDB8MHxzZWFyY2h8Mnx8ZmlyZXxlbnwwfHwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=60");
;
background-size: cover;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
@keyframes fadeIn {
from {
transform: scale(0.2);
}
to {
transform: scale(1);
}
}
.card {
margin: 2px;
background-color: transparent;
transition: transform 2s;
animation-duration: 0.3s;
animation-name: fadeIn;
}
.imageFragment {
width: 100%;
height: 100%;
transition: transform 0.4s;
}
.card[data-rotation="0"] .imageFragment {
transform: rotate(0deg);
}
.card[data-rotation="1"] .imageFragment {
transform: rotate(90deg);
}
.card[data-rotation="2"] .imageFragment {
transform: rotate(180deg);
}
.card[data-rotation="3"] .imageFragment {
transform: rotate(270deg);
}
.card[data-rotation="4"] .imageFragment {
transform: rotate(360deg);
}
<div id="board"></div>
解决方案
只需这样做:
if (isPuzzleComplete) {
allCards.forEach(card => card.disabled = true)
setTimeout(() => {
index += 1
if (index === puzzles.length) {
// index = 0
alert("DONE!")
window.location.replace("https://stackoverflow.com/");
}
else tableOnStart(puzzles[index], 3)
}, 1000)
const onSectionClick = event => {
event.preventDefault()
const cardClicked = event.composedPath().find(element => (
[...element.classList].includes('card')))
if (!cardClicked.disabled) {
cardClicked.disabled = true
const currentRotation = cardClicked.dataset.rotation
const newRotation = `${Number(currentRotation) + 1}`
cardClicked.dataset.rotation = newRotation
if (newRotation === "4") {
const imageFragment = cardClicked.querySelector('.imageFragment')
cardClicked.addEventListener('transitionend', () => {
imageFragment.style.transitionDuration = "0s"
requestAnimationFrame(() => {
cardClicked.dataset.rotation = "0"
requestAnimationFrame(() => {
imageFragment.style.transitionDuration = ""
})
})
}, {
once: true
})
}
const allCards = [...document.querySelectorAll('.card')]
const isPuzzleComplete = allCards.every(card => ["0", "4"].includes(card.dataset.rotation))
if (isPuzzleComplete) {
allCards.forEach(card => card.disabled = true)
setTimeout(() => {
index += 1
if (index === puzzles.length) {
alert("DONE!")
window.location.replace("https://stackoverflow.com/");
} else tableOnStart(puzzles[index], 3)
}, 1000)
} else {
cardClicked.addEventListener('transitionend', () => {
cardClicked.disabled = false
}, {
once: true
})
}
}
}
const tableOnStart = (puzzle, size = 4) => {
const getRandomRotation = () => Math.floor(Math.random() * 4)
const renderCard = (x, y) => `
<button class="card" data-rotation="${getRandomRotation()}" style="width: ${(80 / size)}vmin; height: ${(80 / size)}vmin;">
<div class="imageFragment" style=" background-image: url('https://i.imgur.com/z2VZELB.jpeg'); background-position: ${y * (100 / (size - 1))}% ${x * (100 / (size - 1))}%; background-size: ${(size) * 100}% ${(size) * 100}%;
"
></div>
</button>
`
const renderRow = children => `
<div class="row">${children}</div>
`
const indices = Array.from(Array(size).keys())
const boardHTML = indices.map(rowIndex => (
renderRow(
indices.map(columnIndex => (
renderCard(rowIndex, columnIndex)
)).join('')
)
)).join('')
document.getElementById('board').innerHTML = boardHTML
document.querySelectorAll('.card').forEach(card => {
card.addEventListener('click', onSectionClick)
card.addEventListener('contextmenu', onSectionClick)
card.addEventListener('auxclick', onSectionClick)
})
}
const puzzles = [
'floorMap'
]
let index = Math.floor(Math.random() * puzzles.length)
tableOnStart(puzzles[index], 3)
document.addEventListener('click', {
once: true
})
* {
padding: 0;
margin: 0;
box-sizing: border-box;
user-select: none;
font-size: 0;
}
html,
body {
height: 100%;
}
#board {
background-image: url("https://images.unsplash.com/photo-1523861751938-121b5323b48b?ixid=MXwxMjA3fDB8MHxzZWFyY2h8Mnx8ZmlyZXxlbnwwfHwwfA%3D%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=60");
;
background-size: cover;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
@keyframes fadeIn {
from {
transform: scale(0.2);
}
to {
transform: scale(1);
}
}
.card {
margin: 2px;
background-color: transparent;
transition: transform 2s;
animation-duration: 0.3s;
animation-name: fadeIn;
}
.imageFragment {
width: 100%;
height: 100%;
transition: transform 0.4s;
}
.card[data-rotation="0"] .imageFragment {
transform: rotate(0deg);
}
.card[data-rotation="1"] .imageFragment {
transform: rotate(90deg);
}
.card[data-rotation="2"] .imageFragment {
transform: rotate(180deg);
}
.card[data-rotation="3"] .imageFragment {
transform: rotate(270deg);
}
.card[data-rotation="4"] .imageFragment {
transform: rotate(360deg);
}
<div id="board"></div>
推荐阅读
- reactjs - 在反应原生中保存状态
- c# - 属性或索引器不能分配给它在 C# 中是只读的
- discord.js - 每台服务器运行一个 Discord bot 实例,因此 bot 不会在每台服务器上打开
- android - Kotlin 程序在将 clickListener 设置为在膨胀的 XML 中定义的按钮时抛出 nullPointerException,不知道该去哪里
- angular - 如何使用 RxJS 将我的二维数组重新映射到目标模式?
- r - 如何解决:R CMD检查报告警告和错误
- arrays - 如何使用 matplotlib 为二维数组中的所有(仅 4 种)类型的值绘制图例?
- javascript - React路由器在导入后呈现空白页面
- docker - Docker 写入服务器安装卷,权限问题
- properties - 找不到基本名称 data1 的捆绑包