###前提・実現したいこと
参考書でjavascriptを学習中です。サンプルとして、15パズルがあったので作ってみました。クリア処理を追加で実装しようと考えたのですが、どういった風に判定させればいいか、調べて考えても思いつかなかったので、質問させて頂きます。
###発生している問題・エラーメッセージ
・15パズルを完成させた時の判定処理が分からない
・サンプルは数字がランダムで入れ替わるが、何回やってもクリアできない状態(14と15の位置が正解と入れ替わっている)となる
・正解のみのパターンとなるようなコードにできないか...
エラーメッセージ
###該当のソースコード
ここにご自身が実行したソースコードを書いてください
<!DOCTYPE html> <html> <head> <title>15puzzle</title> <meta charset="UTF-8"> <style> .tile{ width:70px; height:70px; border: 1px solid blue; border-radius: 10px; text-align: center; font-size:36px; background-color:white; box-shadow:rgb(128,128,128) 5px 5px; } </style> <script> "use strict"; // 広域変数 var tiles = []; // 初期化関数 function init() { var table = document.getElementById("table"); for (var i = 0; i < 4; i++) { var tr = document.createElement("tr"); // 各行の作成 for (var j = 0; j < 4; j++) { var td = document.createElement("td"); // 4×4作成 var index = i*4 + j; td.className = "tile"; td.index = index; td.value = index; td.textContext = index == 0? "":index; td.onclick = click; tr.appendChild(td); // 子要素(td要素)を追加 tiles.push(td); } table.appendChild(tr); // tableにtr要素を追加 } for (var i = 0; i<1000; i++) { click({ srcElement: {index: Math.floor(Math.random()*16)}}) } } function click(e) { // タイルをクリックした時に空であれば入れ替える var i = e.srcElement.index; // タイルの数字を入れ替える時のロジック if(i - 4>=0 && tiles[i - 4].value == 0) { // タイル上と入れ替え swap(i,i-4); } else if(i + 4< 16 && tiles[i + 4].value == 0) { // タイル下と入れ替え swap(i,i + 4); } else if (i % 4!= 0 && tiles[i - 1].value == 0) { // タイル左隣と入れ替え swap(i,i - 1); } else if (i % 4!= 3 && tiles[i + 1].value == 0) { // タイル右隣と入れ替え swap(i,i + 1); } } function swap(i,j) { var tmp = tiles[i].value; tiles[i].textContent = tiles[j].textContent; tiles[i].value = tiles[j].value; tiles[j].textContent = tmp; tiles[j].value = tmp; } </script> </head> <body onload="init()"> <table id="table"></table> </body> </html>
###試したこと
・他のサイトから、プログラミングで作った15パズルをひたすら確認したが、あまり理解できませんでした。
・for文やif文を織り交ぜて、タイルの数字と位置情報(indexとvalue)を正しいかどうかtrue,falseで判定するというのは想像がつくのですが、実際にどう書いたらいいか分からず、詰まっています...
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
回答2件
あなたの回答
tips
プレビュー