Themm: Fehler in einer Auswertung

Hi euch allen :D,
ich hab´ ein kleines Problem: Ich habe einen Code für ein Mastermind-Spiel geschrieben, er funktioniert aber nicht vollständig - egal was man anwählt man bekommt die Meldung: "Herzlichen Glückwunsch, Sie haben gewonnen!", obwohl dies nicht (immer) stimmt.

Warum funktioniert er nicht richtig?? Bitte helft mir!!

Hier ist der Code:

[code lang=html]  
<form action="" method="post" name="color[]">  
<input type="submit" value="Nächster Versuch"><br>  
<label for="p1">Position 1:</label>  
<select name="p1" size="1" id="p1">  
<option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
</select><br>  
<label for="p2">Position 2:</label>  
<select name="p2" size="1" id="p2">  
<option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
</select><br>  
<label for="p3">Position 3:</label>  
<select name="p3" size="1" id="p3">  
<option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
</select><br>  
</form>  
<?php  
$colo1 = mt_rand(1,4);  
$colo2 = mt_rand(1,4);  
$colo3 = mt_rand(1,4);  
if($colo1 == 1){  
$color1 = "yellow"; }  
elseif($colo1 == 2){  
$color1 = "red"; }  
elseif($colo1 == 3){  
$color1 = "green"; }  
else{ $color1 = "blue"; }  
if($colo2 == 1){  
$color2 = "yellow"; }  
elseif($colo2 == 2){  
$color2 = "red"; }  
elseif($colo2 == 3){  
$color2 = "green"; }  
else{ $color2 = "blue"; }  
if($colo3 == 1){  
$color3 = "yellow"; }  
elseif($colo3 == 2){  
$color3 = "red"; }  
elseif($colo3 == 3){  
$color3 = "green"; }  
else{ $color3 = "blue"; }  
$d = 0;  
$b = 0;  
$format = "Es sind %d Farben (auf %d Positionnen) richtig.";  
if(isset($_POST["color[]"])){  
if($_POST["color[p1]"] == $color1 || $_POST["color[p1]"] == $color2 || $_POST["color[p1]"] == $color3){  
$d++;  
if($_POST["color[p2]"] == $color1 || $_POST["color[p2]"] == $color2 || $_POST["color[p2]"] == $color3){  
$d++;  
if($_POST["color[p3]"] == $color1 || $_POST["color[p3]"] == $color2 || $_POST["color[p3]"] == $color3){  
$d++;  
}else{}}else{}}else{}  
if($_POST["color[p1]"] == $color1){  
$b++;  
if($_POST["color[p2]"] == $color2){  
$b++;  
if($_POST["color[p3]"] == $color3){  
$b++;  
}else{}}else{}}else{}  
}else{}  
if( $d = 3 && $b = 3){  
echo "Herzlichen Glückwunsch, Sie haben gewonnen!"; }  
else{ printf($format,$d,$b); }  

~~~[/code]  

  1. Hallo Themm,

    hier weist du den Variablen $d und $b den Wert 3 zu.

    if( $d = 3 && $b = 3){

    Für einen Vergleich müsstest du zwei (insgesamt 4) Gleichheitszeichen verwenden. Insgesamt solltest du nochmal prüfen, ob du alle Klammern und Tags wieder schließt.

    1. Danke euch beiden, jetzt bin ich einen Schritt weiter (neuer Fehler)...der alte entstand wohl, weil ich zu schnell gearbeitet habe.
      Nun erscheint egal, was ich tu´ immer: "Es sind 0 Farben (auf 0 Positionnen) richtig." - Das b++ und d++ funktioniert also nicht richtig, woran könnte das liegen???

  2. if( $d = 3 && $b = 3){
    echo "Herzlichen Glückwunsch, Sie haben gewonnen!"; }
    else{ printf($format,$d,$b); }
    [/code][/code]

    Hi,
    habe es nur kurz überflogen, aber bist Du dir sicher das in der oben aufgeführten "If-Abfrage" kein doppeltes = hin muss? So weißt Du den Variablen den Wert zu und es ist natürlich immer richtig
    Gruß
    Tunnel85

  3. Hallo,

    }else{}}else{}}else{}

    lustig, was sollen die leeren else-Blöcke da?

    if($_POST["color[p1]"] == $color1){
    if($_POST["color[p2]"] == $color2){
    if($_POST["color[p3]"] == $color3){

    Dein Formular hat keine Elemente mit den Namen "color[p1]"; "color[p2]" und "color[p3]", sondern nur mit den Namen "p1", "p2" und "p3".

    if( $d = 3 && $b = 3)

    Okay, das ist ja schon geklärt.

    Ciao,
     Martin

    --
    Letztlich basiert alles auf dem Feuer, dem Rad, der Eins und der Null.
      (Gernot Back)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo,

      }else{}}else{}}else{}

      lustig, was sollen die leeren else-Blöcke da?

      Die müssen doch zu jeder if-Verzweigung gegeben werden, oder irre ich mich? ;)

      if($_POST["color[p1]"] == $color1){
      if($_POST["color[p2]"] == $color2){
      if($_POST["color[p3]"] == $color3){

      Dein Formular hat keine Elemente mit den Namen "color[p1]"; "color[p2]" und "color[p3]", sondern nur mit den Namen "p1", "p2" und "p3".

      if( $d = 3 && $b = 3)

      Okay, das ist ja schon geklärt.

      Beides geändert und es funktioniert immer noch nicht!!

      1. Hi,
        wie greift man denn auf ein mehrdimensionales Array zu? Schau mal hier.

        Im Falle von Fehlern sollte man das Script erstmal "runterreduzieren" und sich vllt. mal die Daten ausgeben lassen, wie z.B. $_POST["color[p1]"] und gucken was uns PHP sagt.

        Grüße
        Tunnel85

        1. Mein Code sieht jetzt so aus und funktioniert immernoch nicht...Hilfe!!:

          <form action="" method="post" name="color">  
          <input type="submit" value="Nächster Versuch"><br>  
          <label for="p1">Position 1:</label>  
          <select name="p1" size="1" id="p1">  
          <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
          </select><br>  
          <label for="p2">Position 2:</label>  
          <select name="p2" size="1" id="p2">  
          <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
          </select><br>  
          <label for="p3">Position 3:</label>  
          <select name="p3" size="1" id="p3">  
          <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
          </select><br>  
          </form>  
          <?php  
          $colo1 = mt_rand(1,4);  
          $colo2 = mt_rand(1,4);  
          $colo3 = mt_rand(1,4);  
          if($colo1 == 1){  
          $color1 = "yellow"; }  
          elseif($colo1 == 2){  
          $color1 = "red"; }  
          elseif($colo1 == 3){  
          $color1 = "green"; }  
          else{ $color1 = "blue"; }  
          if($colo2 == 1){  
          $color2 = "yellow"; }  
          elseif($colo2 == 2){  
          $color2 = "red"; }  
          elseif($colo2 == 3){  
          $color2 = "green"; }  
          else{ $color2 = "blue"; }  
          if($colo3 == 1){  
          $color3 = "yellow"; }  
          elseif($colo3 == 2){  
          $color3 = "red"; }  
          elseif($colo3 == 3){  
          $color3 = "green"; }  
          else{ $color3 = "blue"; }  
          $format = "Es sind %d Farben (auf %d Positionnen) richtig.";  
          if(isset($_POST["color"])){  
          if($_POST["p1"] == $color1 || $_POST["p1"] == $color2 || $_POST["p1"] == $color3){  
          $d++;  
          if($_POST["p2"] == $color1 || $_POST["p2"] == $color2 || $_POST["p2"] == $color3){  
          $d++;  
          if($_POST["p3"] == $color1 || $_POST["p3"] == $color2 || $_POST["p3"] == $color3){  
          $d++;  
          }else{}}else{}}else{}  
          if($_POST["p1"] == $color1){  
          $b++;  
          if($_POST["p2"] == $color2){  
          $b++;  
          if($_POST["p3"] == $color3){  
          $b++;  
          }else{}}else{}}else{}  
          }else{}  
          if( $d == 3 && $b == 3){  
          echo "Herzlichen Glückwunsch, Sie haben gewonnen!"; }  
          else{ printf($format,$d,$b); }
          
          1. Kann ja auch nicht funktionieren, weil $_POST['color'] ja jetzt nicht existiert.

            Zur Fehlerbehebung lassen wir uns am Anfang des Scriptes mal $_POST ausgeben.

              
            echo '<pre>';  
            print_r($_POST);  
            echo '</pre>';  
            
            

            Und dann schauen wir uns an was das Formular liefert.

            Ein S_POST['color'] sehe ich dort nicht.

            1. Das wird ausgeliefert:

              Array
              (
                  [p1] => yellow
                  [p2] => yellow
                  [p3] => yellow
              )

              1. Richtig,
                also kann Deine Abfrage if(isset($_POST["color"])){ ja auch nicht klappen, oder?

                1. Richtig,
                  also kann Deine Abfrage if(isset($_POST["color"])){ ja auch nicht klappen, oder?

                  Also müsste dort:
                  if(isset($_POST["p1"] && $_POST["p2"] && $_POST["p3"]
                  stehen, oder??

                  1. Ja, wir kommen der Sache näher :-)

                    1. Ja, wir kommen der Sache näher :-)

                      Sehr nahe sogar. Hier der Codeschnipsel, mit dem es klappt: if(isset($_POST["p1"]) && isset($_POST["p2"]) && isset($_POST["p3"])){

                      Nur ein Problem habe ich noch (die Auswertung funktioniert - das ist nicht das Problem). Aber jedes Mal nachdem ich auf dem "Nächster Versuch"-Button klicke werden die Zufallszahlen neu erstellt. Mit einem Button daneben:

                      <form action="" name="new"><input type="submit value="Neues Spiel"></form>  
                      <form action="" method="post" name="color">  
                      <input type="submit" value="Nächster Versuch"><br>  
                      <label for="p1">Position 1:</label>  
                      <select name="p1" size="1" id="p1">  
                      <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
                      </select><br>  
                      <label for="p2">Position 2:</label>  
                      <select name="p2" size="1" id="p2">  
                      <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
                      </select><br>  
                      <label for="p3">Position 3:</label>  
                      <select name="p3" size="1" id="p3">  
                      <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
                      </select><br>  
                      </form>
                      

                      wird aber automatisch ein Zeilenumbruch erzeugt, der das Design (wohlgepflegt ;) ) zerstört.

                      Wie kann ich diesen Umbruch verhindern??

                      1. Ja, wir kommen der Sache näher :-)

                        Sehr nahe sogar. Hier der Codeschnipsel, mit dem es klappt:

                        Wie kann ich diesen Umbruch verhindern??

                        Stell doch dazu mal den ganzen Quelltext online, oder lade es irgendwo auf einen Server, damit ich mir das ganze anschauen kann.

                        Kann das Problem sonst leider nicht erkennen

                        gruß
                        tunnel85

                        1. Hier ist der Code (noch ohne Verarbeitung des NEW-Buttons) und ich habe noch ein Problem: 1. Die Verarbeitung ist nicht korrekt (z.B. bei
                          Es ist angegeben: "Gelb - Gelb - Gelb"
                          Es wird benötigt: "Rot - Gelb - Gelb"
                          Es erscheint: "Es sind 3 Farben (auf 0 Positionnen) richtig."
                          Korrekt wäre: "Es sind 2 Farben (auf 2 Positionen) richtig."
                          2.

                          <form action="" method="post" name="new"><input type="button" value="Neues Spiel"></form>  
                          <form action="" method="post" name="color">  
                          <input type="submit" value="Nächster Versuch"><br>  
                          <label for="p1">Position 1:</label>  
                          <select name="p1" size="1" id="p1">  
                          <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
                          </select><br>  
                          <label for="p2">Position 2:</label>  
                          <select name="p2" size="1" id="p2">  
                          <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
                          </select><br>  
                          <label for="p3">Position 3:</label>  
                          <select name="p3" size="1" id="p3">  
                          <option value="yellow">Gelb</option><option value="red">Rot</option><option value="green">Grün</option><option value="blue">Blau</option>  
                          </select>  
                          </form>  
                          <?php  
                          $colo1 = mt_rand(1,4);  
                          $colo2 = mt_rand(1,4);  
                          $colo3 = mt_rand(1,4);  
                          if($colo1 == 1){  
                          $color1 = "yellow"; }  
                          elseif($colo1 == 2){  
                          $color1 = "red"; }  
                          elseif($colo1 == 3){  
                          $color1 = "green"; }  
                          else{ $color1 = "blue"; }  
                          if($colo2 == 1){  
                          $color2 = "yellow"; }  
                          elseif($colo2 == 2){  
                          $color2 = "red"; }  
                          elseif($colo2 == 3){  
                          $color2 = "green"; }  
                          else{ $color2 = "blue"; }  
                          if($colo3 == 1){  
                          $color3 = "yellow"; }  
                          elseif($colo3 == 2){  
                          $color3 = "red"; }  
                          elseif($colo3 == 3){  
                          $color3 = "green"; }  
                          else{ $color3 = "blue"; }  
                          $format = "Es sind %d Farben (auf %d Positionnen) richtig.";  
                          if(isset($_POST["p1"]) && isset($_POST["p2"]) && isset($_POST["p3"])){  
                          if($_POST["p1"] == $color1 || $_POST["p1"] == $color2 || $_POST["p1"] == $color3){  
                          $d++;  
                          if($_POST["p2"] == $color1 || $_POST["p2"] == $color2 || $_POST["p2"] == $color3){  
                          $d++;  
                          if($_POST["p3"] == $color1 || $_POST["p3"] == $color2 || $_POST["p3"] == $color3){  
                          $d++;  
                          }else{}}else{}}else{}  
                          if($_POST["p1"] == $color1){  
                          $b++;  
                          if($_POST["p2"] == $color2){  
                          $b++;  
                          if($_POST["p3"] == $color3){  
                          $b++;  
                          }else{}}else{}}else{}  
                          }else{}  
                          if( $d == 3 && $b == 3){  
                          echo "Herzlichen Glückwunsch, Sie haben gewonnen!"; }  
                          else{ printf($format,$d,$b); }
                          
                          1. Also erstmal zu dem Thema, das sich die Werte immer ändern:
                            Jedes mal wenn Du das Script neu lädts(was ja über das abschicken des Formulars passiert), werden natürlich die Variablen über mt_rand() neu gesetzt. Um diese zwischen zu speichern wäre es meiner Meinung sinnvoll, Dich mit dem Session-Management ausseinander zusetzen. Sollte es nur für Dich sein, würde es IMHO reichen, wenn Du beim ersten Aufruf der Seite die gegebenen farben in versteckte Formularfelder setzt und diese dann jeweils bei jedem absenden des Formulars mit übergibst.

                            Die Lösung zur richtigen Verarbeitung ist nicht programmiertechnisch, sondern logisch zu bewältigen. Solltest Du programmiertechnisch soweit sein, das ganze umzusetzen, bin ich Dir natürlich gerne dabei behilflich, des Rätsels Lösung zu finden, aber bis dahin solltest Du dich vllt. ein wenig mit der Materie PHP beschäftigen. Hilfreich hierzu evtl.: Quake Tutorial

                            Bis dahin alles gute

                            Gruß

                            Tunnel85

  4. Hi euch allen :D,
    ich hab´ ein kleines Problem: Ich habe einen Code

    *Schüttel* Schrecklicher Code. Grauslig. Bringt man sowas nur mit PHP zustande? Ich denke, nein.

    1. Hi euch allen :D,
      ich hab´ ein kleines Problem: Ich habe einen Code

      *Schüttel* Schrecklicher Code. Grauslig. Bringt man sowas nur mit PHP zustande? Ich denke, nein.

      Und wieder einen herzlichen Dank an die Leute mit den sinnvollen Kommentaren.
      Es ist echt faszinierend, wie manche Leute einfach nichts mit Ihrer Zeit anzufangen haben. Danke dafür!

      Gruß
      Tunnel85