[英]How do I get my shuffle button to shuffle the pieces in my array?
I am creating a tile swap puzzle and came across a problem after writing my javascript.我正在创建一个瓷砖交换难题,并在编写 javascript 后遇到了一个问题。 My puzzle pieces won't shuffle at all.
我的拼图根本不会洗牌。 I want to make sure the puzzle is solved when the page is loaded so the user can shuffle it using the button.
我想确保在加载页面时解决难题,以便用户可以使用按钮对其进行随机播放。 I was wondering if my initialize function has something to do with the problem since it is supposed to show the solved puzzle in the beginning.
我想知道我的初始化 function 是否与该问题有关,因为它应该在一开始就显示已解决的难题。 How do I tackle this?
我该如何解决这个问题?
Link to the jsfiddle: https://jsfiddle.net/Relativ/5fvx8meL/13/#&togetherjs=r5Em1xsJQS链接到 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>
I identified 4 errors related to shuffle not randomizing the pieces in your code.我发现了 4 个与 shuffle 相关的错误,而不是随机化代码中的片段。 First, you are using
getElementsById
instead of getElementsByClassName
, which would be returning only one element (which it isn't because img-holder
is a class and not id) and so length, is undefined.首先,您使用的是
getElementsById
而不是getElementsByClassName
,这将只返回一个元素(这不是因为img-holder
是 class 而不是 id),因此长度未定义。 Second, you didn't call shuffle
in initialize
function.其次,您没有在
initialize
function 时调用shuffle
。 Third, In the for loop, you are using allSlices.length
even though the variable is named allPieces
.第三,在 for 循环中,您使用的是
allSlices.length
,即使变量名为allPieces
。 Fourth, you are doing allPieces.addEventListener
even though that is an array, so use allPieces[i].addEventListener
.第四,你正在做
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>
EDIT: Final code after fixing all the errors:编辑:修复所有错误后的最终代码:
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.