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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

2回答

549閲覧

ルーレットで既出の数字を配列から削除する方法(初心者向けスロット課題)

DondokoPanda

総合スコア2

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

0クリップ

投稿2022/09/22 12:05

編集2022/09/23 09:22

前提

Html,Css JavaScriptで初級向け課題としてスロットマシンを作成し、応用パターンを作っているのですが息詰まっています。

スタート、3つの数字を表示するボックスとそれぞれの数字リールをストップさせるボタンがある簡易的なスロットは正常に動作しています。

ここから、最初に左でストップされた数字は配列から削除し、真ん中と右のリールからは消える**(=絶対に一致させない)スロット**を作ろうとしています。

実現したいこと

アドバイスが欲しいのは(2)のステップです

1) スタートボタンを押したときは配列numsにある[1,2,3,4,5,6,7,8]からMath.Randomでシャッフル表示
2) ストップを左から右に順番に押していくとき、左で表示された数字を配列numsから削除する
3) 3つの数字が一致しないスロットができる

発生している問題・エラーメッセージ

stop1を押してslot1(左のリール)からspliceで削除することはできても
stop2では真ん中から狙い通りにspliceで削除することができないことが50%頻度で発生しています。特に配列の1つ次の数字を消してしまうことが多いです。

stop1.addEventListener("click", () => { var slot1 = document.getElementById("slot1").innerHTML; var slot1num = Number(slot1); nums.splice(slot1num - 1, 1); stop1.disabled = true; clearTimeout(setTimeoutId1); statusCheck(); }); stop2.addEventListener("click", () => { var slot2 = document.getElementById("slot2").innerHTML; var slot2num = Number(slot2); nums.splice(slot2num - 2, 1); stop2.disabled = true; clearTimeout(setTimeoutId2); statusCheck(); });

数字配列の中のどの数字が削除対象か、直前までのslot1の値に左右されているのでslot2から具体的にspliceで指示することもできず、他に良い配列から順番を指定し削除する方法を知りたいです。

stop1.addEventListener("click", () => { var slot1 = document.getElementById("slot1").innerHTML; var slot1num = Number(slot1); nums.splice(slot1num - 1, 1);

slot1のリールはこの3行でで適切に配列から出た値を削除できています。

該当以外のScriptコード

配列、スタートボタンは以下のように書いています。

const nums = [1, 2, 3, 4, 5, 6,7,8]; slot1.textContent = nums[Math.floor(Math.random() * nums.length)]; slot2.textContent = nums[Math.floor(Math.random() * nums.length)]; slot3.textContent = nums[Math.floor(Math.random() * nums.length)]; function setNum1() { slot1.textContent = nums[Math.floor(Math.random() * nums.length)]; setTimeoutId1 = setTimeout(() => { setNum1(); }, 100); } function setNum2() { slot2.textContent = nums[Math.floor(Math.random() * nums.length)]; setTimeoutId2 = setTimeout(() => { setNum2(); }, 100); } function setNum3() { slot3.textContent = nums[Math.floor(Math.random() * nums.length)]; setTimeoutId3 = setTimeout(() => { setNum3(); }, 100); }

試したこと

If,else文を使い、細かくslot2の数字をpopやshiftで削除しても、配列ズレが発生することがあります。1つ次の数字を消してしまうことが多いです。

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

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

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

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

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

guest

回答2

0

spliceを使うのであれば、splice の第1引数に渡す削除対象のインデクスとしては、配列 nums における slot2num と等しい要素のインデクスを与えればよいので、

diff

1var slot2num = Number(slot2); 2- nums.splice(slot2num - 2, 1); 3+ nums.splice(nums.indexOf(slot2num), 1);

とするとよいのではと思います。

ちなみにslot2numnums の中にない値のときはnums.indexOf(slot2num)-1 を返します。この場合、nums.splice(-1, 1) が実行されることになり、このときは(何も削られないのではなく)numsの末尾の要素が削られます。

補足

本題とは関係ありませんが以下の2行

javascript

1var slot2 = document.getElementById("slot2").innerHTML; 2var slot2num = Number(slot2);

で 数字の文字列を slot2 に取ってきてそれを数値にしているのだと思いますが、そうだとすると、slot2 にいったん文字列で受けることなく、以下の1行で済みます。(documentの前に +を追加します。)

javascript

1var slot2num = +document.getElementById("slot2").innerHTML;

投稿2022/09/22 13:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

DondokoPanda

2022/09/23 09:16

補足とのところ、推測の通り数値にするためにしていましたが、+追加でできるのは知りませんでした。ありがとうございます!!
guest

0

ベストアンサー

js

1nums.splice(slot1num - 1, 1)

spliceを使わずにfilterを使うといいですよ。

js

1nums = nums.filter(num => num != slot1num);

slot2でも同様に。

投稿2022/09/22 12:10

編集2022/09/22 19:39
shiracamus

総合スコア5406

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

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

DondokoPanda

2022/09/22 12:32

spliceで一つの配列から削除し続けるのではなく、一つの配列にフィルターを通して使い回すということですね。 それだと3つ目のリールではslot1かslot2のフィルター配列になると思って使用していませんでした。今試してみます!ありがとうございます。
shiracamus

2022/09/22 12:42

spliceで削除する場合、slot1numを削除したあと数字の位置がずれるので、slot2numがどの位置にあるのか探さないといけませんよ。 filterなら位置がどこか気にしなくて済みます。
DondokoPanda

2022/09/22 13:29

おっしゃる通り、数字がずれたのでslot2から苦戦していました。filterで通すとうまくslot3までマッチしないものが作れました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問