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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

523閲覧

ルーレット作成のエラーについて

AyeAye

総合スコア1

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/10/27 11:45

前提・実現したいこと

JavaScript、jQueryで16マスのルーレットシステムを作っています。
スタートを押すと1~16がランダムで光り、ストップを押した時に色が変わる。
もう1度スタートを押すと、止まったマス以外がランダムで光る。
これを16回繰り返して、リセットすると元に戻る機能を実装中に以下のエラーが発生しました。

発生している問題

●スタート、ストップを交互に16回押すことで全てのマス目の色がつきません。
一度止まって色がついたマスに止まっているようです。

該当のソースコード

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>12章課題</title> <link rel="stylesheet" href="roulette.css"> <script src="https://code.jquery.com/jquery-1.11.0.min.js"></script> <script> // 変数を定義 var interval_id; var stop_box = 0; var flash_block = 0; var is_start = false; var flash_block_num =0; var block = ['#b_1','#b_2','#b_3','#b_4','#b_5','#b_6','#b_7','#b_8','#b_9','#b_10','#b_11','#b_12','#b_13','#b_14','#b_15','#b_16']; //startをClickした時に実行 function flash_start () { if (is_start === false) { is_start = true; flash_box(); interval_id = setInterval(flash_box, 500); //startの二度押し不可でstopが押せるようになる $('#start').prop('disabled', true); $('#stop').prop('disabled', false); } } function flash_box() { //色が変わってる時だけcssを外す if (flash_block !== 0) { $(flash_block).removeClass('b_color'); } //block1~16をランダムに色を変える flash_block_num = Math.floor(Math.random() * block.length);//配列の数だけを取り出す flash_block = block[ flash_block_num ];//配列の中のblockを指定 $(flash_block).addClass('b_color');//blockのみ色を変える } //stopを押した時に実行 function flash_stop() { // setIntervalによる繰り返し動作を停止 clearInterval(interval_id); stop_box = flash_block; //配列の中のblockを代入 //選択したblockの色を変える $(stop_box).addClass('s_color'); //配列から取り出した数を削除する block.splice(flash_block_num, 1); $('#start').prop('disabled',block.length<=0); $('#stop').prop('disabled',true); $('#reset').prop('disabled',false); is_start = false; } //resetを押した時に実行 function flash_reset() { // setIntervalによる繰り返し動作を停止 clearInterval(interval_id); //全てのcssを削除 $('div').removeClass('b_color'); $('div').removeClass('s_color'); $('#stop').prop('disabled', true); $('#start').prop('disabled', false); //配列を元に戻す block.push('#b_1','#b_2','#b_3','#b_4','#b_5','#b_6','#b_7','#b_8','#b_9','#b_10','#b_11','#b_12','#b_13','#b_14','#b_15','#b_16'); is_start = false; }
window.onload = function() { $('#start').prop('disabled', false); $('#reset').prop('disabled', false); $('#stop').prop('disabled', true); $('#start').click(flash_start); $('#stop').click(flash_stop); $('#reset').click(flash_reset); }
</script> </head> <body> <div id="large_block"> <div id="b_1">1</div> <div id="b_2">2</div> <div id="b_3">3</div> <div id="b_4">4</div> <div id="b_5">5</div> <div id="b_6">6</div> <div id="b_7">7</div> <div id="b_8">8</div> <div id="b_9">9</div> <div id="b_10">10</div> <div id="b_11">11</div> <div id="b_12">12</div> <div id="b_13">13</div> <div id="b_14">14</div> <div id="b_15">15</div> <div id="b_16">16</div> </div> <div id="btn"> <button id="start">スタート</button> <button id="stop">ストップ</button> <button id="reset">リセット</button> </div> </div> </body> </html>

試したこと

ストップを押すとblock.splice(flash_block_num, 1);で配列から1つずつ削除しているはずなのですが
なぜか止まったマスに再度止まってしまいます。
色々と調べてみましたがどこが間違っているか分かりません。

ヒントを頂けないでしょうか?
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんな感じでやれば、配列などで管理しなくてもよいのでは?

投稿2020/10/28 03:51

編集2020/10/28 03:56
yambejp

総合スコア116724

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

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

yambejp

2020/10/28 03:51

$(function(){ var timerId; $('#start').on('click',function(){ clearInterval(timerId); var sel=$('#large_block div:not(.selected)'); timerId=setInterval(function(){ $('.active').removeClass('active'); var idx=parseInt(Math.random()*sel.length); sel.eq(idx).addClass('active'); },100); }); $('#stop').on('click',function(){ $('.active').addClass('selected').removeClass('active'); clearInterval(timerId); }); $('#reset').on('click',function(){ clearInterval(timerId); $('.active').removeClass('active'); $('.selected').removeClass('selected'); }); });
yambejp

2020/10/28 03:51

//CSS .active{ background-Color:yellow; } .selected{ background-Color:red; } #large_block{ display:flex; flex-wrap:wrap; } #large_block div{ width:24%; }
AyeAye

2020/10/29 05:06

ありがとうございます!!! なるほど!!! classをつけたり外したり、notを使うんですね。 自分で勝手にややこしくしてたみたいです。 作り直したら改善してスッキリしたコードになりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問