我正在创建图块交换难题,并且在编写JavaScript后遇到了一个问题。我的拼图完全不会洗牌。我想确保在加载页面时解决了难题,以便用户可以使用按钮将其随机播放。我想知道我的初始化函数是否与问题有关,因为它应该在一开始就显示出已解决的难题。我该如何解决?
链接到jsfiddle:https://jsfiddle.net/Relativ/5fvx8meL/13/#&togetherjs=r5Em1xsJQS
var selPieces = [];
var allPieces = document.getElementById("img-holder");
function initialize()
{
orderArray = []
for (var i = 0; i < allPieces.length; i++)
{
orderArray.push(i+1)
}
}
function shuffle()
{
for (var i = 0; i < allSlices.length; i++)
{
allPieces.addEventListener('click',selectMe)
var rand = Math.floor(Math.random()*orderArray.length)
allPieces[i].style.order = orderArray[rand];
orderArray.splice(rand,1);
}
}
function selectMe(){
this.style.border = "2px solid green";
selPieces.push(this);
if(selPieces.length === 2){
// get order of clicks
let orderFirst = allPieces[i];
let orderSecond = allPieces[i]
//reoreder
selPieces[0].style.order = orderSecond;
selPiece[1].style.order = orderFirst;
selPiece[0].style.border = "none";
selPiece[1].style.border = "none";
// reset
selPieces.length = 0;
checkIsComplete()
}
}
function checkIsComplete(){
let currentDiv = document.getElementById('.'+currentView);
allPieces = document.getElementById("img-holder");
let correctOrder = [];
for (let i = 0; i < allPieces.length; i++) {
correctOrder.push(i+1)
}
let currentOrder = [];
for (let i = 0; i < allPieces.length; i++) {
const piece = allPieces[i];
currentOrder.push
}
if(currentOrder.toString() == correctOrder.toString()){
let activeLink = document.getElementById("active");
activeLink.classList.add('finished');
currentDiv.style.border = "5px solid green";
currentDiv.style.boxShadow = "0 0 16px green";
alert("Winner! ... Press Start and Play Again");
}
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: radial-gradient(#9D5900, #3D2200);
}
.game-container {
display: grid;
grid-template-columns: repeat(4, auto);
grid-gap: 10px;
margin: 50px;
justify-content: center;
}
.card {
height: 100%;
width: 100%;
}
.img-holder {
flex-basis: 50%;
}
<!DOCTYPE html>
<html>
<title></title>
<link rel="stylesheet" type="text/css" href="PicturePuzzle.css" />
<script src="PicturePuzzle.js" type="text/javascript"></script>
<head>
<body onload = "initialize()">
<div class="game-container">
<div class="img-holder"><img class="card" src="char1.jpg"></div>
<div class="img-holder"><img class="card" src="char2.jpg"></div>
<div class="img-holder"><img class="card" src="char3.jpg"></div>
<div class="img-holder"><img class="card" src="char4.jpg"></div>
<div class="img-holder"><img class="card" src="char5.jpg"></div>
<div class="img-holder"><img class="card" src="char6.jpg"></div>
<div class="img-holder"><img class="card" src="char7.jpg"></div>
<div class="img-holder"><img class="card" src="char8.jpg"></div>
<div class="img-holder"><img class="card" src="char9.jpg"></div>
<div class="img-holder"><img class="card" src="char10.jpg"></div>
<div class="img-holder"><img class="card" src="char11.jpg"></div>
<div class="img-holder"><img class="card" src="char12.jpg"></div>
<div class="img-holder"><img class="card" src="char13.jpg"></div>
<div class="img-holder"><img class="card" src="char14.jpg"></div>
<div class="img-holder"><img class="card" src="char15.jpg"></div>
<div class="img-holder"><img class="card" src="char16.jpg"></div>
</div>
<button style="width: 100px; height: 50px;" onclick = "shuffle()">Shuffle</button>
</div>
</body>
</head>
</html>
答案 0 :(得分:2)
我发现了4个与改组有关的错误,这些错误未使代码中的片段随机化。首先,您使用getElementsById
而不是getElementsByClassName
,后者将仅返回一个元素(不是因为img-holder
是一个类而不是id),因此长度是不确定的。其次,您没有在shuffle
函数中调用initialize
。第三,在for循环中,即使变量名为allSlices.length
,也正在使用allPieces
。第四,即使这是一个数组,也要执行allPieces.addEventListener
,所以请使用allPieces[i].addEventListener
。
var selPieces = [];
var allPieces = document.getElementsByClassName("img-holder"); // FIRST
function initialize()
{
orderArray = []
for (var i = 0; i < allPieces.length; i++)
{
orderArray.push(i+1)
}
shuffle() // SECOND
}
function shuffle()
{
for (var i = 0; i < allPieces.length; i++) //THIRD
{
allPieces[i].addEventListener('click',selectMe) // FOURTH
var rand = Math.floor(Math.random()*orderArray.length)
allPieces[i].style.order = orderArray[rand];
orderArray.splice(rand,1);
}
}
function selectMe(){
this.style.border = "2px solid green";
selPieces.push(this);
if(selPieces.length === 2){
// get order of clicks
let orderFirst = allPieces[i];
let orderSecond = allPieces[i]
//reoreder
selPieces[0].style.order = orderSecond;
selPiece[1].style.order = orderFirst;
selPiece[0].style.border = "none";
selPiece[1].style.border = "none";
// reset
selPieces.length = 0;
checkIsComplete()
}
}
function checkIsComplete(){
let currentDiv = document.getElementById('.'+currentView);
allPieces = document.getElementById("img-holder");
let correctOrder = [];
for (let i = 0; i < allPieces.length; i++) {
correctOrder.push(i+1)
}
let currentOrder = [];
for (let i = 0; i < allPieces.length; i++) {
const piece = allPieces[i];
currentOrder.push
}
if(currentOrder.toString() == correctOrder.toString()){
let activeLink = document.getElementById("active");
activeLink.classList.add('finished');
currentDiv.style.border = "5px solid green";
currentDiv.style.boxShadow = "0 0 16px green";
alert("Winner! ... Press Start and Play Again");
}
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: radial-gradient(#9D5900, #3D2200);
}
.game-container {
display: grid;
grid-template-columns: repeat(4, auto);
grid-gap: 10px;
margin: 50px;
justify-content: center;
}
.card {
height: 100%;
width: 100%;
}
.img-holder {
flex-basis: 50%;
}
<!DOCTYPE html>
<html>
<title></title>
<link rel="stylesheet" type="text/css" href="PicturePuzzle.css" />
<script src="PicturePuzzle.js" type="text/javascript"></script>
<head>
<body onload = "initialize()">
<div class="game-container">
<div class="img-holder"><img class="card" src="char1.jpg"></div>
<div class="img-holder"><img class="card" src="char2.jpg"></div>
<div class="img-holder"><img class="card" src="char3.jpg"></div>
<div class="img-holder"><img class="card" src="char4.jpg"></div>
<div class="img-holder"><img class="card" src="char5.jpg"></div>
<div class="img-holder"><img class="card" src="char6.jpg"></div>
<div class="img-holder"><img class="card" src="char7.jpg"></div>
<div class="img-holder"><img class="card" src="char8.jpg"></div>
<div class="img-holder"><img class="card" src="char9.jpg"></div>
<div class="img-holder"><img class="card" src="char10.jpg"></div>
<div class="img-holder"><img class="card" src="char11.jpg"></div>
<div class="img-holder"><img class="card" src="char12.jpg"></div>
<div class="img-holder"><img class="card" src="char13.jpg"></div>
<div class="img-holder"><img class="card" src="char14.jpg"></div>
<div class="img-holder"><img class="card" src="char15.jpg"></div>
<div class="img-holder"><img class="card" src="char16.jpg"></div>
</div>
<button style="width: 100px; height: 50px;" onclick = "shuffle()">Shuffle</button>
</div>
</body>
</head>
</html>
编辑:修复所有错误后的最终代码:
var selPieces = [];
var allPieces = document.getElementsByClassName("img-holder");
function initialize()
{
orderArray = []
for (var i = 0; i < allPieces.length; i++)
{
orderArray.push(i+1)
}
shuffle();
}
function shuffle()
{
for (var i = 0; i < allPieces.length; i++)
{
allPieces[i].addEventListener('click',selectMe);
var rand = Math.floor(Math.random()*orderArray.length);
allPieces[i].style.order = orderArray[rand];
orderArray.splice(rand,1);
}
}
function selectMe(){
this.style.border = "2px solid green";
selPieces.push(this);
if(selPieces.length === 2){
// get order of clicks
let orderFirst = selPieces[0].style.order;
let orderSecond = selPieces[1].style.order;
//reoreder
selPieces[0].style.order = orderSecond;
selPieces[1].style.order = orderFirst;
selPieces[0].style.border = "none";
selPieces[1].style.border = "none";
// reset
selPieces.length = 0;
checkIsComplete();
}
}
function checkIsComplete(){
let currentDiv = document.getElementsByClassName("game-container")[0];
allPieces = document.getElementsByClassName("img-holder");
let correctOrder = [];
for (let i = 0; i < allPieces.length; i++) {
correctOrder.push(i+1)
}
let currentOrder = [];
for (let i = 0; i < allPieces.length; i++) {
const piece = allPieces[i].style.order;
currentOrder.push(piece)
}
if(currentOrder.toString() == correctOrder.toString()){
//let activeLink = document.getElementById("active");
//activeLink.classList.add('finished');
currentDiv.style.border = "5px solid green";
currentDiv.style.boxShadow = "0 0 16px green";
alert("Winner! ... Press Shuffle and Play Again");
}
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: radial-gradient(#9D5900, #3D2200);
}
.game-container {
display: grid;
grid-template-columns: repeat(4, auto);
grid-gap: 10px;
margin: 50px;
justify-content: center;
}
.card {
height: 100%;
width: 100%;
}
.img-holder {
flex-basis: 50%;
}
<!DOCTYPE html>
<html>
<title></title>
<link rel="stylesheet" type="text/css" href="PicturePuzzle.css" />
<script src="PicturePuzzle.js" type="text/javascript"></script>
<head>
<body onload = "initialize()">
<div class="game-container">
<div class="img-holder"><img class="card" src="char1.jpg"></div>
<div class="img-holder"><img class="card" src="char2.jpg"></div>
<div class="img-holder"><img class="card" src="char3.jpg"></div>
<div class="img-holder"><img class="card" src="char4.jpg"></div>
<div class="img-holder"><img class="card" src="char5.jpg"></div>
<div class="img-holder"><img class="card" src="char6.jpg"></div>
<div class="img-holder"><img class="card" src="char7.jpg"></div>
<div class="img-holder"><img class="card" src="char8.jpg"></div>
<div class="img-holder"><img class="card" src="char9.jpg"></div>
<div class="img-holder"><img class="card" src="char10.jpg"></div>
<div class="img-holder"><img class="card" src="char11.jpg"></div>
<div class="img-holder"><img class="card" src="char12.jpg"></div>
<div class="img-holder"><img class="card" src="char13.jpg"></div>
<div class="img-holder"><img class="card" src="char14.jpg"></div>
<div class="img-holder"><img class="card" src="char15.jpg"></div>
<div class="img-holder"><img class="card" src="char16.jpg"></div>
</div>
<button style="width: 100px; height: 50px;" onclick = "shuffle()">Shuffle</button>
</div>
</body>
</head>
</html>