🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

2回答

1135閲覧

javascriptで数独を作っています。あるマスにおいて、同じ3×3マスにある数字は候補から外したい。

shidada

総合スコア4

JavaScript

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

0グッド

0クリップ

投稿2021/03/12 12:38

前提・実現したいこと

javascriptで数独を作っております。
エラーは出ていないのですが、思うように動きません。

↓↓↓↓↓↓↓↓↓↓↓↓
↑↑↑↑↑↑↑↑↑↑↑↑
の部分をコメントアウトすると上手く動きます。

例えば
0 1 2 3 4 0 0 0 0
6 ・・・
7 ・
8 ・
9
0
0
0
0

と入力すると
左上の0の部分は【縦】6,7,8,9と【横】1,2,3,4が候補から外され
5が出力されて出てきます。

これを3×3と同じマスにあるものも候補から外すようなコードを書いたら上手く動きませんでした。
(↑↑↑ ↓↓↓で囲まれた部分)
なので、そこに問題点があるのだと考えております。

まだ始めたばかりでコードが読みづらいかもしれませんが、些細なアドバイスでもよいので、回答いただけたらと思います。

よろしくお願い致します。

該当のソースコード

javascript

1//9×9のselect boxを作る 2function appendBox(i) { 3 let box = document.createElement('div'); 4 box.id = "num" + i; 5 document.getElementById("box").appendChild(box); 6 return box; 7 } 8 function appendSel(i, box) { 9 let sel = document.createElement('select'); 10 sel.name = box.id + "_" + i; 11 sel.id = box.id + "_" +i; 12 box.appendChild(sel); 13 return sel; 14 } 15 function appendOpt(i,sel){ 16 let option = document.createElement('option'); 17 option.value = i; 18 option.text = i ; 19 sel.appendChild(option); 20 } 21 for(let i =1 ; i<=9 ; i++){ 22 let box1 = appendBox(i); 23 for(let i =1 ; i<=9 ; i++){ 24 let sel1 = appendSel(i, box1); 25 for(let i =0 ; i<=9 ; i++){ 26 appendOpt(i, sel1); 27 } 28 } 29 } 30 31//select boxの値を取得して配列にいれる 32var values=[] 33function buttonClick(){ 34 for(let i=1 ; i<=9 ; i++){ 35 values[i-1] = []; 36 for(let j=1 ; j<=9 ; j++){ 37 values[i-1][j-1] = document.getElementById("num"+ i + "_" + j).value; 38 } 39 } 40} 41 42//計算結果を表示させる関数 43function output(){ 44 let str=""; 45 for(let i=1 ; i<=9 ; i++){ 46 for(let j=1 ; j<=9 ; j++){ 47 str = str + " " + values[i-1][j-1]; 48 } 49 str = str + "<br>"; 50 } 51 document.getElementById("ans").innerHTML = str; 52} 53 54//i行目で被ったら候補から消す 55function judge_x(i){ 56 let kouho = "123456789"; 57 for(let j=1 ; j<=9 ; j++){ 58 let igyou = values[i-1][j-1]; 59 for(let k=1 ; k<=9 ; k++){ 60 if(igyou ===String(k)){ 61 kouho = kouho.replace(igyou,""); 62 } 63 } 64 } 65 return kouho; 66} 67 68//j列目で被ったら候補から消す 69function judge_y(j,kouho){ 70 for(let i=1 ; i<=9 ; i++){ 71 let jretu = values[i-1][j-1]; 72 for(let k=1 ; k<=9 ; k++){ 73 if(jretu === String(k)){ 74 kouho = kouho.replace(jretu ,""); 75 } 76 } 77 } 78 return kouho; 79} 80 81 82//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 83//同じ3×3ブロックにあったら候補から消す 84function sameBlock(i,j,kouho){ 85 let I = Math.floor((i-1)/3); 86 let J = Math.floor((j-1)/3); 87 let katamari = []; 88 for(let m=1 ; m<=3 ;m++){ 89 katamari[m-1] = []; 90 for(let n=1 ; n<=3 ; n++){ 91 katamari[m-1][n-1]=values[I*3 + m-1][J*3 + n-1]; 92 } 93 } 94 95 for(let m=1 ; m<=3 ; m++){ 96 for(let n=1 ; n<=3 ; n++){ 97 if(values[i-1][j-1] = katamari[m-1][n-1]){ 98 kouho = kouho.replace(katamari[m-1][n-1],"") 99 } 100 } 101 } 102 return kouho; 103} 104//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 105 106 107//全ての判断 108function judge(){ 109 for(let i=1 ; i<=9 ; i++){ 110 for(let j=1 ; j<=9 ; j++){ 111 if(values[i-1][j-1]==="0") { 112 values[i-1][j-1] = judge_x(i); 113 let kouho = values[i-1][j-1]; 114 values[i-1][j-1] = judge_y(j,kouho); 115 //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 116 kouho = values[i-1][j-1]; 117 values[i-1][j-1] = sameBlock(i,j,kouho); 118 //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 119 } 120 } 121 } 122 output(); 123 124} 125

以下はHTMLです。
セレクトボックスで数字を入力したあと
【決定】を押して【計算】を押すと答えが出力される
という流れになっております。(そうしたい)

html

1 <div id="box"></div> 2 <button type=“button” onclick="buttonClick()">決定</button> 3 <button type=“button” onclick="judge()">計算</button> 4 <div id="ans"></div> 5

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

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

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

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

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

guest

回答2

0

自己解決

javascript

1 for(let m=1 ; m<=3 ; m++){ 2 for(let n=1 ; n<=3 ; n++){ 3 if(values[i-1][j-1] = katamari[m-1][n-1]){ 4 kouho = kouho.replace(katamari[m-1][n-1],"") 5 } 6 } 7 }

のif文のところですが
1~9までで判断したいので

javascript

1 for(let k=1 ; k<=9 ; k++){ 2 if (katamari[m-1][n-1] === String(k)){ 3 kouho = kouho.replace(katamari[m-1][n-1],"");

とするべきでした。

また、もう少し短く表現でき
全体のコードは

javascript

1//9×9のselect boxを作る 2function appendBox(i) { 3 let box = document.createElement('div'); 4 box.id = "num" + i; 5 document.getElementById("box").appendChild(box); 6 return box; 7 } 8 function appendSel(i, box) { 9 let sel = document.createElement('select'); 10 sel.name = box.id + "_" + i; 11 sel.id = box.id + "_" +i; 12 box.appendChild(sel); 13 return sel; 14 } 15 function appendOpt(i,sel){ 16 let option = document.createElement('option'); 17 option.value = i; 18 option.text = i ; 19 sel.appendChild(option); 20 } 21 for(let i =1 ; i<=9 ; i++){ 22 let box1 = appendBox(i); 23 for(let i =1 ; i<=9 ; i++){ 24 let sel1 = appendSel(i, box1); 25 for(let i =0 ; i<=9 ; i++){ 26 appendOpt(i, sel1); 27 } 28 } 29 } 30 31//select boxの値を取得して配列にいれる 32let values=[]; 33function buttonClick(){ 34 for(let i=1 ; i<=9 ; i++){ 35 values[i-1] = []; 36 for(let j=1 ; j<=9 ; j++){ 37 values[i-1][j-1] = document.getElementById("num"+ i + "_" + j).value; 38 } 39 } 40} 41 42//計算結果を表示させる関数 43function output(){ 44 let str=""; 45 for(let i=1 ; i<=9 ; i++){ 46 for(let j=1 ; j<=9 ; j++){ 47 str = str + " " + values[i-1][j-1]; 48 } 49 str = str + "<br>"; 50 } 51 document.getElementById("ans").innerHTML = str; 52} 53 54 55 56//同じ3×3ブロックにあったら候補から消す 57function sameBlock(i,j){ 58 let kouho = "123456789"; 59 let I = Math.floor((i-1)/3); 60 let J = Math.floor((j-1)/3); 61 let katamari = []; 62 for(let m=1 ; m<=3 ;m++){ 63 katamari[m-1] = []; 64 for(let n=1 ; n<=3 ; n++){ 65 katamari[m-1][n-1] = values[I*3 + m-1][J*3 + n-1]; 66 for(let k=1 ; k<=9 ; k++){ 67 if (katamari[m-1][n-1] === String(k)){ 68 kouho = kouho.replace(katamari[m-1][n-1],""); 69 } 70 } 71 } 72 } 73 return kouho; 74} 75 76//i行目で被ったら候補から消す 77function judge_x(i,kouho){ 78 for(let j=1 ; j<=9 ; j++){ 79 let igyou = values[i-1][j-1]; 80 for(let k=1 ; k<=9 ; k++){ 81 if(igyou ===String(k)){ 82 kouho = kouho.replace(igyou,""); 83 } 84 } 85 } 86 return kouho; 87} 88 89//j列目で被ったら候補から消す 90function judge_y(j,kouho){ 91 for(let i=1 ; i<=9 ; i++){ 92 let jretu = values[i-1][j-1]; 93 for(let k=1 ; k<=9 ; k++){ 94 if(jretu === String(k)){ 95 kouho = kouho.replace(jretu ,""); 96 } 97 } 98 } 99 return kouho; 100} 101 102//全ての判断 103function judge(){ 104 for(let i=1 ; i<=9 ; i++){ 105 for(let j=1 ; j<=9 ; j++){ 106 if(values[i-1][j-1]==="0") { 107 values[i-1][j-1] = sameBlock(i,j); 108 let kouho = values[i-1][j-1]; 109 values[i-1][j-1] = judge_x(i,kouho); 110 kouho = values[i-1][j-1]; 111 values[i-1][j-1] = judge_y(j,kouho); 112 } 113 } 114 } 115 output(); 116} 117 118 119

となりました。
閲覧してくださった方々、本当にありがとうございました。

投稿2021/03/14 13:30

shidada

総合スコア4

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

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

0

javascript

1if(values[i-1][j-1] = katamari[m-1][n-1]){ 2 3```↑のイコールが一つだからではありませんか?

投稿2021/03/12 13:20

Py_pp

総合スコア65

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

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

shidada

2021/03/14 13:26

ご回答ありがとうございます! たしかに=1つじゃないですね! ただ、問題点は別にあり、解決致しました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問