質問するログイン新規登録
JavaScript

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

Q&A

解決済

2回答

452閲覧

パネルに表示された数字を順番に押す動作をさせたい

inoyu

総合スコア1

JavaScript

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

0グッド

0クリップ

投稿2023/08/27 23:52

編集2023/08/28 00:25

0

0

実現したいこと

数字タッチゲームをつくっています。数字を小さい順に押せるようにしたいです。

前提

ドットインストールで紹介されている数字タッチゲームを自分なりの方法で作ってみましたが、『数字を小さい順番に押す』という部分でつまづきました。

該当のソースコード

html

1<div id ="container"> 2 <div id="timer">0.0</div> 3 <ul id="board"> 4 <li></li> 5 <li></li> 6 <li></li> 7 <li></li> 8 </ul> 9 <div id="btn">スタート</div> 10 </div>

css

1body { 2 background: #ccc; 3 color: #fff; 4 font-family: 'Courier New', sans-serif; 5 font-size: 16px; 6 font-weight: bold; 7} 8 9#container { 10 /* 50px * 2 + 10px * 2 */ 11 width: 120px; 12 margin: 16px auto; 13} 14 15#board { 16 display: flex; 17 flex-wrap: wrap; 18 list-style: none; 19 margin: 0 0 8px; 20 padding: 10px; 21 background: #fff; 22 border-radius: 4px; 23} 24 25#board li { 26 background: #00aaff; 27 width: 40px; 28 height: 40px; 29 margin: 5px; 30 cursor: pointer; 31 border-radius: 4px; 32 line-height: 40px; 33 text-align: center; 34 box-shadow: 0 4px 0 #0088cc; 35} 36 37#board li.pressed{ 38 background: #ccc; 39 box-shadow: none; 40 margin-top: 9px; 41 margin-bottom: 1px; 42} 43 44 45#timer { 46 margin-bottom: 8px; 47 font-size: 20px; 48 text-align: right; 49} 50 51#btn { 52 cursor: pointer; 53 user-select: none; 54 background: #f44336; 55 padding: 8px; 56 border-radius: 4px; 57 text-align: center; 58 box-shadow: 0 4px 0 #d1483e; 59} 60 61#btn:active { 62 margin-top: 12px; 63 box-shadow: none; 64} 65

javascript

1 const btn = document.querySelector("#btn"); 2 const lists = [...document.querySelectorAll("li")]; 3 4 // スタート押す前は数字を表示しない動作 5 lists.forEach((li) => { 6 li.classList.add("pressed"); 7 }); 8 9 10 // スタートボタンを押した時の動作(ランダムな数字をパネルに表示) 11 btn.addEventListener("click", () => { 12 const number = [0, 1, 2, 3]; 13 const liNumber = []; 14 for (let i = 0; i < 4; i++) { 15 liNumber[i] = number.splice(Math.floor(Math.random() * number.length), 1)[0]; 16 } 17 lists[0].textContent = liNumber[0]; 18 lists[1].textContent = liNumber[1]; 19 lists[2].textContent = liNumber[2]; 20 lists[3].textContent = liNumber[3]; 21 22 23 lists.forEach((li) => { 24 li.classList.remove("pressed"); 25 }); 26 27 28 // 数字を小さい順に押す動作(ここがわかりません) 29 lists.forEach((li) => { 30 li.addEventListener("click", () => { 31 li.classList.add("pressed"); 32 }); 33 }); 34 }); 35

試したこと

クリックする度に増える変数を宣言してみたり、ifの条件式を考えてみましたが、どう書けばうまく動作するのかわかりませんでした、、、

↓追記

let count = 0 ;
lists.forEach((li) => {
li.addEventListener("click", () => {
li[count].classList.add("pressed");
count++;
});
});

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

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

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

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

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

int32_t

2023/08/28 00:03

小さい順ではない順番でliがクリックされたらどうなって欲しいですか? 例: 最初に最大値の数値のliをクリック
inoyu

2023/08/28 00:06

コメントありがとうございます。 小さい順でなければclickできない(pressedのクラスがつかない)ようにしたいです。
guest

回答2

0

ざっくりこんな感じで

javascript

1<style> 2.pressed{ 3 background-Color:gray; 4} 5.disabled{ 6 color:lightgray; 7} 8</style> 9<script> 10window.addEventListener('DOMContentLoaded', ()=>{ 11 const max=100; 12 let timerId; 13 let d; 14 const boardLI=board.querySelectorAll('li'); 15 document.addEventListener('click',({target})=>{ 16 if(target.matches('#btn:not(.disabled)')){ 17 const list=Array(max).fill(null).map((_,x)=>[x,Math.random()]).sort((x,y)=>x[1]-y[1]).map(x=>x[0]).splice(0,boardLI.length); 18 boardLI.forEach((x,y)=>{x.textContent=list[y];x.classList.remove('pressed')}); 19 btn.classList.add('disabled'); 20 d=new Date(); 21 timerId=setInterval(()=>{ 22 timer.textContent=parseInt((new Date()-d)/100)/10; 23 },100); 24 } 25 if( 26 target.matches('#board li') && 27 Math.min(...[...board.querySelectorAll('li:not(.pressed)')].map(x=>Number(x.textContent)))==target.textContent 28 ){ 29 target.classList.add('pressed'); 30 } 31 if(board.querySelectorAll('li:not(.pressed)').length==0){ 32 clearInterval(timerId); 33 btn.classList.remove('disabled'); 34 } 35 }); 36}); 37</script> 38<div id ="container"> 39 <div id="timer">0.0</div> 40 <ul id="board"> 41 <li></li> 42 <li></li> 43 <li></li> 44 <li></li> 45 </ul> 46 <div id="btn">スタート</div> 47 </div>

投稿2023/08/28 00:58

yambejp

総合スコア118110

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

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

inoyu

2023/08/28 01:09

回答ありがとうございます。 今の自分には理解が難しい内容もありますが、調べながら試したいと思います。
guest

0

ベストアンサー

[...document.querySelectorAll('li:not(.pressed)')].map(li => Number(li.textContent)) を評価すると未選択の <li> のテキストを数値に直した配列が得られます。この配列をソートして最小の値を取り出して、クリックされた <li> のテキストを数値に直したものと比較して、一致したときだけ pressed クラスを足せば良いでしょう。

または、グローバルに [0, 1, 2, 3] を入れた変数を用意しておき、この最初の要素とクリックされた <li> の内容を比較して一致したら変数の先頭を削除する、でもいいですね。

追記:
もし質問文にあるような count の方法を採用するなら、「もし countNumber(li.textContent) が一致したなら、pressed クラスを追加して count++」という流れになります。
どの方法でも必ず if が必要になります。

投稿2023/08/28 00:19

編集2023/08/28 00:49
int32_t

総合スコア22007

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

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

inoyu

2023/08/28 00:33

さっそくの回答ありがとうございます。 後ほどまた修正してみたいと思います。ありがとうございました。
inoyu

2023/08/28 01:06

追記までありがとうございます。 初めてteratailをつかってみましたが、親切に教えていただいてくれる方がいて質問してみてよかったです。 追記分も後ほど試してみたいとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問