I had previously posted an app that sets sudoku boards from pre-determined solutions.
This app adds the creation of a new solution each time.
Clicking New Game creates a puzzle of the existing difficulty, while changing the difficulty creates one with the new value.
Here is how it might look:
To try it click here
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”
http://www.w3.org/1999/xhtml”>
<head profile=”
http://gmpg.org/xfn/11″>
<title>Sudoku</title>
<style>
body {margin-left:0;margin-right:0;font:normal normal normal 15px Arial;}
a{ text-decoration: }:link { color: rgb(0, 0, 255) }:visited {color :rgb(100, 0,100) }:hover { }:active { }
</style>
</head>
<body>
<center><input type=”button” id=”b2″ style=”position: relative; top: 5px” name=”b2″ value=”New Game” onclick=’rn();strt();’/> <select id=”s1″ name=”s1″ onchange=’rn();strt();’>
<option >Easy</option>
<option >Moderate</option>
<option >Hard</option>
</select> <input type=”checkbox” id=”ch1″ name=”ch1″ value=”” onchange=’notes();check();’/>notes <input type=”button” id=”b3″ style=”position: relative; top: 5px” name=”b3″ value=”check” onclick=’check();’/> </center>
<di id=”d1″ style=”position: absolute; left: 50%; margin-left: -225px; top: 100px; width: 450px; height: 486px”></di>
<table id = “frame” style=”position: absolute; left: 50%; margin-left: -225px; top: 100px; width: 450px; height: 450px; border-collapse: collapse; text-align: center”></table>
<di id=”congrats” style = “position: absolute; width: 50%; left: 25%; top:100px; padding: 50px 2px 50px 2px; font:italic normal 800 36px Georgia; border: 2px solid black; border-radius: 10px; background: blue; color: yellow; visibility: hidden; text-align: center”>Congratulations!! You Have Won</di>
var lft = -33; var tp = -32.7; var no; var hold; var cnt = 0; var choose; var diff; var tbl = “”; var brk = 0;
for (var i = 1; i ‘;
}
for (var i = 1; i ‘;
}
tbl = ‘
‘;
for (var i=1; i
‘;
if (i % 9 == 0) tbl += ‘
‘;
}
tbl += ‘
‘;
tbl = tbl.replace(new RegExp(”, ‘g’),’>’);
document.getElementById(“frame”).innerHTML = tbl;
arr1 = new Array(); arr2 = new Array(); arr3 = new Array(); arr4 = new Array(); arr5 = new Array(); arr6 = new Array(); arr7 = new Array(); arr8 = new Array(); arr9 = new Array(); sol = new Array(); var si;
for (var i = 0; i 9) i = 1;
}
}
}
for (var i=1; i 9) {
arr2[i] = 1;
i = 1;
}
}
if (i 9) {
arr2[i] = 1;
i = 1;
}
}
}
if (i > 3 && i 9) {
arr2[i] = 1;
i = 1;
}
}
}
if (i > 6) {
for (var q = 7; q 9) {
arr2[i] = 1;
i = 1;
}
}
}
}
}
for (var i=1; i 9) {
arr3[i] = 1;
i = 1;
}
for (var j = 1; j 9) {
arr3[i] = 1;
i = 1;
}
}
if (i 9) {
arr3[i] = 1;
i = 1;
}
}
}
if (i > 3 && i 9) {
arr3[i] = 1;
i = 1;
}
}
}
if (i > 6) {
for (var q = 7; q 9) {
arr3[i] = 1;
i = 1;
}
}
}
}
}
for (var i=1; i 100000) {
brk = 0;
break;
}
arr4[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k 9) {
arr4[i] = 1;
i = 1;
}
}
if (arr4[i] == arr1[i] || arr4[i] == arr2[i] || arr4[i] == arr3[i]) arr4[i] ++;
if (arr4[i] > 9) {
arr4[i] = 1;
i = 1;
}
}
}
for (var i=1; i 100000) {
brk = 0;
break;
}
arr5[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k 9) {
arr5[i] = 1;
i = 1;
}
for (var j = 1; j 9) {
arr5[i] = 1;
i = 1;
}
}
if (i 9) {
arr5[i] = 1;
i = 1;
}
}
}
if (i > 3 && i 9) {
arr5[i] = 1;
i = 1;
}
}
}
if (i > 6) {
for (var q = 7; q 9) {
arr5[i] = 1;
i = 1;
}
}
}
}
}
for (var i=1; i 100000) {
brk = 0;
break;
}
arr6[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k 9) {
arr6[i] = 1;
i = 1;
}
for (var j = 1; j 9) {
arr6[i] = 1;
i = 1;
}
}
if (i 9) {
arr6[i] = 1;
i = 1;
}
}
}
if (i > 3 && i 9) {
arr6[i] = 1;
i = 1;
}
}
}
if (i > 6) {
for (var q = 7; q 9) {
arr6[i] = 1;
i = 1;
}
}
}
}
}
for (var i=1; i 100000) {
brk = 0;
break;
}
arr7[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k 9) {
arr7[i] = 1;
i = 1;
}
}
if (arr7[i] == arr1[i] || arr7[i] == arr2[i] || arr7[i] == arr3[i] || arr7[i] == arr4[i] || arr7[i] == arr5[i] || arr7[i] == arr6[i] ) arr7[i] ++;
if (arr7[i] > 9) {
arr7[i] = 1;
i = 1;
}
}
}
for (var i=1; i 100000) {
brk = 0;
break;
}
arr8[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k 9) {
arr8[i] = 1;
i = 1;
}
for (var j = 1; j 9) {
arr8[i] = 1;
i = 1;
}
}
if (i 9) {
arr8[i] = 1;
i = 1;
}
}
}
if (i > 3 && i 9) {
arr8[i] = 1;
i = 1;
}
}
}
if (i > 6) {
for (var q = 7; q 9) {
arr8[i] = 1;
i = 1;
}
}
}
}
}
for (var i=1; i 100000) {
brk = 0;
break;
}
arr9[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k 9) {
arr9[i] = 1;
i = 1;
}
for (var j = 1; j 9) {
arr9[i] = 1;
i = 1;
}
}
if (i 9) {
arr6[i] = 1;
i = 1;
}
}
}
if (i > 3 && i 9) {
arr9[i] = 1;
i = 1;
}
}
}
if (i > 6) {
for (var q = 7; q 9) {
arr9[i] = 1;
i = 1;
}
}
}
}
}
for (var i=1; i
</body></html>
The Play part is basically the same as before; the main difference is in the creation which is done by the function rn().
Ten arrays are instantiated, one for each row and one for the solution:
arr1 = new Array(); arr2 = new Array(); arr3 = new Array(); arr4 = new Array(); arr5 = new Array(); arr6 = new Array(); arr7 = new Array(); arr8 = new Array(); arr9 = new Array(); sol = new Array();
Each row is initialized randomly, with exchanges for any repetitions by incrementing the number. If a number exceeds nine, it is set back to one and the process is recycled:
for (var i = 1; i <= 9; i ++) {
arr1[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k <= 5; k ++) {
for (var j = 1; j < i; j ++) {
if( arr1[i] == arr1[j]) arr1[i] ++;
if (arr1[i]> 9) i = 1;
}
}
}
The array sol is set equal to the created array:
for (var i=1; i <= 9; i ++) {
sol[i] = arr1[i];
}
Subsequent arrays are created by comparing to previous arrays as well as previous items of the array:
for (var i = 0; i <= 9; i ++) {
arr9[i] = 0;
}
for (var i = 1; i <= 9; i ++) {
brk ++;
if (brk > 100000) {
brk = 0;
break;
}
arr9[i] = Math.floor(9*Math.random()) + 1;
for (var k = 0; k <= 5; k ++) {
if (arr9[i] == arr1[i] || arr9[i] == arr2[i] || arr9[i] == arr3[i] || arr9[i] == arr4[i] || arr9[i] == arr5[i] || arr9[i] == arr6[i] || arr9[i] == arr7[i] || arr9[i] == arr8[i] ) arr9[i] ++;
if (arr9[i] > 9) {
arr9[i] = 1;
i = 1;
}
for (var j = 1; j < i; j ++) {
if( arr9[i] == arr9[j]) arr9[i] ++;
if (arr9[i] > 9) {
arr9[i] = 1;
i = 1;
}
}
if (i <= 3) {
for (var q = 1; q <= 3; q ++) {
if( arr9[i] == arr7[q] || arr9[i] == arr8[q] ) arr9[i] ++;
if (arr6[i] > 9) {
arr6[i] = 1;
i = 1;
}
}
}
if (i > 3 && i <=6) {
for (var q = 4; q <= 6; q ++) {
if( arr9[i] == arr7[q] || arr9[i] == arr8[q] ) arr9[i] ++;
if (arr9[i] > 9) {
arr9[i] = 1;
i = 1;
}
}
}
if (i > 6) {
for (var q = 7; q <= 9; q ++) {
if( arr9[i] == arr7[q] || arr9[i] == arr8[q] ) arr9[i] ++;
if (arr9[i] > 9) {
arr9[i] = 1;
i = 1;
}
}
}
}
}
for (var i=1; i <= 9; i ++) {
sol[i + 72] = arr9[i];
}
sol is used to fill the boxes:
document.getElementById(“td” + no).innerHTML = sol[no];
Occasionally if a solution could not be found, the code would get into an endless loop. The code below is used from the forth row on and breaks that loop:
brk ++;
if (brk > 100000) {
brk = 0;
break;
}
I have repeated the generator twenty times and have never failed to get a solution.