Sudoku in PHP

Hi,
ich habe ein Problem mit dem erstellen eines Sudokus.
Die Zahlen einzutragen ist kein Problem , aber eine Lösungsmaske zu erstellen um anschließend abzufragen ob die eingaben des Benutzers denn stimmen ist bei mir rein ohne erfolg.

Mein erster Versuch klappte einwandfrei bei einen 2x2feldrigen sudoku , aber beim klassischen 3x3feldrigen ist die Meldung gekommen "Seite kann nicht angezeigt werden" unter Vista stürzt dann sogar kurzzeitig der Apache HTTP server von XAMPP ab.

Mein zweiter ansatz ist gänzlich ohne erfolg gewesen... Mitlerweile bin ich bei folgenden Ansatz angelangt...

PHP:
<?php
function create_sudoku($size)
{
	$how_much_to_show=$size*$size-1;
	for ($counter=1;$counter<=$how_much_to_show+1;$counter++)
	{
		$x=rand(0,$size*$size-1);
		$y=rand(0,$size*$size-1);
		$_SESSION[anzeigeX][]=$x;
		$_SESSION[anzeigeY][]=$y;
		$zahl[$x][$y]=$counter;
		
	}
	$_SESSION[feld]=$zahl;
	fill_sudoku($size,$_SESSION[feld]);
}
function fill_sudoku($size,$feld)
{
	$newsize=$size*$size;
	$check = true;
	for ($eintrag =1 ; $eintrag <= $newsize;$eintrag++) // Zahl die in die Zellen kommt
	{
		for ($i = 0 ; $i <= $newsize-1 ; $i++) //X		->
		{
			for ($j = 0 ; $j <= $newsize-1 ; $j++)//Y  	|
			{									 // 	V
				if ($feld[$i][$j]== null )  // wenn Feld leer
				{
					for ($z = 0 ; $z <= $newsize-1;$z++) 
					{
						if ($feld[$i][$z]==$eintrag) // Vergleiche X
						{
							$check = false;
							$j++;
						}
						if ($feld[$z][$j]==$eintrag)//	Vergleiche Y
						{
							$check = false;
							$i++;
						}
						// Vergleiche BOX
						$i1 = round(($i-1) / 3)*3 + 1; 
						$j1 = round(($j-1) / 3)*3 + 1;
						for ($i2=$i1; $i2 <= $i1+2;$i2++) // hohe auslastung beim 3x3feld
						{
							for ($j2=$j1; $j2 <= $j1+2;$j2++)
							{
								if ($feld[$i2][$j2]==$eintrag)
								{
									$check = false;
									$i++;
								}
							}
						}
						if(($check == true))
						{
							$_SESSION[feld][$i][$j]=$eintrag;
							$i=0;
							$j=0;
						}	
					}

				}
			}
		}
	}
}

size ist dabei ein Wert den ich anfangs übergebe um zu sagen wie groß das sudokufeld sein soll.
2 ist also ein 2x2feldriges Sudoku und 3 ein 3x3feldriges

Die Anzeige des Feldes läuft getrennt in einer view ab (aber dort liegt kein problem)
 
Hi

ich vermute mal das einfach ein Timeout vorliegt, also das php zulange dafür braucht.
Was mir aufgefallen ist:
PHP:
$how_much_to_show=$size*$size-1; //1
    for ($counter=1;$counter<=$how_much_to_show+1;$counter++)//2
    {//3
        $x=rand(0,$size*$size-1);//4
        $y=rand(0,$size*$size-1);        //5
    }
Wofür ziehst du in Zeile 1, 1 von $size² ab? und rechnest in Zeile 2 wieder 1 dazu.
Wolltest du da nicht eher sowas machen?
PHP:
$how_much_to_show=$size*($size-1); //1
    for ($counter=1;$counter<=$how_much_to_show+1;$counter++)//2
    {//3
        $x=rand(0,$size*($size-1));//4
        $y=rand(0,$size*($size-1));        //5
    }
 
Ich habe nun ein wenig weiter daran rumprogrammiert aber das feld das dabei rauskommt wiederspricht jeglichen Regeln des Sudokus.Allerdings sehe ich nicht wo der Fehler liegt ... hier der Code:

Diese Funktion legt das Sudoku an
PHP:
function create_sudoku($size)
{
	$how_much_to_show=$size*$size;
	for ($counter=1;$counter<=$how_much_to_show;$counter++)
	{
		$x=rand(0,$size*$size-1);
		$y=rand(0,$size*$size-1);
		$_SESSION[anzeigeX][]=$x;
		$_SESSION[anzeigeY][]=$y;
		$zahl[$x][$y]=$counter;
		
	}
	$_SESSION[feld]=$zahl;
	create_checkarray($size);
	print_r($_SESSION[feld]);
	fill_sudoku($size,$_SESSION[feld]);
}
Und diese sollen den Rest füllen:
PHP:
function check_spalte($feld,$size,$x,$eintrag)
{ 
	$possible = true;
	for ($z = 0 ; $z <= $size*$size-1;$z++) 
	{
		if ($feld[$x][$z]==$eintrag) // Vergleiche Y
		{
			$possible = false;
		}
	}

	return $possible;
}
function check_zeile($feld,$size,$y,$eintrag)
{
	$possible = true;
	for ($z = 0 ; $z <= $size*$size-1;$z++) 
	{
		if ($feld[$z][$y]==$eintrag)//	Vergleiche X
		{
			$possible = false;
		}
	}		
	return $possible;
}
function check_block($feld,$size,$x,$y,$eintrag)
{
	// Vergleiche BOX
	$possible = true;
	$i1 = (int)(($x-1) / $size)*$size; 
	$j1 = (int)(($y-1) / $size)*$size;
	for ($i2=$i1; $i2 <= $i1+2;$i2++) // hohe auslastung beim 3x3feld
	{
		for ($j2=$j1; $j2 <= $j1+2;$j2++)
		{
			if ($feld[$i2][$j2]==$eintrag)
			{
				$possible = false;
			}
		}
	}
	return $possible;					
}
function fill_sudoku($size,$feld)
{
	for($eintrag=1;$eintrag<=$size*$size;$eintrag++)
	{

		for ($x = 0 ; $x <= $size*$size-1 ; $x++) //X		->
		{
			for ($y = 0 ; $y <= $size*$size-1 ; $y++)//Y  	|
			{								    // 	      V
				if ($feld[$x][$y]== 0 )  // wenn Feld leer
				{
					if ((check_spalte($feld,$size,$x,$eintrag)==true)
					&&(check_zeile	($feld,$size,$y,$eintrag)==true)
					&&(check_block($feld,$size,$x,$y,$eintrag)==true))
					{ 
						$feld[$x][$y] = $eintrag;
						$_SESSION[feld][$x][$y]= $eintrag;
						print_r($_SESSION[feld]);
					}
						
				}
			}
		}
	}
}

Allerdings wird es auf eine regelverstoßende Art und Weise gefüllt.

EDIT : Nach näheren untersuchen der Abfragen hab ich festgestellt das sich check_spalte und check_zeile gegenseitig stören , aber wiedermal weiss ich nicht wieso... eigtl müssten sie doch zusammenarbeiten
 
Zuletzt bearbeitet:
Zurück