Онлайн судоку
Автор: oXteR
В този урок ще видите код който можете да си създадете судоку
1.Създаваме файл sudoku.js
2.В него добавяме
****************************************************************************/
//////////////////////////////////// Global Variables /////////////////////////////////////////
var debug = 0;
var horizondal_line_width = 350;
var vertical_line_height = 370;
var default_number_per_box = 4;
var repeated_at = ""; //The ID of the location where number was repeated.
var compleated = 0; //This will be one when the User hits the 'I give up' Button
//Create a 9x9 2 dimentional Array
var xy = new Array(9);
for(i=0;i<9;i++) {
xy[i] = new Array(9);
}
//Base Games
var puzzles = new Array(
"abc.gdefihdeif.hagcbfgh.cibadebf.iehdcg.ae.acbf.gid.hghdiace.bficgdabhefh.b.f.cg.eaidde.ahfibcg", //14
"a.bfhiec.g.ddcg.fbai.heiehdg.cabfdegi.hc.fabai.cb.df.eghhf.be.agcidbfi.edhgcac.adgf.iheb.g.hebcaf.di", //19
"bfi.edhgcac.adgf.iheb.g.hebcaf.dia.b.fhiec.g.ddcg.fbai.heiehdg.cabfdegi.hc.fabai.cb.df.eghhf.be.agcid", //20
"ib.ad.c.g.efhe.hc.fbiagd.fg.daehcibbhcgd.faiegf.ei.ab.dchdai.hcebfgfgdcai.he.bbeahd.gc.ifih.c.e.bf.gda", //21
"aeh.dfi.cgbcf.b.e.hgiad.gidc.abfeh.fc.g.b.aeihdb.eifdha.gchda.ig.cebfg.bfhd.aeic.dcegi.f.hbaah.ibce.dfg",
"dah.iegfcbbigfd.cehae.fchab.gi.dbh.fe.gacidcedi.bhgaf.ag.i.d.cfbh.egb.ch.dea.f.ihf.e.aci.d.gbid.a.fbgceh",
"cf.b.ag.eidhhd.eif.cbaga.g.ibdh.fceg.acb.ifhe.d.dehgcafb.i.ifbe.hdg.acdc.iebg.f.haegf.ahd.cibhba.ci.f.deg",
"chfgeai.d.be.gdib.hcf.ab.iacf.dh.gefa.d.hcg.ebigic.bd.eahfeb.hfa.i.gdcd.gh.bica.fe.fei.hagd.cb.a.cbdefihg",
"adbfheig.c.icfba.gdeh.he.gcidfa.bcb.ide.ah.fgag.dh.fbei.cefhigcbd.abi.he.cd.gafg.de.fbach.i.acf.g.hid.b.e",
"ied.a.bfghchcfgeia.b.dagbh.cdi.efb.ied.ca.f.ghcga.ef.hdib.fd.hbig.cae.hdie.fg.cabb.a.e.ihcf.dggfcd.b.aehi",
"h.g.bc.ea.idfa.ci.bf.dgehfe.dih.gcbab.fi.ehg.acdh.dcfabi.geag.edc.ib.fhdah.gbe.ficebf.ci.ad.hggi.ch.df.e.ab",
".e.cadbhfgi.fbhegiad.cg.di.afch.bei.h.fba.g.cd.e.badhceif.g.ec.g.dif.b.hag.ibhe.da.fc.chagifde.bfedcabi.g.h",
"ge.c.h.i.fdabaif.bg.d.echdh.bae.cf.gic.he.fbdig.a.dbageifh.c.ifgca.hb.deb.dh.efg.acicf.e.ia.bhdggia.h.c.d.ebf",
"deb.cg.a.ihff.ah.dbi.egccgi.h.fe.bda.gcdf.bihae.a.fb.hd.ec.i.geihg.acfb.dbi.ca.d.hefgge.dbc.fi.haah.f.ie.gdcb"
);
var chosen = 0;
var this_puzzle = ""; //The currently played game's fingerprint
var orginal_game = ""; //The current puzzle
//////////////////////////////////// Cookie Functions ////////////////////////////////
var bites = document.cookie.split(";"); // This is to break cookie down into an array of bites
var sudoku_fingerprint = getCookie("sudoku_fingerprint"); // retrieve all the values
if (sudoku_fingerprint == null || sudoku_fingerprint == "") sudoku_fingerprint=""; //or define default values
function getCookie(cookie) {
for (i=0; i < bites.length; i++) {
nextbite = bites[i].split("="); // break into the "name & value"
if (nextbite[0] == cookie) // if the name = true
return unescape(nextbite[1]); // return this value
}
return null; // if there is no match return null value
}
var today = new Date();
var expiry = new Date(today.getTime() + 28 * 24 * 60 * 60 * 1000); // 28 days
// Set cookie with given name = value pair
function setCookie(name,value) {
if((value!=null) && (value!="")) document.cookie = name + "=" + escape(value) + "; expires=" + expiry.toGMTString();
bites = document.cookie.split(";"); // update all the bites
}
//////////////////////////////////// Co-Ordinates Functions ///////////////////////////////
//Get the index from the given two x and y co-ordinates and return it.
// - Takes 2 and 3 and returns 6.
function getIndex(x,y) {
var index = (x*3) + y - 3;
return index;
}
//Returns the x and y co-ordinates based on the index given as argument.
// - Takes 6 and returns 2 and 3 as an array
function getXY(index) {
var x=1,y=1;
switch (index) {
case 1: x=1; y=1; break;
case 2: x=1; y=2; break;
case 3: x=1; y=3; break;
case 4: x=2; y=1; break;
case 5: x=2; y=2; break;
case 6: x=2; y=3; break;
case 7: x=3; y=1; break;
case 8: x=3; y=2; break;
case 9: x=3; y=3; break;
}
var xy_coods = new Array(x,y);
return xy_coods;
}
////////////////////////////////////// Random Number Genarators //////////////////////////////////////
//Returns a random number between 1 and 9(inclusive)
function rand() {
var number = Math.round(Math.random()*10);
while (number < 1 || number > 9) { //If the number is 0 or 10, get another number.
number = Math.round(Math.random()*10);
}
return number;
}
//Returns a random number(1-9) that is not in the list given as the argument
function uniqueRand(list) {
var number = rand();
for(var a=0;a<list.length;a++) {
if(list[a] == number) { //If the random number was found in the list,
number = rand(); //get a new number,
a=-1; //and start over again.
}
}
return number;
}
/////////////////////////////////////// GUI Functions ////////////////////////////////////
//Display the given data in the said colour
function show(data,color) {
document.getElementById("display_area").innerHTML = data + "<br />\n";
document.getElementById("display_area").style.color = color;
}
//Display the Vertical help line
function helpLineV(line) {
var item = document.getElementById("lv-"+line).style;
if(item.position == "absolute") {
item.position = "relative";
item.height = "10px";
} else {
item.position = "absolute";
item.height = vertical_line_height + "px";
}
}
//Display the Horizondal Help line
function helpLineH(line) {
var item = document.getElementById("lh-"+line).style;
if(item.position == "absolute") {
item.position = "relative";
item.width = "5px";
} else {
item.position = "absolute";
item.width = horizondal_line_width + "px";
}
}
//Returns false if the 'number' given as the argument appears anywhere in the previous row or column.
function checkForUnique(box,cell,number) {
//There is nothing before 1, so we don't have to check it.
if(box>1) {
//All the boxes we will have to check for duplicates for this box - all boxes directly above or left of this box.
var boxes_to_check = new Array();
switch (box) {
case 2 : boxes_to_check.push(1);break;
case 3 : boxes_to_check.push(1,2);break;
case 4 : boxes_to_check.push(1);break;
case 5 : boxes_to_check.push(2,4);break;
case 6 : boxes_to_check.push(3,4,5);break;
case 7 : boxes_to_check.push(1,4);break;
case 8 : boxes_to_check.push(2,5,7);break;
case 9 : boxes_to_check.push(3,6,7,8);break;
}
var id="", value="";
for(i=0;i<boxes_to_check.length;i++) {
xy_coods = getXY(cell);
for(j=1; j<=3; j++) {
//Horizondal Checks
if(box==2 || box==3 || box==5 || box==6 || box==8 || box==9) {
//Nullifier conditions - don't do the checking if the following conditions are true.
if(box==5 && boxes_to_check[i]==2);
else if(box==6 && boxes_to_check[i]==3);
else if(box==8 && (boxes_to_check[i]==2 || boxes_to_check[i]==5));
else if(box==9 && (boxes_to_check[i]==3 || boxes_to_check[i]==6));
else {
//Check the data for redundency here.
cell_to_check = getIndex(xy_coods[0],j);
id = "c" + boxes_to_check[i] + cell_to_check; //Get the id of the cells that must be checked.
value = document.getElementById(id).value;
if(value == number) {
repeated_at = id;
return false; //There is number repeatation - return with error.
}
}
}
//Verical Checks
if(box>=4) {
//Nullifier conditions - don't do the checking if the following conditions are true.
if(box==5 && (boxes_to_check[i]==4)); //The 5th box should only check the 2nd Box in vertical mode
else if(box==6 && (boxes_to_check[i]==4 || boxes_to_check[i]==5));
else if(box==8 && boxes_to_check[i]==7);
else if(box==9 && (boxes_to_check[i]==7 || boxes_to_check[i]==Cool;
else {
cell_to_check = getIndex(j,xy_coods[1]);
id = "c" + boxes_to_check[i] + cell_to_check; //Get the id of the cells that must be checked.
value = document.getElementById(id).value;
if(value == number) {
repeated_at = id;
return false; //There is number repeatation - return with error.
}
}
}
}
}
}
//Check within the box
for(k=1;k<=9;k++) {
id = "c" + box + k;
if(number == document.getElementById(id).value && k != cell) { //If the nubmer is found at some other cell
repeated_at = id;
return false;
}
}
return true;
}
//Insert the value given as the 'value' argument into the entry by the id of 'id'
function insert(id,value) {
document.getElementById(id).value = value
if(value)
document.getElementById(id).disabled = true; //Make it uneditable
else
document.getElementById(id).disabled = false; //Make the fomerly uneditable cells editable
}
//Clear all the fields - and enable all the disabled cells
function clearer() {
var id = ""
document.f.reset(); //Clear the fields
for(var i=1; i<=9; i++) {
for(var j=1; j<=9; j++) {
id = "c"+i+j;
document.getElementById(id).disabled = false;
}
}
}
//Change the background color of cells to white
function discolorCells(cell1,cell2) {
document.getElementById(cell1).style.background = "#fff";
document.getElementById(cell2).style.background = "#fff";
}
//Records the values of all box and cells by coping all values to the 'xy' array.
function recordPosition() {
var value=0;
for(a=0;a<9;a++) {
for(b=0;b<9;b++) {
value = document.getElementById("c"+(a+1)+(b+1)).value;
if(!isNaN(value) && value.length==1) {
xy[a] = value;
} else {
xy[a] = 0;
}
}
}
}
//Convert the current position to a string that we can save and use latter on. This function will create a
// finger print for this game and will save that as a Cookie. The finger print will have two types of data...
// Number(1-9) - The number for that cell. If the number is 3, a 3 digit will be entered there.
// Aphabet(a-z)- The number of empty cells that must be left before the next number is inserted.
//Argument : Action - 1 = Record the game to a database.
// - 0 = Just get the fingerprint of the game and return it
function pos2str(action) {
var str = "";
var zero_count = 0;
var alpha = " abcdefghijklmnopqrstuvwxyz";
if(action) {
recordPosition(); //Get the position in the array
}
for(a=0;a<9;a++) {
for(b=0;b<9;b++) {
if(xy[a]) {
if(zero_count) {
str += alpha.charAt(zero_count); //Include the number of continous zeros - a means 1 zero, b means 2 etc.
zero_count = 0;
}
str += xy[a];
} else {
zero_count++; //Count the empty places
}
}
}
return str;
}
//Convert the given string to a position that can be displayed on the board
//Argument : str - FINGERPRINT = Use this fingerprint to create the game.
function str2pos(str) {
var zero_flag = 0;
var alpha = "abcdefghijklmnopqrstuvwxyz";
var pos = 0;
//The id of the current cell will be calculated form these varabales.
var a = 0;
var b = 0;
str = str.replace(/\./g,"");
while(a<9) {
ch = str.charAt(pos);
id = "c" + (a+1) + (b+1);
if(!isNaN(ch) && !zero_flag) {
insert(id,ch);
} else if(zero_flag) {
insert(id,"");
zero_flag--;
} else {
insert(id,"");
zero_flag = alpha.indexOf(ch);
}
//Get next number if the zero flag is not up
if(!zero_flag) {
pos++;
}
//Update the positions
b++;
if(b>=9) {
b=0;
a++;
}
}
}
//Create a string we will put into the cookie - a little different for the pos2str()
// - This format will have the values of all cells sperated by a ';' char. The provided
// numbers will be prefixed with a dot like - '.5'
function makeCookieString() {
var str = "";
var puzzle_cells = new Array(0);
for(a=0;a<9;a++) {
for(b=0;b<9;b++) {
value = document.getElementById("c"+(a+1)+(b+1)).value;
if(document.getElementById("c"+(a+1)+(b+1)).disabled) {
value = "."+value;
}
puzzle_cells.push(value);
}
}
str = puzzle_cells.join(';');
alert(str);
return str;
}
//Save the Cookie Format string created with the makeCookieString() function to a cookie
function save() {
var str = makeCookieString();
setCookie("sudoku_fingerprint",str);
alert("Game saved.");
}
//Load the game from the cookie string
function load() {
//Clear the previous data
clearer();
//Get the game fingerprint from the Cookie.
var str = getCookie("sudoku_fingerprint");
if(str == "" || str == null) {
alert("No saved games found!")
return false;
}
var index = 0;
var puzzle_cells = str.split(";");
for(a=0;a<9;a++) {
for(b=0;b<9;b++) {
id = "c"+(a+1)+(b+1);//The cell location
number = puzzle_cells[index];
if(number.charAt(0) == ".") { //If there is a '.' char, it ia a provided number
number = number.charAt(1);
document.getElementById(id).disabled = true;
}
if(number) {
//alert(id + " = " + number);
}
document.getElementById(id).value = number;
index++;
}
}
}
//Check all the Rows/Cols for a repeated number
function checker() {
var found = 0;
show("Checking game...","#a84efa");
loop:
for(a=1;a<=9;a++) {
for(b=1;b<=9;b++) {
id = "c"+a+b;
value = document.getElementById(id).value
if(isNaN(value) || value > 9 || value < 1) {
if(value == "") {
show("Empty cells found.","#d78601");
} else {
show("Invalid entries found.","#d78601");
}
found = 1;
document.getElementById(id).style.background = "red"; //Repated number found here.
setTimeout("discolorCells(id,id)",2000);
break loop;
}
else if(value) {
if(!checkForUnique(a,b,value)) {
document.getElementById(id).style.background = "red"; //Repated number found here.
document.getElementById(repeated_at).style.background = "red"; //and here.
setTimeout("discolorCells(repeated_at,id)",2000);//Change the background back to white after 2 secs
found++;
break loop;
}
} else {
show("Empty cells were found. Please complete the puzzle.","#d78601");
document.getElementById(id).style.background = "red"; //Empty
setTimeout("discolorCells(id,id)",2000);
found = 1;
break loop;
}
}
}
if(!found) {
if(compleated)
alert("Sorry - you can't win after giving up. But it is solved.");
else
alert("Congratulations - You have completed the puzzle.");
show("Game Over","#000000");
}
}
//Clear all the unwanted cells.
function reloadGame() {
str2pos(orginal_game); //Use that to rebuild the game
}
//Solve the game
function solve() {
show("Finding the solution to the game...");
if(confirm("This will automaticaly solve the puzzle for you.\nAre you sure you want to do this?\n")) {
str2pos(this_puzzle);
compleated = 1;
show("Solved the puzzle.");
}
}
//This will make new puzzles but replacing all numbers in a base game with other numbers - in effect creating
// a entirely new game. This function is sneaky - Big Time
function makeNewOrder(str) {
//Inits
var alpha = " abcdefghijklmnopqrstuvwxyz";
var new_order = "";
//Get random numbers for all alphas - and store it in a array.
numbers = new Array("0");
for(j=0;j<9;j++) {
new_numbers = uniqueRand(numbers); //Give random position for the numbers
numbers.push(new_numbers);
}
//Now change all the alphas back to numbers - with new digits
for(i=0;i<str.length;i++) {
if(str.charAt(i)=="." || str.charAt(i)=="*" || str.charAt(i)=="x" ||
str.charAt(i)=="_" || str.charAt(i)=="-" || str.charAt(i)=="+") { //It is a special char
new_order += "."
} else {
new_order += numbers[alpha.indexOf(str.charAt(i))]
}
}
return new_order;
}
//Creates the puzzle
function init() {
chosen = Math.floor((Math.random()*10) / (10/puzzles.length)); //'chosen' puzzle should be random
chosen = 2;
this_puzzle = makeNewOrder(puzzles[chosen]);
//Clear the existing numbers first
compleated = 0;
clearer();
var last_box_ended_at = 0;
var extra_number_count = 0;
for(var i=0;i<9;i++) { //Change 1 to 9 :DEBUG:
//Initialisations
var b=0,location_of_fixed_number=0;
var arr_b = new Array();
//Get the numbers for this box from the 'this_puzzle' varaible
var limit = 9;
var this_box = "";
var dot_count = 0;
for(var j=last_box_ended_at; j<last_box_ended_at+limit; j++) {
if(this_puzzle.charAt(j) == ".") {
limit++;
dot_count++;
}
this_box = this_box + this_puzzle.charAt(j);
}
last_box_ended_at = last_box_ended_at + limit;
//Decide how much numbers must appear in this box
number_of_numbers = default_number_per_box - extra_number_count;
extra_number_count = 0;
// 'extra_number_count' is used for reducing the number of populated cells in the next box if
// the current box has more than 4 numbers.
//If the number of dots are more than 4, use it
if (dot_count > number_of_numbers) {
if(rand() > 5) {
extra_number_count = dot_count - number_of_numbers;
}
number_of_numbers = dot_count;
}
//Empty the array.
arr_b = new Array();
//Get the positions in the box and insert the numbers there
for(b=0;b<number_of_numbers;b++) {
location_of_fixed_number = this_box.indexOf(".");
if(location_of_fixed_number + 1) {//If there are dots...
//Remove this dot
this_box = this_box.substring(0,location_of_fixed_number) +
this_box.substring(location_of_fixed_number+1,this_box.length);
} else { //No more dots - get some random locations
location_of_fixed_number = uniqueRand(arr_b); //Give random position for the numbers
location_of_fixed_number--;//uniqueRand gives 1-9. We need it from 0
}
arr_b.push(location_of_fixed_number+1);//Put the number into the don't repeat array
//Get the numbers that should be inserted
insertion_number = this_box.charAt(location_of_fixed_number);
location_of_fixed_number++;//We need this to start from 1 - not from 0
id = "c" + (i+1) + location_of_fixed_number
insert(id,insertion_number); //Show the numbers
}
}
orginal_game = pos2str(2);//Save the game before beginning - for restarting the puzzle
}3.Правиме файл sudoku.html
4.В него добавяме
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head>
<title>Online Sudoku</title>
<META NAME="keywords" CONTENT="sudoku,sundoku,numbers,puzzle,online,game,javascript,script">
<style type="text/css">
.box-table { border:1px solid black; }
.cell { background-color:#fff; font:24px bold; width:30px; border:0px solid #fff; }
.line-v { background-color:#FF6600; }
.line-h { background-color:#006633; }
.spacer { width:15px; }
.control-button { width:200px; }
</style>
<script language="Javascript" type="text/javascript" src="sudoku.js"></script>
</head>
<body onload="init();">
<h1>Online Sudoku V 1.03.B</h1>
<table><tr><td>
<form name="f">
<table class="root-table">
<tr>
<td><table class="box-table">
<tr>
<td class="spacer"> </td>
<td> <span id="lv-11" class="line-v" onclick="helpLineV('11')"> </span></td>
<td> <span id="lv-12" class="line-v" onclick="helpLineV('12')"> </span></td>
<td> <span id="lv-13" class="line-v" onclick="helpLineV('13')"> </span></td>
</tr>
<tr>
<td><span id="lh-11" class="line-h" onclick="helpLineH('11')"> </span> </td>
<td class="celler"><input id='c11' class="cell" type="text" size="1"></td>
<td><input id='c12' class="cell" type="text" size="1"></td>
<td><input id='c13' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><span id="lh-12" class="line-h" onclick="helpLineH('12')"> </span> </td>
<td><input id='c14' class="cell" type="text" size="1"></td>
<td><input id='c15' class="cell" type="text" size="1"></td>
<td><input id='c16' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><span id="lh-13" class="line-h" onclick="helpLineH('13')"> </span> </td>
<td><input id='c17' class="cell" type="text" size="1"></td>
<td><input id='c18' class="cell" type="text" size="1"></td>
<td><input id='c19' class="cell" type="text" size="1"></td>
</tr>
</table></td>
<td><table class="box-table">
<tr>
<td> <span id="lv-21" class="line-v" onclick="helpLineV('21')"> </span></td>
<td> <span id="lv-22" class="line-v" onclick="helpLineV('22')"> </span></td>
<td> <span id="lv-23" class="line-v" onclick="helpLineV('23')"> </span></td>
</tr>
<tr>
<td><input id='c21' class="cell" type="text" size="1"></td>
<td><input id='c22' class="cell" type="text" size="1"></td>
<td><input id='c23' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><input id='c24' class="cell" type="text" size="1"></td>
<td><input id='c25' class="cell" type="text" size="1"></td>
<td><input id='c26' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><input id='c27' class="cell" type="text" size="1"></td>
<td><input id='c28' class="cell" type="text" size="1"></td>
<td><input id='c29' class="cell" type="text" size="1"></td>
</tr>
</table></td>
<td><table class="box-table">
<tr>
<td> <span id="lv-31" class="line-v" onclick="helpLineV('31')"> </span></td>
<td> <span id="lv-32" class="line-v" onclick="helpLineV('32')"> </span></td>
<td> <span id="lv-33" class="line-v" onclick="helpLineV('33')"> </span></td>
</tr>
<tr>
<td><input id='c31' class="cell" type="text" size="1"></td>
<td><input id='c32' class="cell" type="text" size="1"></td>
<td><input id='c33' class="cell" type="text" size="1"></td>
<td><span class="line-h" onclick="helpLineH('11')"> </span></td>
</tr>
<tr>
<td><input id='c34' class="cell" type="text" size="1"></td>
<td><input id='c35' class="cell" type="text" size="1"></td>
<td><input id='c36' class="cell" type="text" size="1"></td>
<td><span class="line-h" onclick="helpLineH('12')"> </span></td>
</tr>
<tr>
<td><input id='c37' class="cell" type="text" size="1"></td>
<td><input id='c38' class="cell" type="text" size="1"></td>
<td><input id='c39' class="cell" type="text" size="1"></td>
<td><span class="line-h" onclick="helpLineH('13')"> </span></td>
</tr>
</table></td>
</tr>
<tr>
<td><table class="box-table">
<tr>
<td class="spacer"><span id="lh-21" class="line-h" onclick="helpLineH('21')"> </span> </td>
<td><input id='c41' class="cell" type="text" size="1"></td>
<td><input id='c42' class="cell" type="text" size="1"></td>
<td><input id='c43' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><span id="lh-22" class="line-h" onclick="helpLineH('22')"> </span> </td>
<td><input id='c44' class="cell" type="text" size="1"></td>
<td><input id='c45' class="cell" type="text" size="1"></td>
<td><input id='c46' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><span id="lh-23" class="line-h" onclick="helpLineH('23')"> </span> </td>
<td><input id='c47' class="cell" type="text" size="1"></td>
<td><input id='c48' class="cell" type="text" size="1"></td>
<td><input id='c49' class="cell" type="text" size="1"></td>
</tr>
</table></td>
<td><table class="box-table">
<tr>
<td><input id='c51' class="cell" type="text" size="1"></td>
<td><input id='c52' class="cell" type="text" size="1"></td>
<td><input id='c53' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><input id='c54' class="cell" type="text" size="1"></td>
<td><input id='c55' class="cell" type="text" size="1"></td>
<td><input id='c56' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><input id='c57' class="cell" type="text" size="1"></td>
<td><input id='c58' class="cell" type="text" size="1"></td>
<td><input id='c59' class="cell" type="text" size="1"></td>
</tr>
</table></td>
<td><table class="box-table">
<tr>
<td><input id='c61' class="cell" type="text" size="1"></td>
<td><input id='c62' class="cell" type="text" size="1"></td>
<td><input id='c63' class="cell" type="text" size="1"></td>
<td><span class="line-h" onclick="helpLineH('21')"> </span></td>
</tr>
<tr>
<td><input id='c64' class="cell" type="text" size="1"></td>
<td><input id='c65' class="cell" type="text" size="1"></td>
<td><input id='c66' class="cell" type="text" size="1"></td>
<td><span class="line-h" onclick="helpLineH('22')"> </span></td>
</tr>
<tr>
<td><input id='c67' class="cell" type="text" size="1"></td>
<td><input id='c68' class="cell" type="text" size="1"></td>
<td><input id='c69' class="cell" type="text" size="1"></td>
<td><span class="line-h" onclick="helpLineH('23')"> </span></td>
</tr>
</table></td>
</tr>
<tr>
<td><table class="box-table">
<tr>
<td><span id="lh-31" class="line-h" onclick="helpLineH('31')"> </span> </td>
<td><input id='c71' class="cell" type="text" size="1"></td>
<td><input id='c72' class="cell" type="text" size="1"></td>
<td><input id='c73' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><span id="lh-32" class="line-h" onclick="helpLineH('32')"> </span> </td>
<td><input id='c74' class="cell" type="text" size="1"></td>
<td><input id='c75' class="cell" type="text" size="1"></td>
<td><input id='c76' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><span id="lh-33" class="line-h" onclick="helpLineH('33')"> </span> </td>
<td><input id='c77' class="cell" type="text" size="1"></td>
<td><input id='c78' class="cell" type="text" size="1"></td>
<td><input id='c79' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td class="spacer"> </td>
<td> <span class="line-v" onclick="helpLineV('11')"> </span></td>
<td> <span class="line-v" onclick="helpLineV('12')"> </span></td>
<td> <span class="line-v" onclick="helpLineV('13')"> </span></td>
</tr>
</table></td>
<td><table class="box-table">
<tr>
<td><input id='c81' class="cell" type="text" size="1"></td>
<td><input id='c82' class="cell" type="text" size="1"></td>
<td><input id='c83' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><input id='c84' class="cell" type="text" size="1"></td>
<td><input id='c85' class="cell" type="text" size="1"></td>
<td><input id='c86' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td><input id='c87' class="cell" type="text" size="1"></td>
<td><input id='c88' class="cell" type="text" size="1"></td>
<td><input id='c89' class="cell" type="text" size="1"></td>
</tr>
<tr>
<td> <span class="line-v" onclick="helpLineV('21')"> </span></td>
<td> <span class="line-v" onclick="helpLineV('22')"> </span></td>
<td> <span class="line-v" onclick="helpLineV('23')"> </span></td>
</tr>
</table></td>
<td><table class="box-table">
<tr>
<td><input id='c91' class="cell" type="text" size="1"></td>
<td><input id='c92' class="cell" type="text" size="1"></td>
<td><input id='c93' class="cell" type="text" size="1"></td>
<td><span id="lh-31" class="line-h" onclick="helpLineH('31')"> </span></td>
</tr>
<tr>
<td><input id='c94' class="cell" type="text" size="1"></td>
<td><input id='c95' class="cell" type="text" size="1"></td>
<td><input id='c96' class="cell" type="text" size="1"></td>
<td><span id="lh-32" class="line-h" onclick="helpLineH('32')"> </span></td>
</tr>
<tr>
<td><input id='c97' class="cell" type="text" size="1"></td>
<td><input id='c98' class="cell" type="text" size="1"></td>
<td><input id='c99' class="cell" type="text" size="1"></td>
<td><span id="lh-33" class="line-h" onclick="helpLineH('33')"> </span></td>
</tr>
<tr>
<td> <span class="line-v" onclick="helpLineV('31')"> </span></td>
<td> <span class="line-v" onclick="helpLineV('32')"> </span></td>
<td> <span class="line-v" onclick="helpLineV('33')"> </span></td>
<td> </td>
</tr>
</table></td>
</tr>
</table>
</form>
</td><td valign="top">
<input type="button" class="control-button" onClick="checker()" value="I have completed the puzzle" /><br />
<input type="button" class="control-button" onClick="solve()" value="I give Up" /><br /><br />
<input type="button" class="control-button" onClick="save()" value="Save this puzzle" /><br />
<input type="button" class="control-button" onClick="load()" value="Reload Saved puzzle" /><br /><br />
<input type="button" class="control-button" onClick="reloadGame()" value="Restart this puzzle" /><br />
<input type="button" class="control-button" onClick="init()" value="New Puzzle" />
<br /><br />
<p id="powered-by">Powered By oXteR
</td></tr></table>
<br /><br />
<div id="display_area"></div>
<hr />
</body>
</html>


