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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1225閲覧

ランダムに変わる色の名前の頭文字をキー入力させるゲームを作りたい

naoto7139

総合スコア1

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/06/21 16:41

###色を格納した配列の数字をランダムにかつ任意のタイミングで変化させたい

ランダムな色が付いた「色の名前」に対して、付いている色の頭文字をキー入力するゲーム( 脳トレのようなもの)を作っています。
イメージ説明

おそらくランダムな数字が常に変化しているので、正しいキーを入力しても認識できない

JavaScript

1let correct = randomcolor().slice(0,1); //9行目 2 console.log(correct); 3 document.onkeydown = () => { 4 if(event.key === correct){ 5 console.log('ok'); 6 }else{ 7 console.log('no'); 8 } 9 }

該当のソースコード

JavaScript

1'use strict'; 2const gameDivided = document.getElementById('game-area'); 3const startButton = document.getElementById('start'); 4 5startButton.onclick = () =>{ 6 if(window.confirm('Ready?')){ 7 gameDivided.innerHTML = randomname(); 8 gameDivided.style.color = randomcolor(); 9 let correct = randomcolor().slice(0,1); 10 console.log(correct); 11 document.onkeydown = () => { 12 if(event.key === correct){ 13 console.log('ok'); 14 }else{ 15 console.log('no'); 16 } 17 } 18 document.onkeyup = () => {//キーを離すたび名前と色が変わる 19 gameDivided.innerHTML = randomname(); 20 gameDivided.style.color = randomcolor(); 21 let correct = randomcolor().slice(0,1); 22 console.log(correct); 23 } 24const samplecolor = [ 25 'red', 'blue', 'green', 'yellow', 'purple', 'orange', 'white' 26]; 27 28const colorname = [ 29 '赤', '青', '緑', '黄', '紫', '橙', '白' 30];//R, B, G, Y, P, O, Wが正解 31 32function randomcolor(){//ランダムに色を変更する関数 @param {} @return{string} 色の名前 33 let now = new Date(); 34 let random1 = Math.floor(now.getTime())%7; 35 return samplecolor[random1]; 36} 37 38function randomname() {//ランダムに色の名前を表示する関数 @param {} @return{string} 色 39 var random2 = Math.floor(Math.random() * 7); 40 return colorname[random2]; 41}

試したこと

付いている色の頭文字を答えさせたいので、randomcolor関数のランダムな数字の作り方がネックで、時刻やMath.random()のような常に変わるものが使いにくい?というところまで考えました。何か規則的でなくかつ常に変化しないランダムな数字(0~6の整数)の決め方があれば教えて頂きたいです。

補足情報(FW/ツールのバージョンなど)

ゲームのイメージはこんな感じです。
参考画像

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

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

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

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

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

guest

回答1

0

ベストアンサー

correctの行のletを外せば正常に動きます。
letはブロックスコープの中のローカル変数となるため、最初のcorrectとは別の変数となってしまっているためです。

JavaScript

1 let correct = randomcolor().slice(0,1); 2 console.log(correct); 3 document.onkeydown = () => { 4 if(event.key === correct){ 5 console.log('ok'); 6 }else{ 7 console.log('no'); 8 } 9 } 10 document.onkeyup = () => {//キーを離すたび名前と色が変わる 11 gameDivided.innerHTML = randomname(); 12 gameDivided.style.color = randomcolor(); 13 correct = randomcolor().slice(0,1);//ここのletを外します。 14 console.log(correct); 15 }

再現性のある乱数の生成については、リンクを紹介いたします。
JavaScriptで再現性のある乱数を生成する + 指定した範囲の乱数を生成する

投稿2021/06/21 17:32

gas.engine

総合スコア608

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

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

naoto7139

2021/06/22 01:06

素早いご回答ありがとうございます! 再現性のある乱数については求めているものに近いと思ったのですが、リロードした際には違う乱数になるようにするのはどうすればよいでしょうか?ヒントになるものでもございましたら、教えて頂きたいです。 このリンクの通りやると、毎回同じ問題ができてしまうと思いました。
gas.engine

2021/06/22 02:36

リロードするたびに毎回違う乱数であれば、Math.random()でよいのではないでしょうか? 意図するところは理解できないですが以下の方法で再現性のある乱数を意図的に変化させることはできます。 Math.random()でseedを決めて、リンク先のseedに代入すれば一定の乱数ができます。 seedを配列などで用意すれば乱数を使って固定された複数のパターンの問題を作成することができる点は利点です。 gameDivided.style.color = randomColor(); let correct = randomColor().slice(0,1); この部分でrandomColor()を2回実行している点がちょっとおかしいです。 文字の色と同じ正解の色を設定するのですから、一度変数に代入してから同じものを参照すべきところです。 連続でrandomColor関数を実行して、関数の中にnew Date()からgetTime()していますが上記の方法が適切と思います。
naoto7139

2021/06/22 13:59

Math.randomについてよくわかっていなかったようです! randomcolor()にもMath.randomaを使い、指摘いただいた箇所を nowcolor = randomcolor(); gameDivided.style.color = nowcolor; correct = nowcolor.slice(0,1); としたら思っていたようになりました! 1人だと何日もかかっていたところでした、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問