質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1183閲覧

JavaScriptを用いて製作中のスライドパズルで、最後のハイスコア表示が正しく動作しません。初心者なので単純・見当違いなミスかもしれませんが、宜しくお願い致します。

numin

総合スコア30

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/23 12:26

編集2021/07/23 12:49

前提・実現したいこと

ネットの記事を参考にしながら、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をグローバル変数に変えてコードの前半と後半の両方で呼び出すなどを試してみました。ゲーム開始時のハイスコア通知は正しく動作しているようなので、宣言もしくは変数そのものを揃えてみようとしたためです。

誤っている箇所、修正方法など教えて頂ければ幸いです。宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2021/07/23 15:14

> 保存もされません。 これは何を指して言っているのでしょうか? リロードしたら、情報が失われる、ということでしょうか?
numin

2021/07/23 15:26

コメント頂きありがとうございます。保存されないというのはハイスコア(slydHigh)がlocalStorageに保存できないという意味で書きました。ボードを初期化してスタートボタン(startBt)を押した際、localStorage.getItemでハイスコアを取得できず0となっているため、そう思いました。
guest

回答1

0

ベストアンサー

クリア判定の1つ目のif判定が比較ではなく代入になっている?
if (slydHigh = 0) {

javascript

1if (slydHigh = 0) { // == or === の必要がある 2 localStorage.setItem('slydScore', clickCount); 3 document.getElementById('success').play(); 4 window.setTimeout(function() { 5 alert('初クリアおめでとうございます。' + clickCount + 'クリックでパズルを完成しました。'); 6 }, 800); 7} else if (clickCount < slydHigh) { 8...

投稿2021/07/23 16:24

webgoto

総合スコア1293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

numin

2021/07/23 17:10

ご丁寧に説明して頂きありがとうございます。何十回も見直していたつもりでしたが、基礎の演算子を間違えてしまっていたんですね。たしかに条件分岐させたいところで代入演算子を使っていたら0にしかならないですよね。 訂正後、無事動作するようになりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問