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

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

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

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

HTML

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

Q&A

解決済

3回答

7274閲覧

ロト6の作り方を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2018/02/14 01:28

編集2018/02/14 01:29

1から43の重複しないランダムな数字6個をコンピュータ、ユーザにそれぞれ選ばせ当選結果を表示させたいです。ボーナス数字も考慮します。


  例:
ユーザ :[1][12][13][25][30][31]
コンピューター:[1][12][13][25][30][40]
ボーナス数字:[31]

当選結果:2等


1等:数字全て一致
2等:数字5個+ボーナス数字一致
3等:数字5個一致
4等:数字4個一致
5等:数字3個一致
その他:残念


一応自分でかけるところまで書いてみました。
分からない点は、

・ユーザに重複せずに数値を入力させる方法
・ボーナス数字をコンピュータの選んだ数値と重複させずに選ぶ方法
・2等から5等の判定方法

(途中ですが、コードを載せておきます。)

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 6<title></title> 7</head> 8<body> 9 <input type="text" size="15" value="" placeholder="1から43までの数字" id="number1"> 10 <input type="text" size="15" value="" placeholder="1から43までの数字" id="number2"> 11 <input type="text" size="15" value="" placeholder="1から43までの数字" id="number3"> 12 <input type="text" size="15" value="" placeholder="1から43までの数字" id="number4"> 13 <input type="text" size="15" value="" placeholder="1から43までの数字" id="number5"> 14 <input type="text" size="15" value="" placeholder="1から43までの数字" id="number6"> 15 16<br /> 17<br /> 18 <input type="button" value="結果" id="button"> 19<br /> 20<br /> 21 22 <div id = "USER">USER:</div> 23 <div id = "COM">COM :</div> 24 <div id = "BONUS">ボーナス:</div> 25 <div id="result">当選結果:</div> 26 27 <script type="text/javascript" src=""></script> 28</body> 29</html> 30

Javascript

1 var button = document.getElementById("button"); 2 var USER = document.getElementById( 'USER' ); 3 var COM = document.getElementById( 'COM' ); 4 var BONUS = document.getElementById("BONUS"); 5 var result = document.getElementById("result"); 6 7button.addEventListener('click', function(){ 8 var usernumber = [ 9 parseInt (document.getElementById("number1").value,10), 10 parseInt (document.getElementById("number2").value,10), 11 parseInt (document.getElementById("number3").value,10), 12 parseInt (document.getElementById("number4").value,10), 13 parseInt (document.getElementById("number5").value,10), 14 parseInt (document.getElementById("number6").value,10), 15 ]; 16 17 var arr = [1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43]; 18 19 var randnum = []; 20 21 for(var i = 0; i <6; i++){ 22 randnum[i] =arr.splice(Math.floor(Math.random()*arr.length),1)[0] 23 } 24 25 26 USER.innerHTML += "[" + usernumber.join('][') + "]"; 27 COM.innerHTML += "[" + randnum.join('][') + "]"; 28 29 if(usernumber.join() === randnum.join){ 30 result.innetHTML += "1等"; 31 } 32 33 else{ 34 result.innerHTML += "残念"; 35 } 36 37 38},false); 39

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

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

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

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

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

torisan

2018/02/14 01:38

ボーナス数字と言うのは、二等の時のみに使える数字という認識で良いですか?
退会済みユーザー

退会済みユーザー

2018/02/14 01:40

はい、2等のみです
guest

回答3

0

ベストアンサー

私ならですが。

・ユーザに重複せずに数値を入力させる方法 ・ボーナス数字をコンピュータの選んだ数値と重複させずに選ぶ方法 ・2等から5等の判定方法

をそれぞれ便宜上, Q1,Q2,Q3 とします。

A1:
私なら、

方法1:

ボタンを電卓みたいに配置する. で、押されたらその値を 配列にセットして 無効にする。

「javascript ボタン 無効」で検索すると、

禁止状態にする

がヒットしました。

これにあるdisabled をJavaScript側で制御します。

これをやれば「ユーザは選択すると同じデータを選ぶことができない」状態になりますから。

それか、

テキストボックス? でしたっけ? 言語やツールによって名前が変わるので怪しいですが、

Prompt みたいなやつ。

これを使う。

方法2:

テキストボックスを複数 ( 今回は6個 ) 貼り付けて、 入力されたら...みたいな挙動のときに 同じ値がないかどうかチェックして、 同じ値がある場合は そこだけ赤くしたりして再入力を促すとか。

teratail とかでのアカウント入力もこんな感じでやっているはず。

データベースかなんかから、パスワード等が完全一致する人がいるかチェックして、
居ないなら、「不正な文字列です」みたいにして次へは進めませんよね。

そういう風に。

A2について:

方法1:

エラトステネスの篩(*1) に用いられるような、 ランダムに生成された値を折っていって、残りの範囲を抽出して別の配列に入れる。 それから生成する。

例:

// あくまでイメージ。文法的に誤りがあるかも? var temp[]; for( int i = 0;: i < 乱数の値が格納された配列のサイズ; i++ ){ if( /* 選択値でないなら */ ){ temp[i] = i; } } // ここで変数 r に乱数発行 bonus = temp[r];

※1: エラトステネスの篩 - Wikipedia

方法2:

乱数を生成して、それまでの値とすべて比較して同じ値なら再取得...これを新規のデータになるまで行う

A3について:

私なら

方法:

カウンター用変数を用意( 初期値 = 0 ) し、ユーザの値とPCの値が同じならカウンタを上昇させる。 これを 6個分行う。でカウンタが 2 ならその他に入るから...みたいに。 ( もちろん ボーナス番号も行う。 )

かなぁ。

これ(ら)なら私でも思いついたので。

プログラミングって日本語、英語とかみたいに「表現方法がいくらでもある」ので確実ではないですが、

前提を考えると上記になりました。


[追記1]
miyabi-sunさんからのReplyにより文章を追加します。

確かに「間違ってボタンを押してしまった...」っていう場合もあり得ますね。

なのでmiyabi-sunさんが仰っているように、

リセットボタンなるものを配置し、リセットボタンを押すとdisabled をすべてtrue ( falseになっているやつだけでもいいが。 ) にして再度入力できるようにするのも必要かも。

( 言われるまで思いつかなかった... )

ちょっとヒントですが、こういうロジックってすぐには思いつかないと思います。 なので「データ構造とアルゴリズム」とかをやってみてください。 JavaScriptでもできるはずですが、ポインタがない等のように制限がありますが、一応可能です。 私は C++が基本 ( 趣味 ) ですので C/C++でやっていましたが。

投稿2018/02/14 02:13

編集2018/02/14 03:41
BeatStar

総合スコア4958

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

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

miyabi-sun

2018/02/14 03:06

素敵な答えじゃないですか!胸張ってください。 「私ならこうしますという前提で回答します」の1文だけで十分だと思います。 あまりにも自信のない回答だと質問者さんも不安になってしまいますからね。 > Q1. 「javascript ボタン 無効」 これは単純に禁止すると誤クリックで選択してしまった数値を取り消せなくなりそうですね。 リセットみたいなボタンも用意すれば実装難易度と見た目の両立が出来そうですね。
退会済みユーザー

退会済みユーザー

2018/02/14 03:29

そういう考えもあるのですね!参考になります。ありがとうございます。
BeatStar

2018/02/14 03:31

miyabi-sunさん ありがとうございます。 私は趣味でやっていてプロならもうちょっとマシな方法でやるだろうなぁという感覚でしたので。 ちょっと修正しますね。
BeatStar

2018/02/14 03:35

miyabi-sunさんの「リセットみたいなボタンも用意すれば...」確かにそれもありますね。 表面に出ているだけをイメージしていたので... 追記します。
guest

0

・ユーザに重複せずに数値を入力させる方法

ロト6を完全再現するならチェックボックスで実装した方が良さそうですね。
43個の数値+チェックボックスが存在し、
6個チェックが入っていれば妥当、5個でも7個でも駄目。

こういうロジックの方が分かりやすいんじゃないですかね?

・ボーナス数字をコンピュータの選んだ数値と重複させずに選ぶ方法

JavaScript

1 var randnum = []; 2 for(var i = 0; i <6; i++){ 3 randnum[i] =arr.splice(Math.floor(Math.random()*arr.length),1)[0] 4 }

これを改変しましょう。
7回回して、randnum[6]をボーナス数字にすれば良いでしょう。

純粋な当選番号は前6個から削り出せば良いでしょう。
Array.prototype.slice()を使えば簡単に出来ます。

・2等から5等の判定方法

Lodashというライブラリがオススメです。
_.differenceを使えば差分の配列を求められます。
つまり、全て一致すれば配列の要素数は0になるのでその結果のarray.length === 0という風に比較すれば1等とわかりますね。
5つの数字が当選しているなら配列の要素数は1になるはずです。

更に、○等に当選か否かはそれぞれで関数を用意しましょう。
ささっと用意しましたがこんな感じになるかと思います。

JavaScript

1var is_1tou = function (winning_nums, bonus_num, input_nums) { 2 return _.difference(winning_nums, input_nums).length === 0; 3} 4var is_2tou = function (winning_nums, bonus_num, input_nums) { 5 var has_bonus = Boolean(input_nums.find(function(it){ return it === bonus_num })); 6 return _.difference(winning_nums, input_nums).length === 1 and has_bonus; 7} 8var is_3tou = function (winning_nums, bonus_num, input_nums) { 9 return _.difference(winning_nums, input_nums).length === 2; 10}

winning_nums, bonus_num, input_numsは自分で作ってくださいね。
条件判定はひとまずこんな感じでどうでしょうか?

JavaScript

1 if(is_1tou(winning_nums, bonus_num, input_nums)){ 2 result.innetHTML += "1等"; 3 } else if (is_2tou(winning_nums, bonus_num, input_nums)) { 4 result.innetHTML += "2等"; 5 } else if (is_3tou(winning_nums, bonus_num, input_nums)) { 6 result.innetHTML += "3等"; 7 } else { 8 result.innerHTML += "残念"; 9 }

投稿2018/02/14 01:52

編集2018/02/14 01:54
miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2018/02/14 02:15

中々難しい…。 まだまだ勉強が必要みたいです。 参考にしながら調べてやってみます。
guest

0

・ユーザに重複せずに数値を入力させる方法

入力内容自体の制限は非常に難しいので、入力されて、ボタンクリック後、
当選判定をする前に入力内容のチェック(バリデーション)を入れればよいと思います。
※もちろん「1~43」と範囲を仕様で決めているようなので事前に、「1未満」、「44以上」が入力された場合も同じようにチェックする必要がありますね。

・1番目と2~6番目が同じか
・2番目と3~6番目が同じか
・3番目と4~6番目が同じか
・4番目と5~6番目が同じか
・5番目と6番目が同じか

1つずつチェックしていき、同じであれば「重複しています」などメッセージをアラートとして出力してreturnといった感じです。

・ボーナス数字をコンピュータの選んだ数値と重複させずに選ぶ方法

ユーザーに重複させない数字を入力させるのであれば
そもそも「コンピュータに重複させない数字を選ぶ」仕組みを導入する必要があります。
選ばれていない数字が6個揃うまで数字を選び続けるようにwhileや再帰処理などを利用すると良いです。
今のままだと重複関係なく6個数字が選ばれるようになっているように思います。
その上で、「7個目をボーナス数字」と決め打ちにして「選ばれていない数字が”7”個揃うまで数字を選び続けるように」すると楽かもしれません。

・2等から5等の判定方法

仕様も提示されていますし、ユーザ・コンピュータ双方配列が作られているので
ループさせて一致した数で判定可能なのでは?と思います。

数字4個以下の一致でボーナス数字が一致していた場合はどうなるの?とか
仕様的に気になる部分もありますが、アドバイスとしてはひとまずこんな感じです。

投稿2018/02/14 01:46

編集2018/02/14 01:47
m.ts10806

総合スコア80765

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

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

退会済みユーザー

退会済みユーザー

2018/02/14 02:09

アドバイスありがとうございます。プログラミング初心者で中々難しいですが、アドバイスを元に調べながらもう一度考えてみます。
m.ts10806

2018/02/14 02:11

一度に全部やるのは混乱の元となりますので1つずつ実現していきましょう。
退会済みユーザー

退会済みユーザー

2018/02/14 03:31

はい、まずはユーザー側の数値から考えて進めてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問