#1 5. Juni 2007 Hallo, Ich bin grade dabei ein kleines PHP proggie zu schreiben um alle Lösungen eines Solohalma Spiels ausgeben zu lassen. Was ist Solohalma? Gegeben ist ein Spielbrett in Kreuzform mit 33 Löchern, in denen 32 Stäbchen stecken. Das Loch in der Mitte ist leer. Man muss nacheinander die Stäbchen entfernen, indem man sie in waagerechter oder senkrechter Richtung überspringt. Am Ende muss ein Stäbchen in der Mitte übrigbleiben. Es geht darum, pro Sprung einen Spielstein genau einen daneben liegenden überspringen zu lassen, der dadurch „gelöscht“ wird. Steine dürfen nur in Zeilen und Spalten, nicht jedoch diagonal springen. Nur ein Stein soll übrig bleiben, und dies an einem vorgegebenen Platz, meist in der Brettmitte. Meine bisherigen Versuche.. PHP: <? PHPset_time_limit ( 10000 ); $feld = array(); for ( $i = 0 ; $i < 7 ; $i ++) //zeile for ( $j = 0 ; $j < 7 ; $j ++) //spalte $feld [ $i ][ $j ] = 1 ; //Felder die nicht zum Spielfeld gehören $feld [ 0 ][ 0 ] = 0 ; $feld [ 0 ][ 1 ] = 0 ; $feld [ 1 ][ 0 ] = 0 ; $feld [ 1 ][ 1 ] = 0 ; $feld [ 0 ][ 5 ] = 0 ; $feld [ 0 ][ 6 ] = 0 ; $feld [ 1 ][ 5 ] = 0 ; $feld [ 5 ][ 0 ] = 0 ; $feld [ 5 ][ 1 ] = 0 ; $feld [ 6 ][ 0 ] = 0 ; $feld [ 6 ][ 1 ] = 0 ; $feld [ 5 ][ 5 ] = 0 ; $feld [ 5 ][ 6 ] = 0 ; $feld [ 6 ][ 5 ] = 0 ; $feld [ 6 ][ 6 ] = 0 ; $feld [ 3 ][ 3 ] = 2 ; // Leeres Startfeld function setzen (& $feld ){ for ( $x = 0 ; $x < 7 ; $x ++) //Zeilendurchlauf { for ( $y = 0 ; $y < 7 ; $y ++) //Spaltendurchlauf { if ( $feld [ $x ][ $y ] == 2 ) //Wenn feld Leer ist... { if ( $feld [ $x + 2 ][ $y ] == 1 ) //Überprüfe ob 2 Felder auf der über dem leeren ein //Stein liegt { if ( $feld [ $x + 1 ][ $y ] == 1 ) { $feld [ $x + 2 ][ $y ] = 2 ; $feld [ $x + 1 ][ $y ] = 2 ; $feld [ $x ][ $y ] = 1 ; if ( setzen ( $feld )) ; echo 'Sprung von ' . ( $x + 2 ) . '/' . $y . ' auf ' . $x . '/' . $y . ' möglich.<br><br>' ; return true else { $feld [ $x + 2 ][ $y ] = 1 ; $feld [ $x + 1 ][ $y ] = 1 ; $feld [ $x ][ $y ] = 2 ; } } if ( $feld [ $x ][ $y + 2 ] == 1 ) //Überprüfe ob 2 Felder auf der über dem leeren Feld ein //Stein liegt { if ( $feld [ $x ][ $y + 1 ] == 1 ) { $feld [ $x ][ $y + 2 ] = 2 ; $feld [ $x ][ $y + 1 ] = 2 ; $feld [ $x ][ $y ] = 1 ; if ( setzen ( $feld )) ; echo 'Sprung von ' . ( $x ) . '/' . ( $y + 2 ) . ' auf ' . $x . '/' . $y . ' möglich.<br><br>' ; return true else { $feld [ $x ][ $y + 2 ] = 1 ; $feld [ $x ][ $y + 1 ] = 1 ; $feld [ $x ][ $y ] = 2 ; } } if ( $feld [ $x - 2 ][ $y ] == 1 ) //Überprüfe ob 2 Felder über dem leeren Feld ein Stein //liegt { if ( $feld [ $x - 1 ][ $y ] == 1 ) { $feld [ $x - 2 ][ $y ] = 2 ; $feld [ $x - 1 ][ $y ] = 2 ; $feld [ $x ][ $y ] = 1 ; if ( setzen ( $feld )) echo 'Sprung von ' . ( $x - 2 ) . '/' . $y . ' auf ' . $x . '/' . $y . ' möglich.<br><br>' ; return true else { $feld [ $x - 2 ][ $y ] = 1 ; $feld [ $x - 1 ][ $y ] = 1 ; $feld [ $x ][ $y ] = 2 ; } } if ( $feld [ $x ][ $y - 2 ] == 1 ) //Überprüfe ob 2 Felder auf der über dem leeren Feld ein //Stein liegt { if ( $feld [ $x ][ $y - 1 ] == 1 ) { $feld [ $x ][ $y - 2 ] = 2 ; $feld [ $x ][ $y - 1 ] = 2 ; $feld [ $x ][ $y ] = 1 ; if ( setzen ( $feld )) echo 'Sprung von ' . ( $x ) . '/' . ( $y - 2 ) . ' auf ' . $x . '/' . $y . ' möglich.<br><br>' ; return true else { $feld [ $x ][ $y - 2 ] = 1 ; $feld [ $x ][ $y - 1 ] = 1 ; $feld [ $x ][ $y ] = 2 ; } } } } }}} function backtracking ( $feld , $x , $y ){ $feld [ $x ][ $y ] = 2 ; if ( $feld [ $x ][ $y - 2 ]){ $feld [ $x ][ $y - 2 ] = 1 ; $feld [ $x ][ $y - 1 ] = 1 ;}elseif ( $feld [ $x + 2 ][ $y ]){ $feld [ $x + 2 ][ $y ] = 1 ; $feld [ $x + 1 ][ $y ] = 1 ;}elseif ( $feld [ $x ][ $y + 2 ]){ $feld [ $x ][ $y + 2 ] = 1 ; $feld [ $x ][ $y + 1 ] = 1 ;}elseif ( $feld [ $x - 2 ][ $y ]){ $feld [ $x - 2 ][ $y ] = 1 ; $feld [ $x - 1 ][ $y ] = 1 ;}} setzen ( $feld ) ?> Wie ihr sieht setze ich die belegten Felder auf 1 und die nicht belegten Felder auf 2. Das ich die Backtracking funktion noch einbauen muss ist mir klar jedoch weiss ich nicht wo. Wenn ich das "return true else" entferne gibt er mir sehr viele ergebnisse wieder jedoch alle möglichen Züge, ich möchte jedoch nur Züge für EIN Spiel. Falls ihr noch Fragen habt oder euch was unklar ist fragt mich einfach hier im Thread, ich hoffe mir kann jemand mit meinem Problem weiterhelfen Gruß Joarden + Multi-Zitat Zitieren