前提・実現したいこと
ネットの記事を参考にしながら、JavaScriptで簡単なスライドパズル(1から15の数字パネルを小さい順に並び替えるもの)を作っています。本体のプログラムはほぼ完成していますが、クリア時に表示されるはずのアラートが正しく動作せず、ハイスコアを取れても取れなくても通常スコアアラートしか現れず、保存もされません。
発生している問題・エラーメッセージ
Windows10のEdgeでテストプレイしていますが、エラーメッセージは表示されません。
該当のソースコード
JavaScript
1'use strict'; 2 3// グローバル変数 4var clickCount = 0; 5 6window.onload = function() { 7// ハイスコアの取得 8if(localStorage.getItem('slydScore')) { 9var slydHigh = Number(localStorage.getItem('slydScore')); 10} else { 11var slydHigh = 0; 12} 13var size = 4; 14var shuffleCount; 15var panels; 16var isShuffled; 17var table = document.getElementById('table'); 18var msgBox = document.getElementById('msgBox'); 19var startBt = document.getElementById('startBt'); 20 21// ボード初期化 22function init() { 23shuffleCount = size * 1000; 24isShuffled = false; 25panels = []; 26table.textContent = null; 27msgBox.textContent = '0'; 28createStage(); 29} 30 31function createStage() { 32for(var i=0;i<size;i++) { 33var tr = document.createElement('tr'); 34for(var j=0;j<size;j++) { 35var td = document.createElement('td'); 36var index = i * size + j; 37td.posId = index; 38td.textContent = index == size * size - 1 ? "": index + 1; 39td.onclick = click; 40if(index == size * size - 1) { 41td.classList.add('empty'); 42td.textContent = '★'; 43} 44panels.push(td); 45tr.appendChild(td); 46} 47table.appendChild(tr); 48} 49} 50startBt.addEventListener("click",function(){ 51if(isShuffled == false) { 52alert('SLYD(スライド)へようこそ!数字パネルを空きマスへスライドして、左上(1)から全てのパネルを順番に並び変えてください。「NEW GAME」ぼたんを押すと新規ゲームが開始されます。\nハイスコア: ' + slydHigh + 'クリック'); 53init(); 54shuffle(shuffleCount); 55} else { 56let checkRestart = window.confirm('本当にボードを初期化しても宜しいでしょうか?このゲームの得点は失われ、パネルの並びはシャッフルされます。'); 57if(checkRestart == true) { 58init(); 59shuffle(shuffleCount); 60} 61} 62}); 63 64// ボードのシャッフル 65function shuffle(shuffleCount) { 66for(var i=0;i<shuffleCount;i++) { 67click({target:{posId:Math.floor(Math.random() * size * size)}}); 68} 69isShuffled = true; 70} 71clickCount = 0; 72// パネルクリック時の処理 73function click(e) { 74// ボードがシャッフル済みの場合、クリック回数をカウントするclickCountに1ずつ追加。 75if(isShuffled == true) { 76clickCount += 1; 77msgBox.textContent = clickCount; 78} 79var pos=e.target.posId; 80if(pos - size >= 0 && panels[pos - size].textContent == '★') { 81swap(pos, pos - size); 82} else if(pos + size < size * size && panels[pos + size].textContent == '★') { 83swap(pos, pos + size); 84} else if((pos + 1) % size != 0 && panels[pos + 1].textContent == '★') { 85swap(pos, pos + 1); 86} else if(pos % size != 0 && panels[pos - 1].textContent == '★') { 87swap(pos, pos - 1); 88} 89window.setTimeout(function () { document.getElementById('click-tile').play(); },5); 90} 91function swap(p1, p2) { 92var temp = panels[p1].textContent; 93panels[p1].textContent = panels[p2].textContent; 94panels[p2].textContent = temp; 95 96panels[p1].classList.add('empty'); 97panels[p2].classList.remove('empty'); 98check(); 99} 100// パネル位置の判定 101function check(){ 102var okCount=0; 103for(var i=0;i<panels.length;i++) { 104if(panels[i].posId == parseInt(panels[i].textContent) - 1) { 105okCount++; 106panels[i].classList.add("ok"); 107} else { 108panels[i].classList.remove('ok'); 109} 110} 111// クリア判定 112if(isShuffled && okCount === size * size - 1) { 113// クリック数とハイスコアを比較、結果に応じてアラートと効果音を変更する。 114var slydHigh; 115if(localStorage.getItem('slydScore')) { 116slydHigh = Number(localStorage.getItem('slydScore')); 117} else { 118slydHigh = 0; 119} 120if(slydHigh = 0) { 121localStorage.setItem('slydScore', clickCount); 122document.getElementById('success').play(); 123window.setTimeout(function () { alert('初クリアおめでとうございます。' + clickCount + 'クリックでパズルを完成しました。'); },800); 124} else if(clickCount < slydHigh) { 125localStorage.setItem('slydScore', clickCount); 126document.getElementById('high-score').play(); 127window.setTimeout(function () { alert('おめでとうございます、' + clickCount + 'クリックでパズルを完成、ハイスコアを更新しました!'); },800); 128} else if(clickCount >= slydHigh) { 129document.getElementById('success').play(); 130window.setTimeout(function () { alert('おめでとうございます、' + clickCount + 'クリックでパズルを完成しました。現在のハイスコアは' + localStorage.getItem('slydScore') + 'です。'); },800); 131} 132isShuffled = false; 133 } 134 } 135 136 init(); 137};
試したこと
コード後半、slydHighの宣言をif文の内側へ移動する、slydHighをグローバル変数に変えてコードの前半と後半の両方で呼び出すなどを試してみました。ゲーム開始時のハイスコア通知は正しく動作しているようなので、宣言もしくは変数そのものを揃えてみようとしたためです。
誤っている箇所、修正方法など教えて頂ければ幸いです。宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー