Solohalma Lösungen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Joarden, 5. Juni 2007 .

Schlagworte:
  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.
    Bild

    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:
    <? PHP
    set_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
     
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.