ドットインストール様のサイトを活用させていただきまして、宝箱ゲームを作っています。
ドットインストール様の動画では、箱をクリックすると、「空」、「罠」、「宝」の3種類がランダムに出てくる仕様になっていますが、
それをアレンジして、3つの宝の中身が決して被らないようにしたいと思っています。
オリジナル)宝、罠、罠など重複あり。 目標)罠、空、宝 など被らない。
実際にその目標通り重複無しのランダムは、以下のようにしたら自分で実装できました。しかし、何となく見栄えが悪い気がしてなりません。shuffle処理してから、シャッフル後の配列の0番目を箱の0番目、シャッフル後の1番目を1番目〜。
上を目指したコーディングを行いたいときに、もっといい書き方がある、などアドバイスを頂けると助かります。よろしくお願いいたします。
HTML
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>Treasure Hunt</title> <link rel="stylesheet" href="css/styles.css"> </head> <body> <div class="container"> <div class="boxes"> <img src="img/box.png" width="85" height="100" class="box shake"></img> <img src="img/box.png" width="85" height="100" class="box shake"></img> <img src="img/box.png" width="85" height="100" class="box shake"></img> </div> </div> <script src="js/main.js"></script> </body> </html>
Javascript
(function() { 'use strict'; var boxes = document.getElementsByClassName('box'); const contents = [ 'coin.png', 'empty.png', 'cobra.png', ]; function shuffle(arr){ let i = arr.length - 1; for(i = arr.length - 1; i > 0; i--){ const j = Math.floor(Math.random() * (i + 1)); [arr[j], arr[i]] = [arr[i], arr[j]]; } return arr; } let mixedContents = shuffle(contents); function init() { let i; for (i = 0; i < boxes.length; i++) { boxes[i].addEventListener('click', function() { let j; for (j = 0; j < boxes.length; j++){ boxes[0].src = 'img/' + mixedContents[0]; boxes[1].src = 'img/' + mixedContents[1]; boxes[2].src = 'img/' + mixedContents[2]; // boxes[j].src = 'img/' + contents[Math.floor(Math.random() * contents.length)]; boxes[j].className = 'box disabled'; } this.className = 'box'; }); } } init(); })();