前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。