|
Willkommen,
Gast
|
Bitte beachten, dass es hier nur um Javascripts geht, die sich in unserem Archiv befinden.
THEMA: Rekusive Funktion
Rekusive Funktion 2 Jahre, 10 Monate her #1151
|
Wir müssen für die Schule ein Programm entwickeln das ein SUDOKU löst. Ich habe dafür eine rekusive funktion gebaut. Nur leider ist noch ein Fehler drin und ich komme momentan nicht weiter.
function schleife(Feld,spalte,zeile)
{
// richtung | 0 = vorwärts | 1 = zurück
if (Feld[spalte][zeile][1]==1)
{
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Fester Wert");
// document.write("<br>Richtung: "+richtung);
// if (richtung==0)
// {
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
ende();
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
// richtung=0;
// }
/* else
{
spalte--;
if (spalte<1)
{
spalte=8;
zeile--;
}
richtung=1;
} */
// schleife(Feld,spalte,zeile);
// if (ende==1)
// return;
}
else
{
for (zahl=1;zahl<=9;zahl++)
{
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Bekomme neue Zahl");
if (check(Feld,spalte,zeile,zahl)==true)
{
Feld[spalte][zeile][0]=zahl;
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Zahl ist OK und geschrieben");
Feldausgabe(Feld);
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
ende();
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
}
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Zahl nicht OK");
if (zahl==9)
{
Feld[spalte][zeile][0]=0;
document.write("<br>"+spalte+","+zeile+" () gehe zurück da Feld zurück");
return;
/* Feld[spalte][zeile][0]=0;
spalte--;
document.write("<br>"+spalte+","+zeile+" () Gehe Feld zurück");
if (spalte<0)
{
spalte=8;
zeile--;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch rückwärts");
}
schleife(Feld,spalte,zeile,1);
if (ende==1)
return; */
}
}
}
}
Die check und end Funktionen die verwendet werden funktionieren. Währe für Tipps dankbar. zum anschauen als Quelltext (komplettes Script) Zur Funktion schleife: die hier oben im Kasten ist aktueller als die im Quelltext |
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7174
|
Weißte was das Provlem sein könnte? Du deklarierst die Variable zahl nicht mit var, das bedeutet sie wird global von Javascript bearbeitet. Das hat zur Folge, das wenn der Suchlauf bei 9 ankommt und zurückspringt, nur noch auf die 9 überprüfen kann und da er ja aber hinter der Richtigkeitsprüfung wieder reinspringt automatisch weiter zurückspringt, es findet ja nie wieder die Kontrolle statt ob denn die 9 ins Feld passen würde. Also deklariere mal zahl für den lokalen Bereichen dann könnte es vielleicht klappen.
|
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7175
|
Thx für den Tipp so wie es Momentan ausschaut, scheint das die Ursache gewesen zu sein.
Nur habe ich jetzt das Problemm das er manchmal Zahlen überschreibt die vorher fest drin waren und eigendlich übersprungen werden müssten. Irgendwo ist noch der Wurm drin.
<html>
<head>
<script type="text/javascript">
function main()
{
const ende;
var x,y,i,j,Feld;
Feld=new Array(9);
for (i=0; i<Feld.length;i++)
{
Feld[i] = new Array(9);
for (j=0;j<Feld[i].length;j++)
{
Feld[i][j] = new Array(2);
Feld[i][j][1] = 0;
}
}
//Felder füllen FELD[SPALTE][ZEILE][SCHUTZ]
Feld[0][0][0]=8;
Feld[1][0][0]=2;
Feld[2][0][0]=0;
Feld[3][0][0]=0;
Feld[4][0][0]=9;
Feld[5][0][0]=0;
Feld[6][0][0]=0;
Feld[7][0][0]=0;
Feld[8][0][0]=0;
Feld[0][1][0]=0;
Feld[1][1][0]=0;
Feld[2][1][0]=0;
Feld[3][1][0]=0;
Feld[4][1][0]=0;
Feld[5][1][0]=5;
Feld[6][1][0]=0;
Feld[7][1][0]=0;
Feld[8][1][0]=0;
Feld[0][2][0]=0;
Feld[1][2][0]=0;
Feld[2][2][0]=0;
Feld[3][2][0]=0;
Feld[4][2][0]=0;
Feld[5][2][0]=0;
Feld[6][2][0]=0;
Feld[7][2][0]=0;
Feld[8][2][0]=0;
Feld[0][3][0]=0;
Feld[1][3][0]=0;
Feld[2][3][0]=0;
Feld[3][3][0]=7;
Feld[4][3][0]=0;
Feld[5][3][0]=0;
Feld[6][3][0]=0;
Feld[7][3][0]=0;
Feld[8][3][0]=0;
Feld[0][4][0]=0;
Feld[1][4][0]=8;
Feld[2][4][0]=0;
Feld[3][4][0]=0;
Feld[4][4][0]=0;
Feld[5][4][0]=0;
Feld[6][4][0]=0;
Feld[7][4][0]=0;
Feld[8][4][0]=0;
Feld[0][5][0]=0;
Feld[1][5][0]=0;
Feld[2][5][0]=0;
Feld[3][5][0]=0;
Feld[4][5][0]=0;
Feld[5][5][0]=0;
Feld[6][5][0]=0;
Feld[7][5][0]=0;
Feld[8][5][0]=0;
Feld[0][6][0]=0;
Feld[1][6][0]=0;
Feld[2][6][0]=0;
Feld[3][6][0]=0;
Feld[4][6][0]=0;
Feld[5][6][0]=0;
Feld[6][6][0]=0;
Feld[7][6][0]=0;
Feld[8][6][0]=0;
Feld[0][7][0]=0;
Feld[1][7][0]=0;
Feld[2][7][0]=0;
Feld[3][7][0]=0;
Feld[4][7][0]=0;
Feld[5][7][0]=0;
Feld[6][7][0]=0;
Feld[7][7][0]=0;
Feld[8][7][0]=0;
Feld[0][8][0]=0;
Feld[1][8][0]=0;
Feld[2][8][0]=0;
Feld[3][8][0]=0;
Feld[4][8][0]=0;
Feld[5][8][0]=0;
Feld[6][8][0]=0;
Feld[7][8][0]=0;
Feld[8][8][0]=0;
for (zeile=0;zeile<=8;zeile++)
{
for (spalte=0;spalte<=8;spalte++)
{
if (Feld[spalte][zeile][0]>0)
Feld[spalte][zeile][1]=1;
else
Feld[spalte][zeile][1]=0;
}
}
//******************************************************************
// Ausgabe des Soduko-Felds
//******************************************************************
document.write("********** SUDOKU-FELD (VORHER) **********");
Feldausgabe(Feld);
// Test für die check Funktion
var zeile,spalte,zahl;
spalte=1;
zeile=0;
zahl=1;
document.write("Feld["+spalte+"]["+zeile+"] mit dem Wert "+zahl+" ist "+check(Feld,spalte,zeile,zahl));
test(1);
ende=0;
schleife(Feld,0,0);
document.write("<br><br>********** SUDOKU-FELD (LÖSUNG) **********");
Feldausgabe(Feld);
}
function test(a)
{
document.write("<br>neu");
while(a<=4)
{
document.write("<br>"+a);
a++;
test(a)
}
document.write("<br>return");
return;
}
function schleife(Feld,spalte,zeile)
{
var zahl;
if (Feld[spalte][zeile][1]==1)
{
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Fester Wert");
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
ende();
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
}
else
{
for (zahl=1;zahl<=9;zahl++)
{
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Bekomme neue Zahl");
if (check(Feld,spalte,zeile,zahl)==true)
{
Feld[spalte][zeile][0]=zahl;
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Zahl ist OK und geschrieben");
Feldausgabe(Feld);
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
ende();
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
}
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Zahl nicht OK");
if (zahl==9)
{
Feld[spalte][zeile][0]=0;
document.write("<br>"+spalte+","+zeile+" () gehe zurück da Feld zurück");
return;
}
}
}
}
function ende()
{
if (zeile>8)
{
document.write("ERFOLGREICH");
ende=1;
document.write("<br>ENDE ist gesetzt auf: "+ende);
return;
}
}
//Funktion zur Überprüfen der Zeilen, Spalten und des 3x3 Feldes
function check(Feld,spalte,zeile,zahl)
{
if (check_zeile(zeile,zahl,Feld)==false)
return false;
if (check_spalte(spalte,zahl,Feld)==false)
return false;
if (check_3x3(spalte,zeile,zahl,Feld)==false)
return false;
return true;
}
//Funktion für die ZeilenÜberprüfung
function check_zeile(zeile,zahl,Feld)
{
var i;
for (i=0;i<=8;i++)
{
if (Feld[i][zeile][0]==zahl)
return false;
}
}
//Funktion für die Spaltenüberprüfung
function check_spalte(spalte,zahl,Feld)
{
var i;
for (i=0;i<=8;i++)
{
if (Feld[spalte][i][0]==zahl)
return false;
}
}
//Funktion für die Feldüberprüfung
function check_3x3(spalte,zeile,zahl,Feld)
{
var fz,fs,i,j;
fz=0;
if (zeile>=3)
fz=3;
if (zeile>=6)
fz=6;
fs=0;
if (spalte>=3)
fs=3;
if (spalte>=6)
fs=6;
for (j=fz;j<=fz+2;j++)
{
for (i=fs;i<=fs+2;i++)
{
if (Feld[i][j][0]==zahl)
return false;
}
}
}
function Feldausgabe(Feld)
{
// var spalte,zeile;
document.write("<br><br>(Spalte) ");
for (spalte=0;spalte<9;spalte++)
{
document.write(" "+spalte+" ");
if (spalte==2||spalte==5)
document.write("|");
}
document.write("<br><br>");
for (zeile=0;zeile<9;zeile++)
{
document.write("(Zeile "+zeile+") ");
for (spalte=0;spalte<9;spalte++)
{
document.write(" "+Feld[spalte][zeile][0]+" ");
if (spalte==2||spalte==5)
document.write("|");
}
document.write("<br>");
if (zeile==2||zeile==5)
document.write("__________________________________________<br>");
}
document.write("<br><br><br>");
}
</script>
</head>
<body>
<script type="text/javascript">
main(); // Sudoku starten!
</script>
</body>
</html>
|
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7176
|
Also... Zwei Probleme gibt es:
1. spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
}Bewirkt das jedesmal wenn einemögliche Zahl gefunden wurde, Spalte und Zeile erhöht wird, springt man aber zurück weil weiter vorne im Feld ein Fehler auftritt wird die Zelle nicht mehr geändert sondern bleibt auf der vorhergehenden Zelle stehen. Nach Funktionsaufruf der nächsten Zelle, spricht dem Rücksprungpunkt, musst du diese Änderung rückgängig machen. 2. Du rufst trotz des Aufrufs ende() die Funktion schleife(Feld,0,9) auf, wodurch es nach erfolgreichen Beenden zu einem Fehler kommt da Feld[0][9][1] nicht definiert ist. Könntest du beheben indem du die Variable ende abfragst ehe du schleife aufrufst. Ich hoffe ich konnte dir weiterhelfen. |
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7177
|
Ja danke habs hin bekommen.
Hast du eventuell noch einen Tipp wie ich den Code am Besten testen kann. Bzw welche Möglichkeiten es gibt oder wie ich da am besten ran gehe. Werde mich jetzt mal an die Grafische Oberfläche machen. Weis zwar noch nicht wie aber eventuell finde ich ne Idee bei Goggle. Hier noch mal der geänderte Code!
<html>
<head>
<script type="text/javascript">
function main()
{
const ende;
var x,y,i,j,Feld;
Feld=new Array(9);
for (i=0; i<Feld.length;i++)
{
Feld[i] = new Array(9);
for (j=0;j<Feld[i].length;j++)
{
Feld[i][j] = new Array(2);
Feld[i][j][1] = 0;
}
}
//Felder füllen FELD[SPALTE][ZEILE][SCHUTZ]
Feld[0][0][0]=8;
Feld[1][0][0]=2;
Feld[2][0][0]=0;
Feld[3][0][0]=0;
Feld[4][0][0]=9;
.........
Feld[6][8][0]=0;
Feld[7][8][0]=0;
Feld[8][8][0]=0;
for (zeile=0;zeile<=8;zeile++)
{
for (spalte=0;spalte<=8;spalte++)
{
if (Feld[spalte][zeile][0]>0)
Feld[spalte][zeile][1]=1;
else
Feld[spalte][zeile][1]=0;
}
}
//******************************************************************
// Ausgabe des Soduko-Felds
//******************************************************************
document.write("********** SUDOKU-FELD (VORHER) **********");
Feldausgabe(Feld);
// Test für die check Funktion
var zeile,spalte,zahl;
spalte=1;
zeile=0;
zahl=1;
document.write("Feld["+spalte+"]["+zeile+"] mit dem Wert "+zahl+" ist "+check(Feld,spalte,zeile,zahl));
test(1);
ende=0;
schleife(Feld,0,0);
document.write("<br><br>********** SUDOKU-FELD (LÖSUNG) **********");
Feldausgabe(Feld);
}
function test(a)
{
document.write("<br>neu");
while(a<=4)
{
document.write("<br>"+a);
a++;
test(a)
}
document.write("<br>return");
return;
}
function schleife(Feld,spalte,zeile)
{
var zahl,s,z;
s=spalte;
z=zeile;
if (Feld[spalte][zeile][1]==1)
{
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Fester Wert");
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
{
ende();
return;
}
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
spalte=s;
zeile=z;
}
else
{
for (zahl=1;zahl<=9;zahl++)
{
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Bekomme neue Zahl");
if (check(Feld,spalte,zeile,zahl)==true)
{
Feld[spalte][zeile][0]=zahl;
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Zahl ist OK und geschrieben");
Feldausgabe(Feld);
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
{
ende();
return;
}
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
spalte=s;
zeile=z;
}
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Zahl nicht OK");
if (zahl==9)
{
Feld[spalte][zeile][0]=0;
document.write("<br>"+spalte+","+zeile+" () gehe zurück da Feld zurück");
return;
}
}
}
}
function ende()
{
if (zeile>8)
{
document.write("ERFOLGREICH");
ende=1;
document.write("<br>ENDE ist gesetzt auf: "+ende);
return;
}
}
//Funktion zur Überprüfen der Zeilen, Spalten und des 3x3 Feldes
function check(Feld,spalte,zeile,zahl)
{
if (check_zeile(zeile,zahl,Feld)==false)
return false;
if (check_spalte(spalte,zahl,Feld)==false)
return false;
if (check_3x3(spalte,zeile,zahl,Feld)==false)
return false;
return true;
}
//Funktion für die ZeilenÜberprüfung
function check_zeile(zeile,zahl,Feld)
{
var i;
for (i=0;i<=8;i++)
{
if (Feld[i][zeile][0]==zahl)
return false;
}
}
//Funktion für die Spaltenüberprüfung
function check_spalte(spalte,zahl,Feld)
{
var i;
for (i=0;i<=8;i++)
{
if (Feld[spalte][i][0]==zahl)
return false;
}
}
//Funktion für die Feldüberprüfung
function check_3x3(spalte,zeile,zahl,Feld)
{
var fz,fs,i,j;
fz=0;
if (zeile>=3)
fz=3;
if (zeile>=6)
fz=6;
fs=0;
if (spalte>=3)
fs=3;
if (spalte>=6)
fs=6;
for (j=fz;j<=fz+2;j++)
{
for (i=fs;i<=fs+2;i++)
{
if (Feld[i][j][0]==zahl)
return false;
}
}
}
function Feldausgabe(Feld)
{
// var spalte,zeile;
document.write("<br><br>(Spalte) ");
for (spalte=0;spalte<9;spalte++)
{
document.write(" "+spalte+" ");
if (spalte==2||spalte==5)
document.write("|");
}
document.write("<br><br>");
for (zeile=0;zeile<9;zeile++)
{
document.write("(Zeile "+zeile+") ");
for (spalte=0;spalte<9;spalte++)
{
document.write(" "+Feld[spalte][zeile][0]+" ");
if (spalte==2||spalte==5)
document.write("|");
}
document.write("<br>");
if (zeile==2||zeile==5)
document.write("__________________________________________<br>");
}
document.write("<br><br><br>");
}
</script>
</head>
<body>
<script type="text/javascript">
main(); // Sudoku starten!
</script>
</body>
</html>
|
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7178
|
Testen... also da könnteste halt dir ein Sudokubuch nehmen und die also Beispiele nutzen. Oder du schreibst ein weiteres kleines Skript das selbstständig ein Sudoku erzeugt. Durch deine Ausgaben kannst du leicht nachvollziehen ob Fehler drin sind.
if (Feld[spalte][zeile][0]>0)
Feld[spalte][zeile][1]=1;
else
Feld[spalte][zeile][1]=0;Das else kannste weglassen, sind ja vorher schon alle Zellen auf 0 gesetzt worden Ich schau mir den Code später nochmal komplett an, vielleicht fällt mir dann noch was auf. |
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7179
|
Stimmt hast recht ist doppelt
habe das Script mal um 2 punkte erweitert. Und zwar das wenn man bei der eingabe Fehler macht schon einen abbruch bekommt BSP1: (Spalte) 0 1 2 | 3 4 5 | 6 7 8 (Zeile 0) 8 2 4 | 0 9 0 | 0 0 0 (Zeile 1) 0 0 0 | 1 0 5 | 0 0 0 (Zeile 2) 5 6 0 | 0 0 0 | 0 0 0 __________________________________________ (Zeile 3) 1 0 0 | 7 7 0 | 0 0 0 <---- Die 7 ist doppelt (Zeile 4) 0 8 0 | 0 0 0 | 0 0 0 (Zeile 5) 0 0 0 | 0 0 0 | 0 0 0 __________________________________________ (Zeile 6) 0 0 0 | 0 0 0 | 0 0 0 (Zeile 7) 0 0 0 | 0 0 0 | 0 0 0 (Zeile 8) 0 0 0 | 0 0 0 | 0 0 0 BSP2: (Spalte) 0 1 2 | 3 4 5 | 6 7 8 (Zeile 0) 8 2 4 | 0 9 0 | 0 0 0 (Zeile 1) 0 0 0 | 1 0 5 | 0 0 0 <--- 1 kann nicht mehr in das erste 3x3 (Zeile 2) 5 6 7 | 0 0 0 | 0 0 0 Feld geschrieben werden __________________________________________ (Zeile 3) 1 0 0 | 7 0 0 | 0 0 0 (Zeile 4) 0 8 0 | 0 0 0 | 0 0 0 (Zeile 5) 0 0 0 | 0 0 0 | 0 0 0 __________________________________________ (Zeile 6) 0 0 0 | 0 0 0 | 0 0 0 (Zeile 7) 0 0 0 | 0 0 0 | 0 0 0 (Zeile 8) 0 0 0 | 0 0 0 | 0 0 0 Und hier nochmal der überarbeitete Code
<html>
<head>
<script type="text/javascript">
function main()
{
ende=0;
var x,y,i,j,Feld;
Feld=new Array(9);
for (i=0; i<Feld.length;i++)
{
Feld[i] = new Array(9);
for (j=0;j<Feld[i].length;j++)
{
Feld[i][j] = new Array(2);
Feld[i][j][1] = 0;
}
}
//Felder füllen FELD[SPALTE][ZEILE][SCHUTZ]
Feld[0][0][0]=8;
Feld[1][0][0]=2;
Feld[2][0][0]=4;
Feld[3][0][0]=0;
................
Feld[6][8][0]=0;
Feld[7][8][0]=0;
Feld[8][8][0]=0;
for (zeile=0;zeile<=8;zeile++)
{
for (spalte=0;spalte<=8;spalte++)
{
document.write("<br>"+spalte+","+zeile+" () Neue Position");
if (Feld[spalte][zeile][0]>0)
{
if (check(Feld,spalte,zeile,Feld[spalte][zeile][0])==false)
end(2);
Feld[spalte][zeile][1]=1;
}
}
}
//******************************************************************
// Ausgabe des Soduko-Felds
//******************************************************************
document.write("********** SUDOKU-FELD (VORHER) **********");
Feldausgabe(Feld);
// Test für die check Funktion
/* var zeile,spalte,zahl;
spalte=1;
zeile=0;
zahl=1;
document.write("Feld["+spalte+"]["+zeile+"] mit dem Wert "+zahl+" ist "+check(Feld,spalte,zeile,zahl));
*/
// test(1); // Test einer Rekursiven Funktion
document.write(ende);
if (ende!=2)
schleife(Feld,0,0);
end(0);
document.write("<br><br>********** SUDOKU-FELD (LÖSUNG) **********");
Feldausgabe(Feld);
}
function test(a)
{
document.write("<br>neu");
while(a<=4)
{
document.write("<br>"+a);
a++;
test(a)
}
document.write("<br>return");
return;
}
function schleife(Feld,spalte,zeile)
{
var zahl,s,z;
s=spalte;
z=zeile;
if (Feld[spalte][zeile][1]==1)
{
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Fester Wert");
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
{
end(1);
return;
}
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
spalte=s;
zeile=z;
}
else
{
for (zahl=1;zahl<=9;zahl++)
{
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Bekomme neue Zahl");
if (check(Feld,spalte,zeile,zahl)==true)
{
Feld[spalte][zeile][0]=zahl;
document.write("<br>"+spalte+","+zeile+" ("+Feld[spalte][zeile][0]+") Zahl ist OK und geschrieben");
Feldausgabe(Feld);
spalte++;
if (spalte>8)
{
spalte=0;
zeile++;
document.write("<br>"+spalte+","+zeile+" () Zeilenumbruch vorwärts");
if (zeile>8)
{
end(1);
return;
}
}
document.write("<br>"+spalte+","+zeile+" () Neue Position");
schleife(Feld,spalte,zeile);
if (ende==1)
return;
spalte=s;
zeile=z;
}
document.write("<br>"+spalte+","+zeile+" ("+zahl+") Zahl nicht OK");
if (zahl==9)
{
Feld[spalte][zeile][0]=0;
document.write("<br>"+spalte+","+zeile+" () gehe zurück da Feld zurück");
return;
}
}
}
}
function end(wert)
{
if (wert==1)
ende=1;
if (wert==2)
ende=2;
document.write("<br>ENDE ist gesetzt auf: "+ende);
if (wert==0)
{
if (ende==0)
document.write("<br>Sudoku kann nicht gelöst werden (vorgegebene Zahlen verstoßen gegen die Regeln)");
if (ende==1)
document.write("<br>Sudoku wurde erfolgreich gelöst");
if (ende==2)
document.write("<br>Sudoku kann nicht gelöst werden (Die Kombination der vorgegeben Zahlen läst keine Lösung zu)");
}
}
//Funktion zur Überprüfen der Zeilen, Spalten und des 3x3 Feldes
function check(Feld,spalte,zeile,zahl)
{
if (check_zeile(spalte,zeile,zahl,Feld)==false)
return false;
if (check_spalte(spalte,zeile,zahl,Feld)==false)
return false;
if (check_3x3(spalte,zeile,zahl,Feld)==false)
return false;
return true;
}
//Funktion für die ZeilenÜberprüfung
function check_zeile(spalte,zeile,zahl,Feld)
{
var i;
for (i=0;i<=8;i++)
{
if (i==spalte)
continue;
if (Feld[i][zeile][0]==zahl)
return false;
}
}
//Funktion für die Spaltenüberprüfung
function check_spalte(spalte,zeile,zahl,Feld)
{
var i;
for (i=0;i<=8;i++)
{
if (i==zeile)
continue;
if (Feld[spalte][i][0]==zahl)
return false;
}
}
//Funktion für die Feldüberprüfung
function check_3x3(spalte,zeile,zahl,Feld)
{
var fz,fs,i,j;
fz=0;
if (zeile>=3)
fz=3;
if (zeile>=6)
fz=6;
fs=0;
if (spalte>=3)
fs=3;
if (spalte>=6)
fs=6;
for (j=fz;j<=fz+2;j++)
{
for (i=fs;i<=fs+2;i++)
{
if (i==spalte&&j==zeile)
continue;
if (Feld[i][j][0]==zahl)
return false;
}
}
}
function Feldausgabe(Feld)
{
var spalte,zeile;
document.write("<br><br>(Spalte) ");
for (spalte=0;spalte<9;spalte++)
{
document.write(" "+spalte+" ");
if (spalte==2||spalte==5)
document.write("|");
}
document.write("<br><br>");
for (zeile=0;zeile<9;zeile++)
{
document.write("(Zeile "+zeile+") ");
for (spalte=0;spalte<9;spalte++)
{
document.write(" "+Feld[spalte][zeile][0]+" ");
if (spalte==2||spalte==5)
document.write("|");
}
document.write("<br>");
if (zeile==2||zeile==5)
document.write("__________________________________________<br>");
}
document.write("<br><br><br>");
}
</script>
</head>
<body>
<script type="text/javascript">
main(); // Sudoku starten!
</script>
</body>
</html>
Stimmt das, dass die Variable ende wenn ich nichts davor schreibe global bleibt oder muss da auch noch was davor? Wenn ich mir jetzt in Html eine Tabelle mache, mit meinen ganzen Eingabefeldern! Wie bekomme ich dann, was da drin steht in meine Array? Welche Befehle nutze ich da? Das Formular würde folgender massen aussehen: (HTML)
<form action="input_text.htm">
<table border="1">
<tr>
<td>
<table border="0">
<tr>
<td><input name="00" id="00" type="text" size="1" maxlength="1"></p></td>
<td><input name="10" id="10" type="text" size="1" maxlength="1"></p></td>
<td><input name="20" id="20" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="01" id="01" type="text" size="1" maxlength="1"></p></td>
<td><input name="11" id="11" type="text" size="1" maxlength="1"></p></td>
<td><input name="21" id="21" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="02" id="02" type="text" size="1" maxlength="1"></p></td>
<td><input name="12" id="12" type="text" size="1" maxlength="1"></p></td>
<td><input name="22" id="22" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
<td>
<table border="0">
<tr>
<td><input name="30" id="30" type="text" size="1" maxlength="1"></p></td>
<td><input name="40" id="40" type="text" size="1" maxlength="1"></p></td>
<td><input name="50" id="50" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="31" id="31" type="text" size="1" maxlength="1"></p></td>
<td><input name="41" id="41" type="text" size="1" maxlength="1"></p></td>
<td><input name="51" id="51" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="32" id="32" type="text" size="1" maxlength="1"></p></td>
<td><input name="42" id="42" type="text" size="1" maxlength="1"></p></td>
<td><input name="52" id="52" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
<td>
<table border="0">
<tr>
<td><input name="60" id="60" type="text" size="1" maxlength="1"></p></td>
<td><input name="70" id="70" type="text" size="1" maxlength="1"></p></td>
<td><input name="80" id="80" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="61" id="61" type="text" size="1" maxlength="1"></p></td>
<td><input name="71" id="71" type="text" size="1" maxlength="1"></p></td>
<td><input name="81" id="81" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="62" id="62" type="text" size="1" maxlength="1"></p></td>
<td><input name="72" id="72" type="text" size="1" maxlength="1"></p></td>
<td><input name="82" id="82" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table border="0">
<tr>
<td><input name="03" id="03" type="text" size="1" maxlength="1"></p></td>
<td><input name="13" id="13" type="text" size="1" maxlength="1"></p></td>
<td><input name="23" id="23" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="04" id="04" type="text" size="1" maxlength="1"></p></td>
<td><input name="14" id="14" type="text" size="1" maxlength="1"></p></td>
<td><input name="24" id="24" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="05" id="05" type="text" size="1" maxlength="1"></p></td>
<td><input name="15" id="15" type="text" size="1" maxlength="1"></p></td>
<td><input name="25" id="25" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
<td>
<table border="0">
<tr>
<td><input name="33" id="33" type="text" size="1" maxlength="1"></p></td>
<td><input name="43" id="43" type="text" size="1" maxlength="1"></p></td>
<td><input name="53" id="53" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="34" id="34" type="text" size="1" maxlength="1"></p></td>
<td><input name="44" id="44" type="text" size="1" maxlength="1"></p></td>
<td><input name="54" id="54" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="35" id="35" type="text" size="1" maxlength="1"></p></td>
<td><input name="45" id="45" type="text" size="1" maxlength="1"></p></td>
<td><input name="55" id="55" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
<td>
<table border="0">
<tr>
<td><input name="63" id="63" type="text" size="1" maxlength="1"></p></td>
<td><input name="73" id="73" type="text" size="1" maxlength="1"></p></td>
<td><input name="83" id="83" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="64" id="64" type="text" size="1" maxlength="1"></p></td>
<td><input name="74" id="74" type="text" size="1" maxlength="1"></p></td>
<td><input name="84" id="84" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="65" id="65" type="text" size="1" maxlength="1"></p></td>
<td><input name="75" id="75" type="text" size="1" maxlength="1"></p></td>
<td><input name="85" id="85" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
</tr>
<tr>
<td>
<table border="0">
<tr>
<td><input name="06" id="06" type="text" size="1" maxlength="1"></p></td>
<td><input name="16" id="16" type="text" size="1" maxlength="1"></p></td>
<td><input name="26" id="26" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="07" id="07" type="text" size="1" maxlength="1"></p></td>
<td><input name="17" id="17" type="text" size="1" maxlength="1"></p></td>
<td><input name="27" id="27" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="08" id="08" type="text" size="1" maxlength="1"></p></td>
<td><input name="18" id="18" type="text" size="1" maxlength="1"></p></td>
<td><input name="28" id="28" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
<td>
<table border="0">
<tr>
<td><input name="36" id="36" type="text" size="1" maxlength="1"></p></td>
<td><input name="46" id="46" type="text" size="1" maxlength="1"></p></td>
<td><input name="56" id="56" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="37" id="37" type="text" size="1" maxlength="1"></p></td>
<td><input name="47" id="47" type="text" size="1" maxlength="1"></p></td>
<td><input name="57" id="57" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="38" id="38" type="text" size="1" maxlength="1"></p></td>
<td><input name="48" id="48" type="text" size="1" maxlength="1"></p></td>
<td><input name="58" id="58" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
<td>
<table border="0">
<tr>
<td><input name="66" id="66" type="text" size="1" maxlength="1"></p></td>
<td><input name="76" id="76" type="text" size="1" maxlength="1"></p></td>
<td><input name="86" id="86" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="67" id="67" type="text" size="1" maxlength="1"></p></td>
<td><input name="77" id="77" type="text" size="1" maxlength="1"></p></td>
<td><input name="87" id="87" type="text" size="1" maxlength="1"></p></td>
</tr>
<tr>
<td><input name="68" id="68" type="text" size="1" maxlength="1"></p></td>
<td><input name="78" id="78" type="text" size="1" maxlength="1"></p></td>
<td><input name="88" id="88" type="text" size="1" maxlength="1"></p></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
Kann man sowas in einer Schleife Packen? Gibt es eine Möglichkeit sowas direkt in javascript zu machen? |
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7180
|
Finde es genial wie detailiert du daran arbeitest
Ja man kann eine Variable global deklarieren indem man das var vorher weglässt, ist aber etwas unschön, deswegen die Empfehlung außerhalb von function einfach 'var ende;' zu notieren, damit richtest du die Variable global ein und es ist leichter nachvollziehbar. Nun zur Eingabe. Das Attribut 'name' kannste weglassen, das ist nur hilfreich wenn du die Elemente gruppieren möchtest. Um auf die Werte eines Eingabefeldes zuzugreifen nutzt du document.getElementById(ID).value , da du die Ids sinnvoll geordnet hast kannst du auch mit einer Schleife arbeiten. Lass einfach zwei Schleifen ineinander verschachtelt von 0 nach 8 zählen und erzeug bei jedem Durchgang eine Variable in der du die beiden Zähler als String verbindest, diese Variable kannst du dann für ID einsetzen. |
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7181
|
ja wenn ich was mache dann soll es ordentlich sein. wer weis wofür es noch mal gut ist. bewerbungsmappen etc.
Irgendwie finde ich noch keinen richtigen start wie document.getElementById(ID).value einsetze. |
|
|
Rekusive Funktion 2 Jahre, 10 Monate her #7182
|
var ID;
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
ID = i + "" + j;
Feld[i][j][0] = document.getElementById(ID).value;
}
}Kann sein das du die beiden Zählvariablen noch vertauschen musst damit die Zuordnung in Spalte und Zeile am Ende stimmt, aber so in der Art sollte es gehen. |
|
|
Ladezeit der Seite: 0.36 Sekunden

Forum